Configurer une stratégie d'autorisation binaire avec GKE

Ce guide de démarrage rapide explique comment configurer et tester une règle de base dans une stratégie d'autorisation binaire.

Dans ce guide de démarrage rapide, vous allez afficher et configurer la règle par défaut dans la stratégie. La règle par défaut autorise le déploiement de toutes les images. Pour ce faire, déployez une image de conteneur sur un cluster Google Kubernetes Engine (GKE). Vous définissez ensuite la règle par défaut pour interdire le déploiement de toutes les images et toute tentative de déploiement.

Avant de commencer

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Binary Authorization APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Binary Authorization APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Installez kubectl.

Créer un cluster avec activation forcée de l'autorisation binaire

Vous allez maintenant créer un cluster GKE avec l'autorisation binaire activée. Il s'agit du cluster dans lequel vous souhaitez exécuter les images de conteneur que vous déployez.

L'autorisation binaire fonctionne avec les clusters Autopilot ou Standard.

Console Google Cloud

Les étapes suivantes permettent de configurer un cluster Autopilot.

  1. Dans la console Google Cloud, accédez à la page Clusters Kubernetes de GKE :

    Accéder à la page GKE

  2. Cliquez sur Créer.

  3. Dans Créer un cluster Autopilot, procédez comme suit :

    1. Dans le champ Nom, saisissez test-cluster.

    2. Dans le menu Région, sélectionnez us-central1.

    3. Développez la section Paramètres avancés.

    4. Cliquez sur le lien Sécurité pour afficher le panneau Sécurité.

    5. Dans la section Sécurité, cochez la case Activer l'autorisation binaire.

    6. Sélectionnez Appliquer uniquement.

    7. Cliquez sur Suivant, puis sur Suivant : Vérification et création.

    8. Pour commencer la création du cluster, cliquez sur Créer.

gcloud

Exécutez gcloud container clusters create avec l'option --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE activée.

gcloud container clusters create \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --zone us-central1-a \
    test-cluster

La création d'un cluster peut prendre plusieurs minutes.

Règle par défaut

Par défaut, votre stratégie d'autorisation binaire est configurée pour autoriser le déploiement de toutes les images de conteneur.

Console Google Cloud

Pour afficher la stratégie par défaut, procédez comme suit :

  1. Accédez à la page Autorisation binaire dans Google Cloud Console.

    Accéder à la page "Autorisation binaire"

    La console affiche des détails sur la stratégie.

  2. Cliquez sur Modifier la règle.

  3. Dans Project Default Rule (Règle par défaut du projet), l'option Allow All Images (Autoriser toutes les images) est sélectionnée.

gcloud

Pour afficher la stratégie par défaut, exportez le fichier YAML de stratégie comme suit :

gcloud container binauthz policy export

Par défaut, ce fichier comporte les éléments suivants :

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy

API REST

Pour afficher la stratégie par défaut, récupérez-la au format JSON comme suit :

curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"

La commande produit le résultat suivant :

