Associez kritis-validation-hook à Container Registry, Key Management Service (KMS) et Security Center afin d'imposer la vérification des signatures d'images au moment du déploiement. Seules les images signées par des autorités de confiance sont admises dans le cluster, ce qui réduit le risque d'exécuter des images de conteneur falsifiées ou non autorisées.
Fonctionnement
Quatre services collaborent pour assurer une signature et une vérification complètes des images :
| Service | Rôle |
|---|---|
| KMS | Génère et stocke la paire de clés RSA utilisée pour signer les images |
| Security Center | Gère les témoins (autorités de signature) et les politiques de sécurité qui associent un témoin à un namespace de cluster |
| Container Registry | Signe automatiquement les images transférées vers les namespaces activés en utilisant la clé KMS via le témoin configuré |
| kritis-validation-hook | S'exécute en tant que webhook d'admission dans votre cluster ACK et bloque le déploiement des images non signées ou non attestées |
Lorsque la vérification des signatures est active, toute demande de déploiement kubectl concernant une image non signée est refusée avant l'ordonnancement du pod.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK avec l'autorisation du cluster configurée. Pour plus d'informations, consultez la section Autoriser un cluster à accéder aux ressources
Une instance Alibaba Cloud Container Registry (ACR) Enterprise Edition dont le paramètre Instance Type est défini sur Advanced. Pour en créer une, cliquez sur Create ACR EE dans la console Container Registry et sélectionnez Advanced
Des images référencées par leur digest (format :
image@sha256:<hash>). Les images référencées par tag sont bloquées, même si elles sont signées
Étape 1 : Installer kritis-validation-hook
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, localisez le cluster que vous souhaitez gérer et cliquez sur son nom. Dans le volet de navigation de gauche, choisissez Operations > Add-ons.
Sur la page Add-ons, cliquez sur l'onglet Security, recherchez kritis-validation-hook et cliquez sur Install.
Étape 2 : Créer une clé de signature dans KMS
Créez une Customer Master Key (CMK) dans KMS pour l'utiliser lors de la signature des images. Pour obtenir des instructions, consultez la section Gérer une clé.
Définissez le paramètre Key Spec sur RSA_2048 et le paramètre Purpose sur Sign/Verify. Les autres spécifications de clé ou finalités ne sont pas prises en charge pour la signature d'images.
Étape 3 : Créer un témoin dans Security Center
Un témoin représente une autorité de signature de confiance. Les politiques de sécurité font référence aux témoins pour déterminer quelles images sont considérées comme fiables dans un namespace donné.
Connectez-vous à la console Security Centerconsole Security Center. Dans la barre de navigation supérieure, sélectionnez la région de la ressource que vous souhaitez gérer. Régions prises en charge : China et Outside China.
Dans le volet de navigation de gauche, choisissez Protection Configuration > Container Protection > Container Signature.
Sous l'onglet Witness, cliquez sur Create a witness, configurez les paramètres, puis cliquez sur OK.
| Paramètre | Description |
|---|---|
| Witness | Nom identifiant cette autorité de signature. Les politiques de sécurité utilisent ce nom pour activer la vérification des signatures pour un namespace de cluster. |
| Select a certificate | Sélectionnez la CMK KMS créée à l'étape 2. |
| Description | Description facultative du témoin. |
Étape 4 : Activer la signature d'images dans Container Registry
Connectez-vous à la console Container Registry. Dans la barre de navigation supérieure, sélectionnez une région.
Dans le volet de navigation de gauche, cliquez sur Instances.
Sur la page Instances, localisez votre instance ACR Enterprise Edition et cliquez sur son nom ou sur Manage.
Dans le volet de navigation de gauche, choisissez Repository > Namespaces. Créez un namespace et activez la signature d'images pour celui-ci. Pour plus d'informations, consultez la section Gérer les namespaces.
-
Activez la signature d'images pour le namespace :
Dans le volet de navigation de gauche, choisissez Security and Trust > Image Signature.
Sous l'onglet Image Signature, cliquez sur Create a signature rule. Lors de la configuration de la règle, sélectionnez le témoin créé à l'étape 3. Pour plus d'informations, consultez la section Configurer une règle de signature pour la signature automatique des images.
Étape 5 : Activer la vérification des signatures dans Security Center
Créez une politique de sécurité pour associer le témoin à un namespace de cluster. Une fois la politique activée, kritis-validation-hook impose la vérification des signatures pour tous les déploiements effectués dans ce namespace.
Connectez-vous à la console Security Centerconsole Security Center.
Dans le volet de navigation de gauche, choisissez Protection Configuration > Container Protection > Container Signature.
Sous l'onglet Security Policy, cliquez sur Add Policy, configurez les paramètres, puis cliquez sur OK.
| Paramètre | Description |
|---|---|
| Policy Name | Nom de la politique de sécurité. |
| Witness | Sélectionnez le témoin créé à l'étape 3. |
| Application Cluster | Sélectionnez le groupe de clusters, puis sélectionnez le Cluster Namespace à protéger. |
| Policy Enabled | Activez l'interrupteur. La politique est désactivée par défaut et ne prend effet qu'après activation. |
| Note | Description facultative de la politique. |
Vérifier l'application de la signature
kritis-validation-hook prend uniquement en charge les images spécifiées par digest. Les images spécifiées par tag sont toujours rejetées.
Exécutez les commandes suivantes pour confirmer que la vérification des signatures fonctionne correctement.
Test 1 : Déployer une image non signée par tag — doit être rejeté
kubectl -n default create deployment not-sign --image=alpine:3.11 -- sleep 10
Résultat attendu :
Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine:3.11 is not attested
Test 2 : Déployer une image non signée par digest — doit être rejeté
kubectl -n default create deployment not-sign --image=alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 -- sleep 10
Résultat attendu :
Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 is not attested
Test 3 : Pousser une image vers le namespace activé pour la signature, puis déployer par digest — doit réussir
Poussez l'image pour déclencher la signature automatique :
docker push kritis-demo***.cn-hongkong.cr.aliyuncs.com/kritis-demo***/alpine:3.11
Résultat attendu (le digest est enregistré après la signature) :
The push refers to repository [kritis-demo***.cn-hongkong.cr.aliyuncs.com/kritis-demo***/alpine]
5216338b40a7: Pushed
3.11: digest: sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 size: 528
Effectuez le déploiement en utilisant le digest issu de la sortie de la commande push :
kubectl -n default create deployment is-signed --image=kritis-demo***.cn-hongkong.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 -- sleep 10
Résultat attendu :
deployment.apps/is-signed created
La vérification des signatures fonctionne correctement. Les images non signées sont bloquées, tandis que les images signées référencées par digest sont admises.