Les jetons ServiceAccount authentifient la communication entre les pods et le serveur API Kubernetes. L'approche traditionnelle stocke ces jetons dans des Secrets et les monte sous forme de fichiers, exposant ainsi les pods à des attaques par usurpation d'identité, à une élévation de privilèges et à des jetons obsolètes qui n'expirent jamais. La projection de volume de jetons ServiceAccount élimine ces risques en montant directement des jetons à durée de vie limitée et liés à une audience spécifique en tant que volumes projetés, sans dépendre des Secrets.
Contexte
Les jetons ServiceAccount traditionnels présentent quatre faiblesses structurelles en matière de sécurité :
Audience non liée : les JSON Web Tokens (JWT) ne comportent aucune restriction
audience. Un jeton compromis peut ainsi être rejoué contre n'importe quel service du cluster, permettant des attaques par usurpation d'identité.Secrets surprivilégiés : les jetons sont stockés dans des Secrets et livrés sous forme de fichiers aux nœuds. Les jetons des composants système détiennent souvent des autorisations dépassant les besoins individuels des charges de travail, ce qui élargit la surface d'attaque.
Absence d'expiration : les JWT restent valides pendant toute la durée de vie du ServiceAccount. Leur rotation nécessite le remplacement manuel de la clé de signature, un processus que client-go n'automatise pas.
Prolifération des Secrets : un Secret par ServiceAccount dégrade l'élasticité du cluster à grande échelle.
La projection de volume de jetons ServiceAccount résout ces quatre problèmes. Les jetons sont limités à une audience spécifique, expirent après une période configurable et sont automatiquement mis à jour par le kubelet, sans nécessiter de Secrets.
Fonctionnement
Lorsqu'un pod doté d'un volume de jeton ServiceAccount projeté démarre, le kubelet demande au serveur API un jeton signé à courte durée de vie et l'écrit dans le chemin de montage configuré à l'intérieur du conteneur. Le kubelet surveille le jeton et demande proactivement un remplacement avant son expiration. Il incombe à l'application de recharger le fichier de jeton lors de sa rotation ; un sondage toutes les cinq minutes suffit pour la plupart des charges de travail.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster managé ACK, un cluster dédié ACK ou un cluster Serverless ACK exécutant Kubernetes 1.20 ou une version ultérieure. Consultez les rubriques Créer un cluster managé ACK, Créer un cluster dédié ACK (obsolète) et Créer un cluster Serverless ACK.
-
La fonctionnalité de projection de volume de jetons ServiceAccount activée sur le cluster. Cette fonctionnalité est activée par défaut dans les clusters exécutant Kubernetes 1.22 ou une version ultérieure. Pour mettre à niveau, consultez la rubrique Mettre à niveau manuellement les clusters ACK.
Lorsqu'elle est activée, le serveur API et le controller-manager configurent automatiquement les paramètres de démarrage suivants :
Paramètre Description Valeur par défaut Configurable via la console service-account-issuerL'émetteur du jeton, mappé au champ issdans la charge utile JWThttps://kubernetes.default.svcOui api-audiencesIdentifiants API utilisés pour valider les jetons entrants. Séparez plusieurs valeurs par des virgules ( ,).https://kubernetes.default.svcOui service-account-signing-key-fileChemin d'accès à la clé privée utilisée pour signer les jetons /etc/kubernetes/pki/sa.keyNon (fixé à la valeur par défaut)
Étape 1 : Créer un ServiceAccount
Chaque namespace inclut un ServiceAccount default. Exécutez kubectl get serviceaccounts pour lister les comptes existants dans le namespace actuel.
Pour attribuer une identité distincte à un pod, créez un ServiceAccount dédié :
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
EOF
Vérifiez que le ServiceAccount a bien été créé :
kubectl get serviceaccounts/build-robot -o yaml
Étape 2 : Déployer un pod avec projection de volume de jetons
L'exemple suivant monte un jeton ServiceAccount projeté dans un pod nginx. Le jeton est limité à l'audience vault et expire après deux heures (7200 secondes).
-
Créez un fichier nommé
nginx.yaml:apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 name: nginx volumeMounts: - mountPath: /var/run/secrets/tokens name: vault-token serviceAccountName: build-robot volumes: - name: vault-token projected: sources: - serviceAccountToken: path: vault-token expirationSeconds: 7200 audience: vault -
Appliquez le manifeste :
kubectl apply -f nginx.yaml
Vérifier l'expiration du jeton
-
Confirmez que le pod est en cours d'exécution :
kubectl get pod nginxRésultat attendu :
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m15s -
Extrayez le jeton du conteneur :
kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-token -
Décodez le jeton et affichez son heure d'expiration :
cat vault-token | awk -F '.' '{print $2}' | base64 -d 2>/dev/null | jq '.exp' | xargs -I {} date -d @{}Exemple de résultat :
Mon Aug 26 15:45:59 CST 2024
Notes d'utilisation
Rotation des jetons : le kubelet effectue automatiquement la rotation du jeton avant son expiration. Configurez votre application pour qu'elle recharge le fichier de jeton selon une planification régulière ; un sondage toutes les cinq minutes suffit, indépendamment de la durée de vie réelle (TTL).
Compatibilité SDK : le rechargement automatique des jetons en Go nécessite une version de client-go égale ou supérieure à 10.0.0.
Autorisations de fichier : lorsque vous utilisez la projection de volume de jetons liés, les autorisations du fichier de jeton ServiceAccount passent de 644 à 600. Si fsGroup est défini dans le contexte de sécurité du pod, les autorisations sont définies sur 640.
Étapes suivantes
Configurer les autorisations RAM ServiceAccount pour le contrôle d'accès aux pods via RRSA : utilisez les rôles RAM pour les comptes de service (RRSA) afin d'appliquer des autorisations RAM au niveau des pods et de restreindre l'accès à des ressources cloud spécifiques.
Alibaba Cloud KMS pour le chiffrement des disques : chiffrez les clés secrètes Kubernetes dans les clusters ACK Pro à l'aide du service Key Management Service (KMS).
Configurer les comptes de service pour les pods : documentation amont Kubernetes sur la configuration des comptes de service.