{
  "name": "projects/PROJECT_ID/policy",
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

Tester la règle d'application forcée

Vous pouvez tester la règle d'application en essayant de déployer un exemple d'image de conteneur sur le cluster.

Pour ce guide de démarrage rapide, vous utiliserez l'exemple d'image de conteneur situé dans le chemin gcr.io/google-samples/hello-app dans Container Registry. Il s'agit d'une image de conteneur publique créée par Google et contenant un exemple d'application "Hello, World!"

console Google Cloud

Pour tester la stratégie, procédez comme suit :

  1. Accédez à la page des Clusters GKE dans la console Google Cloud.

    Accéder à la page GKE

  2. Cliquez sur Déployer.

    La console vous invite à saisir des détails sur le déploiement.

  3. Sélectionnez Existing Container Image (Image existante du conteneur).

  4. Saisissez gcr.io/google-samples/hello-app:1.0 comme chemin d'accès à l'image de conteneur.

  5. Cliquez sur Continuer.

  6. Saisissez hello-server dans le champ Application name (Nom de l'application).

  7. Cliquez sur Déployer.

kubectl

Pour tester la stratégie, procédez comme suit :

  1. Mettez à jour le fichier kubeconfig local :

    gcloud container clusters get-credentials \
        --zone us-central1-a \
        test-cluster
    

    Cela fournit les identifiants et les informations de point de terminaison requis pour accéder au cluster dans GKE.

  2. Déployez l'image :

    kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
    

Maintenant, vérifiez que le déploiement a été autorisé par l'autorisation binaire.

console Google Cloud

Pour vérifier que l'image a été déployée, accédez à la page Charges de travail GKE dans la console Google Cloud.

Accéder à la page GKE

Le nom d'une charge de travail correspondant au déploiement s'affiche. L'icône verte indique que l'image a été déployée avec succès.

kubectl

Pour vérifier que l'image a été déployée, procédez comme suit :

kubectl get pods

La commande imprime un message semblable à celui ci-dessous, indiquant que le déploiement a bien été effectué :

NAME                            READY     STATUS    RESTARTS   AGE
hello-server-579859fb5b-h2k8s   1/1       Running   0          1m

Veillez à supprimer le déploiement pour pouvoir passer à l'étape suivante :

console Google Cloud

Pour supprimer le déploiement, procédez comme suit :

  1. Revenez à la page Charges de travail GKE dans la console Google Cloud.

    Accéder à la page GKE

  2. Sélectionnez la charge de travail hello-server.

  3. Cliquez sur Supprimer.

kubectl

Pour supprimer le déploiement, procédez comme suit :

kubectl delete deployment hello-server

Configurer la règle d'application pour interdire toutes les images

Maintenant, modifiez la stratégie pour bloquer le déploiement de toutes les images au lieu de l'autoriser.

console Google Cloud

Pour modifier la stratégie, procédez comme suit :

  1. Revenez à la page Autorisation binaire dans la console Google Cloud.

    Accéder à la page "Autorisation binaire"

  2. Cliquez sur Modifier la règle.

  3. Sélectionnez Disallow All Images (Interdire toutes les images).

  4. Cliquez sur Save Policy (Enregistrer la stratégie).

gcloud

Pour modifier la stratégie, procédez comme suit :

  1. Exportez le fichier YAML de stratégie :

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. Dans un éditeur de texte, modifiez evaluationMode, défini jusqu'alors sur ALWAYS_ALLOW, en le remplaçant par ALWAYS_DENY.

    Le fichier YAML de stratégie doit ressembler à ceci :

    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/PROJECT_ID/policy
    
  3. Importez le fichier YAML de stratégie dans l’autorisation binaire :

    gcloud container binauthz policy import /tmp/policy.yaml
    

API REST

Pour modifier la stratégie, procédez comme suit :

  1. Créez un fichier texte avec la stratégie mise à jour au format JSON :

    cat > /tmp/policy.json << EOM
    {
      "name": "projects/${PROJECT_ID}/policy",
      "globalPolicyEvaluationMode": "ENABLE",
      "defaultAdmissionRule": {
        "evaluationMode": "ALWAYS_DENY",
        "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
      }
    }
    EOM
    
  2. Envoyez la stratégie mise à jour à l'API REST :

    curl -X PUT \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: ${PROJECT_ID}" \
        --data-binary @/tmp/policy.json  \
        "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
    

Tester une nouvelle fois la stratégie

Testez une nouvelle fois la stratégie en déployant un exemple d'image de conteneur sur le cluster. Cette fois, l'autorisation binaire bloque le déploiement de l'image.

console Google Cloud

Déployez l'image :

  1. Accédez à la page des Clusters GKE dans la console Google Cloud.

    Accéder à la page GKE

  2. Cliquez sur Déployer.

    La console vous invite à saisir des détails sur le déploiement.

  3. Sélectionnez Existing Container Image (Image existante du conteneur).

  4. Saisissez gcr.io/google-samples/hello-app:1.0 comme chemin d'accès à l'image de conteneur.

  5. Cliquez sur Continuer.

  6. Saisissez hello-server dans le champ Application name (Nom de l'application).

  7. Cliquez sur Déployer.

kubectl

Déployez l'image :

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

Vous pouvez maintenant vérifier que la stratégie a été bloquée :

console Google Cloud

Pour vérifier que l'image n'a pas été déployée, procédez comme suit :

Revenez à la page Charges de travail GKE dans la console Google Cloud.

Accéder à la page GKE

Le nom d'une charge de travail associée à l'image de conteneur s'affiche. L'icône rouge indique que l'image n'a pas été déployée.

kubectl

Pour vérifier que l'image n'a pas été déployée, exécutez la commande suivante :

kubectl get pods

La commande imprime le message suivant, qui indique que l'image n'a pas été déployée :

No resources found.

Vous pouvez obtenir plus de détails sur le déploiement avec la commande suivante :

kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'

Une réponse semblable à celle-ci s'affiche :

FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule

Dans ce résultat :

  • POD_NAME : nom du pod.
  • IMAGE_NAME : nom de l'image.
  • ATTESTOR_NAME : nom du certificateur.

Effectuer un nettoyage

Pour éviter que les ressources utilisées sur cette page soient facturées sur votre compte Google Cloud, procédez comme suit :

Supprimez le cluster que vous avez créé dans GKE :

Console

Pour supprimer le cluster, procédez comme suit :

  1. Accédez à la page des Clusters GKE dans la console Google Cloud.

    Accéder à la page GKE

  2. Sélectionnez le cluster test-cluster, puis cliquez sur Supprimer.

gcloud

Pour supprimer le cluster, procédez comme suit :

gcloud container clusters delete \
    --zone=us-central1-a \
    test-cluster

Étape suivante