Déploiement
github-sts peut être déployé avec Docker (cette page) ou avec le chart Helm sur Kubernetes. Pour Kubernetes, voir Kubernetes.
Docker
L’image officielle est publiée sur
ghcr.io/depthmark/github-sts,
construite à partir d’une base distroless avec un utilisateur non-root pour une surface d’attaque minimale. En production, fixez une version (par exemple 0.0.3) plutôt que latest.
# Run with config file
docker run -p 8080:8080 \
-v $(pwd)/config/github-sts.example.yaml:/etc/github-sts/config.yaml:ro \
-e GITHUBSTS_CONFIG_PATH=/etc/github-sts/config.yaml \
-e GITHUBSTS_APP_DEFAULT_APP_ID="$GITHUBSTS_APP_DEFAULT_APP_ID" \
-e GITHUBSTS_APP_DEFAULT_PRIVATE_KEY="$GITHUBSTS_APP_DEFAULT_PRIVATE_KEY" \
ghcr.io/depthmark/github-sts:0.0.3
# Run with env vars only
docker run -p 8080:8080 \
-e GITHUBSTS_CONFIG_PATH=/dev/null \
-e GITHUBSTS_APP_DEFAULT_APP_ID="$GITHUBSTS_APP_DEFAULT_APP_ID" \
-e GITHUBSTS_APP_DEFAULT_PRIVATE_KEY="$GITHUBSTS_APP_DEFAULT_PRIVATE_KEY" \
-e GITHUBSTS_OIDC_ALLOWED_ISSUERS="https://token.actions.githubusercontent.com" \
-e GITHUBSTS_OIDC_REQUIRED_AUDIENCE="https://sts.example.com" \
ghcr.io/depthmark/github-sts:0.0.3Pour construire depuis les sources : docker build -t github-sts:local . à la racine du dépôt, puis remplacez le nom d’image ci-dessus.
Binaires précompilés
Chaque version publie également des archives tar.gz du serveur pour Linux et
macOS sur amd64 et arm64, attachées à la
version GitHub.
Docker reste la méthode recommandée pour exécuter le serveur. Utilisez un binaire lorsqu’aucun environnement d’exécution de conteneurs n’est disponible, ou lorsque vous souhaitez exécuter le serveur directement sur un hôte.
Les archives contiennent uniquement le serveur, ce qui correspond à l’image de
conteneur. Le contrôle de révision github-sts-bundle est un outil de
construction plutôt qu’un composant déployé : il s’exécute directement depuis le
module à une version fixée, comme décrit sous « Revision promotion checks » dans
Configuration.
curl -sSLO "https://github.com/Depthmark/github-sts/releases/latest/download/github-sts_Linux_x86_64.tar.gz"
tar xzf github-sts_Linux_x86_64.tar.gz github-stsPour fixer une version plutôt que suivre la plus récente, remplacez
latest/download par download/v<version>. Les versions antérieures ne
publient que l’image de conteneur.
Le serveur n’accepte aucune option en ligne de commande. Il lit sa configuration
depuis GITHUBSTS_CONFIG_PATH et les variables d’environnement GITHUBSTS_*,
exactement comme les exemples Docker ci-dessus, et se termine sur une erreur de
validation lorsqu’un paramètre requis est absent. Voir
Configuration.
Vérifier une archive téléchargée
Chaque version porte deux garanties indépendantes de chaîne d’approvisionnement, et aucune des deux n’est vérifiée pour vous. Vérifiez les deux avant d’exécuter un binaire issu d’une version.
Vous avez besoin de cosign v3 ou
ultérieur et de la ligne de commande GitHub, authentifiée avec gh auth login.
Sur macOS, utilisez shasum -a 256 à la place de sha256sum : il n’a pas
d’équivalent à --ignore-missing, vérifiez donc une archive par son nom plutôt
que la liste entière.
La première garantie est une signature cosign sur checksums.txt. La
publication s’exécute dans un workflow réutilisable partagé, donc l’identité de
signature est ce workflow dans Depthmark/reusable-workflows, et non ce dépôt.
Vérifiez la liste d’empreintes, puis l’archive par rapport à cette liste :
BASE="https://github.com/Depthmark/github-sts/releases/latest/download"
curl -sSLO "${BASE}/checksums.txt"
curl -sSLO "${BASE}/checksums.txt.sigstore.json"
cosign verify-blob \
--bundle checksums.txt.sigstore.json \
--certificate-identity-regexp '^https://github.com/Depthmark/reusable-workflows/' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
checksums.txt
sha256sum --ignore-missing --check checksums.txtcosign verify-blob affiche Verified OK et se termine avec le code zéro en
cas de succès. Les deux options de certificat sont obligatoires pour la
vérification sans clé : cosign refuse de s’exécuter sans contrainte d’identité,
il n’y a donc aucun succès silencieux à craindre. Le risque réel est d’élargir
le motif, ce qui accepte les signatures d’autres workflows.
La seconde garantie est une attestation de provenance SLSA couvrant tous les artefacts listés dans ce fichier d’empreintes. Elle enregistre quel workflow, à quel commit, a produit l’archive :
gh attestation verify github-sts_Linux_x86_64.tar.gz \
--repo Depthmark/github-sts \
--signer-workflow Depthmark/reusable-workflows/.github/workflows/go-release.yml--repo est obligatoire. C’est --signer-workflow qui rattache l’attestation
au workflow de publication : sans cette option, le contrôle réussit encore pour
n’importe quel workflow de Depthmark/github-sts, ce qui est une garantie plus
faible que celle recherchée. La commande se termine avec un code non nul
lorsqu’aucune attestation ne correspond.
L’image de conteneur porte sa propre signature et sa propre provenance, produites par un autre workflow réutilisable, elle se vérifie donc avec une identité de signature différente. L’exécution de publication affiche les commandes pour l’image dans son résumé de tâche.
TLS et mTLS
github-sts prend en charge HTTPS et le mTLS nativement, mais ne gère pas les certificats. Le TLS est activé implicitement lorsqu’un certificat et une clé sont fournis ; ajoutez un bundle de CA clientes pour exiger les certificats clients.
server:
host: "0.0.0.0"
port: 8443
tls:
cert_file: /etc/github-sts/tls/tls.crt
key_file: /etc/github-sts/tls/tls.key
# client_ca_file: /etc/github-sts/tls/ca.crt # mTLS optionnelLancez-le en montant le certificat et la clé en lecture seule (le conteneur s’exécute en tant qu’utilisateur non-root, les fichiers doivent donc être lisibles par celui-ci) :
docker run -p 8443:8443 \
-v $(pwd)/config/github-sts.example.yaml:/etc/github-sts/config.yaml:ro \
-v $(pwd)/certs:/etc/github-sts/tls:ro \
-e GITHUBSTS_CONFIG_PATH=/etc/github-sts/config.yaml \
github-sts:localVérifiez :
curl --cacert certs/ca.crt https://localhost:8443/healthAvertissement : les certificats auto-signés sont réservés au développement local. Un certificat auto-signé (généré vous-même avec
openssl) convient aux tests sur votre machine, mais ne l’utilisez jamais en production. En production, les clients rejettent les certificats auto-signés à moins d’installer manuellement leur CA, ce qui est un anti-modèle de sécurité. En production, obtenez des certificats auprès d’une CA de confiance (cert-manager/Let’s Encrypt, votre PKI interne ou un service géré tel qu’AWS ACM ou Azure Key Vault) et terminez le TLS à l’ingress/Gateway lorsque cela est possible.
Pour les déploiements autonomes nécessitant le mTLS, ajoutez le bundle de CA clientes et exigez que les clients présentent un certificat signé par celle-ci. Consultez Configuration pour la référence TLS complète.
Liste de contrôle de production
Avant d’exposer github-sts publiquement :
-
oidc.allowed_issuersest défini avec la liste explicite des émetteurs que vous acceptez. -
oidc.required_audienceest défini avec une valeur unique à ce déploiement STS (par ex.https://sts.example.com). Le champaudience:de chaque politique de confiance lui correspond. -
jti.backendestredissi vous exécutez plus d’un réplica. - Les clés privées de la GitHub App sont montées depuis un magasin de secrets (Kubernetes Secret, Vault, cloud KMS), pas intégrées aux images ni aux fichiers d’environnement.
-
/healthet/readysont reliés aux sondes de vivacité/préparation. -
/metricsest collecté par Prometheus et les tableaux de bord sont en place. - Le journal d’audit est écrit dans un emplacement persistant et transmis à votre SIEM.
- Le TLS se termine à l’ingress/Gateway, ou le TLS/mTLS natif est activé avec des certificats émis par une CA (jamais auto-signés en production).
- Les limites de débit et de taille de requête sont configurées au niveau de l’ingress.