Configurer les clusters GKE

Ce document explique comment configurer l'autorisation binaire pour les clusters GKE. Il vous explique ensuite comment configurer un exemple de stratégie d'autorisation binaire.

Avant de commencer

  1. Vous devez disposer de clusters GKE enregistrés auprès de Connect. L'autorisation binaire est compatible avec les environnements suivants.

    GKE sur solution Bare Metal

    GKE sur Bare Metal 1.14 ou version ultérieure.

    GKE sur VMware

    GKE sur VMware 1.4 ou version ultérieure.

  2. Le service d'autorisation binaire utilise une adresse IP publique, accessible via une connexion Internet standard. Configurez vos règles de pare-feu pour HTTPS afin de permettre au cluster d'utilisateur d'accéder au point de terminaison binaryauthorization.googleapis.com.

    GKE sur solution Bare Metal

    Configurez des règles de pare-feu GKE sur Bare Metal.

    GKE sur VMware

    Configurez des règles de pare-feu GKE sur VMware.

  3. Si vous souhaitez utiliser des journaux d'audit Cloud centralisés pour afficher les entrées des journaux d'audit, y compris celles de l'autorisation binaire pour les clusters GKE, vous devez configurer Cloud Audit Logging dans la configuration de votre cluster.

    GKE sur solution Bare Metal

    Configurez les journaux d'audit Cloud dans GKE sur Bare Metal.

    GKE sur VMware

    Configurez Cloud Audit Logging dans GKE sur VMware.

  4. Vous devez activer l'API d'autorisation binaire comme suit :

    1. Accédez à Google Cloud Console.

      Activer les API

    2. Dans la liste déroulante des projets, sélectionnez votre projet Connect. Vous trouverez ce projet Google Cloud dans la section gkeConnect du fichier de configuration de votre cluster d'utilisateur. Il s'agit du projet Google Cloud qui connecte votre cluster d'utilisateur à Google Cloud.

Configurer l'autorisation binaire

Dans cette section, vous allez configurer l'autorisation binaire pour les clusters GKE dans votre cluster.

Spécifier les variables d'environnement d'installation

Pour spécifier les variables d'environnement, procédez comme suit :

Utiliser Workload Identity

  1. Spécifiez votre projet Connect :

    export PROJECT_ID=PROJECT_ID
    
  2. Spécifiez l'ID de membre de parc de votre cluster:

    export MEMBERSHIP_ID=MEMBERSHIP_ID
    

Utiliser une clé de compte de service

  1. Spécifiez votre projet Connect :

    export PROJECT_ID=PROJECT_ID
    

    Remplacez PROJECT_ID par le projet Cloud dans la section gkeConnect du fichier de configuration de votre cluster d'utilisateur.

  2. Spécifiez le chemin d'accès au fichier kubeconfig du cluster d'utilisateur :

    export KUBECONFIG=PATH
    

    Remplacez PATH par le chemin d'accès du fichier kubeconfig de votre cluster d'utilisateur.

  3. Choisissez un nom pour le compte de service d'accès à l'API Binary Authorization :

    export SA_NAME=SERVICE_ACCOUNT_NAME
    

    Remplacez SERVICE_ACCOUNT_NAME par le nom de compte de service de votre choix. Le module d'autorisation binaire utilise ce compte de service pour accéder à l'API d'autorisation binaire.

  4. Spécifiez le chemin d'accès au fichier de clé de compte de service que vous allez télécharger plus loin dans ce guide :

    export SA_JSON_PATH=SA_KEY_FILE_PATH
    

    Remplacez SA_KEY_FILE_PATH par le chemin du fichier de clé JSON pour le compte de service.

Installer le module d'autorisation binaire dans votre cluster d'utilisateur

Pour installer le module d'autorisation binaire, procédez comme suit :

Utiliser Workload Identity

Fleet Workload Identity permet aux charges de travail de votre cluster de s'authentifier auprès de Google sans que vous ayez besoin de télécharger, d'alterner manuellement ni de gérer les clés des comptes de service Google Cloud. Pour en savoir plus sur le fonctionnement de Workload Identity pour parc et les avantages liés à son utilisation, consultez la page Utiliser Workload Identity de parc.

  1. Attribuez le rôle binaryauthorization.policyEvaluator au compte de service Kubernetes sur votre projet Connect :

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  2. Créez un répertoire de travail :

    1. Créez un répertoire appelé binauthz.

    2. Accédez au répertoire.

  3. Téléchargez le fichier manifest-wi-0.2.6.yaml.tmpl que vous utilisez pour installer le module d'autorisation binaire dans votre cluster d'utilisateur de clusters GKE :

    GKE sur solution Bare Metal

    gsutil cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    

    GKE sur VMware

    gsutil cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    
  4. Remplacez les variables d'environnement dans le modèle :

    envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
    
  5. Installez le module d'autorisation binaire dans votre cluster d'utilisateur :

    kubectl apply -f manifest-0.2.6.yaml
    
  6. Vérifiez que le déploiement a bien été créé :

    kubectl get pod --namespace binauthz-system
    

    Le pod binauthz-module-deployment-* est répertorié avec Status de Running et 1/1 Pods prêt, semblable à ce résultat :

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

Utiliser une clé de compte de service

  1. Définissez le projet par défaut pour la Google Cloud CLI :

    gcloud config set project ${PROJECT_ID}
    
  2. Créez un compte de service d'accès à l'API d'autorisation binaire :

    gcloud iam service-accounts create ${SA_NAME}
    
  3. Attribuez le rôle binaryauthorization.policyEvaluator au compte de service d'accès de l'API d'autorisation binaire sur votre projet Connect :

    gcloud projects add-iam-policy-binding ${PROJECT_ID}\
        --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  4. Créez un répertoire de travail :

    1. Créez un répertoire appelé binauthz.

    2. Accédez au répertoire.

  5. Téléchargez le fichier manifest-0.2.6.yaml que vous utilisez pour installer le module d'autorisation binaire dans votre cluster d'utilisateur de clusters GKE :

    anthos_clusters_on_bare_metal

    gsutil cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
    

    anthos_clusters_on_vmware

    gsutil cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
    
  6. Créez un fichier YAML pour l'espace de noms binauthz-system.

    Copiez le fichier suivant dans un fichier nommé namespace.yaml :

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        control-plane: binauthz-controller
      name: binauthz-system
    
  7. Créez l'espace de noms dans votre cluster d'utilisateur :

    kubectl apply -f namespace.yaml
    

    Vous obtenez un résultat semblable à celui-ci :

    namespace/binauthz-system created
    
  8. Téléchargez un fichier de clé JSON associé à votre compte de service :

    gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    
  9. Enregistrez la clé du compte de service en tant que secret Kubernetes dans votre cluster d'utilisateur :

    kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
    
  10. Installez le module d'autorisation binaire dans votre cluster d'utilisateur :

    kubectl apply -f manifest-0.2.6.yaml
    
  11. Vérifiez que le déploiement a bien été créé :

    kubectl get pod --namespace binauthz-system
    

    Le pod binauthz-module-deployment-* est répertorié avec Status de Running et 1/1 Pods prêt, semblable à ce résultat :

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

Configurer et utiliser des stratégies d'autorisation binaire

Cette section vous explique comment configurer et utiliser des stratégies d'autorisation binaire pour les clusters GKE.

Dans chaque exemple, vous configurez la stratégie, puis la testez en essayant de déployer une image de conteneur dans votre cluster GKE.

Tout autoriser

Cette section décrit un cas de réussite. Vous configurez la stratégie d'autorisation binaire de sorte qu'une image de conteneur respecte la stratégie et soit déployée.

Dans Google Cloud, procédez comme suit :

Console

  1. Dans Google Cloud Console, accédez à la page "Autorisation binaire".

    Accéder à la page "Autorisation binaire"

  2. Veillez à sélectionner l'ID de votre projet Connect.

  3. Cliquez sur Modifier la règle.

  4. Sous Règle par défaut du projet, sélectionnez Autoriser toutes les images.

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

gcloud

  1. Définissez le paramètre PROJECT_ID pour votre projet Connect. Vous pouvez trouver cet ID de projet dans le champ gkeConnect de votre fichier de configuration de cluster d'utilisateur.

    export PROJECT_ID=PROJECT_ID
    

    Définissez le projet Google Cloud par défaut.

    gcloud config set project ${PROJECT_ID}
    
  2. Exportez le fichier YAML de stratégie vers votre système local :

    gcloud container binauthz policy export  > policy.yaml
    

    Votre fichier YAML se présente comme suit :

    defaultAdmissionRule:
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      evaluationMode: ALWAYS_ALLOW
    globalPolicyEvaluationMode: ENABLE
    name: projects/<var>PROJECT_ID</var>/policy
    
  3. Modifier policy.yaml.

  4. Définissez evaluationMode sur ALWAYS_ALLOW.

  5. Si le fichier contient un bloc requireAttestationsBy, supprimez ce bloc.

  6. Enregistrez le fichier.

  7. Importez policy.yaml comme suit :

    gcloud container binauthz policy import policy.yaml
    

Pour ajouter une image exclue à la liste d'autorisation, ajoutez ce qui suit au fichier de stratégie :

admissionWhitelistPatterns:
  - namePattern: EXEMPT_IMAGE_PATH

Remplacez EXEMPT_IMAGE_PATH par le chemin d'accès à l'image à exclure. Pour exclure des images supplémentaires, ajoutez d'autres entrées - namePattern. En savoir plus sur admissionWhitelistPatterns.

Sur votre poste de travail administrateur de clusters GKE, procédez comme suit :

  1. Créez un fichier manifeste pour un pod.

    Enregistrez le fichier suivant dans un fichier nommé pod.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. Créez le pod :

    kubectl apply -f pod.yaml
    

    Vous constatez que le pod a bien été déployé.

  3. Supprimez le pod :

    kubectl delete -f pod.yaml
    

Refuser pour l'ensemble

Cette section présente un exemple d'échec. Dans cette section, vous allez configurer la stratégie par défaut pour interdire le déploiement de votre image de conteneur.

Dans Google Cloud, procédez comme suit :

Console

  1. Dans Google Cloud Console, accédez à la page "Autorisation binaire".

    Accéder à la page "Autorisation binaire"

  2. Assurez-vous que votre projet Connect est sélectionné.

  3. Cliquez sur Modifier la règle.

  4. Sous Règle par défaut du projet, sélectionnez Interdire toutes les images.

  5. Cliquez sur Enregistrer la règle.

gcloud

  1. Définissez le champ PROJECT_ID sur l'ID de votre projet Connect.

    export PROJECT_ID=PROJECT_ID
    
  2. Définissez le projet Google Cloud par défaut.

    gcloud config set project ${PROJECT_ID}
    
  3. Exportez le fichier YAML de stratégie :

    gcloud container binauthz policy export  > policy.yaml
    
  4. Modifier policy.yaml.

  5. Définissez evaluationMode sur ALWAYS_DENY.

  6. Si le fichier contient un bloc requireAttestationsBy, supprimez ce bloc.

  7. Enregistrez le fichier.

  8. Importez policy.yaml comme suit :

    gcloud container binauthz policy import policy.yaml
    

Sur votre poste de travail administrateur de clusters GKE, procédez comme suit :

  1. Créez un fichier manifeste pour un pod.

    Enregistrez le fichier suivant dans un fichier nommé pod.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. Créez le pod :

    kubectl apply -f pod.yaml
    

    Vous constatez que le déploiement du pod a été bloqué. La sortie ressemble à ceci :

    Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
    

Obtenir l'ID de ressource du cluster d'utilisateur

Cette section explique comment composer l'ID de ressource du cluster pour votre cluster d'utilisateur. Dans votre stratégie d'autorisation binaire, vous pouvez créer des règles spécifiques à un cluster. Vous associez ces règles à un ID de ressource spécifique à un cluster, qui est basé sur votre ID de cluster.

Vous obtenez l'ID de ressource comme suit :

Console

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

    accéder aux clusters

  2. Sélectionnez l'ID de projet Connect pour les clusters GKE. Vous pouvez trouver cet ID de projet dans la section gkeConnect de votre fichier de configuration de cluster d'utilisateur.

  3. Sous Clusters gérés par Anthos, recherchez votre ID de cluster dans la colonne Nom.

  4. Pour créer l'ID de ressource, ajoutez le préfixe global. à l'ID de cluster afin que l'ID de ressource ait le format suivant : global.CLUSTER_ID.

gcloud

  1. Utilisez SSH pour vous connecter au poste de travail administrateur de clusters GKE.

  2. Sur le poste de travail administrateur, exécutez la commande suivante :

    kubectl get membership -o yaml
    
  3. Obtenez l'ID de cluster à partir du champ spec.owner.id du résultat. Exemple de résultat :

    apiVersion: v1
    items:
    - apiVersion: hub.gke.io/v1
      kind: Membership
      ...
      spec:
        owner:
          id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
    

    Dans l'exemple de résultat, l'ID de cluster est my-cluster-id.

  4. Pour créer l'ID de ressource, ajoutez le préfixe global. à l'ID de cluster. Dans l'exemple, l'ID de ressource est global.my-cluster-id.

Vous pouvez utiliser cet ID de ressource lorsque vous définissez des règles spécifiques à un cluster. Découvrez comment définir des règles spécifiques à un cluster à l'aide de la console Google Cloud ou de la CLI gcloud.

Mettre à jour la stratégie d'échec

Le webhook du module d'autorisation binaire peut être configuré en mode fail open ou fail closed.

Configuration fermée ("fail close")

Pour mettre à jour la stratégie d'échec, procédez comme suit :

  1. Modifiez le fichier manifest-0.2.6.yaml et définissez la règle "failurePolicy" sur Fail.

  2. Réactivez le webhook :

    kubectl apply -f manifest-0.2.6.yaml
    

    Vous obtenez un résultat semblable à celui-ci :

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

Configuration ouverte ("fail open")

Pour mettre à jour la stratégie d'échec, procédez comme suit :

  1. Modifiez le fichier manifest-0.2.6.yaml et définissez la règle "failurePolicy" sur Ignore.

  2. Réactivez le webhook :

    kubectl apply -f manifest-0.2.6.yaml
    

    Vous obtenez un résultat semblable à celui-ci :

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

Pour en savoir plus, consultez la page Stratégie d'échec des webhooks.

Effectuer un nettoyage

  1. L'exemple de code suivant montre comment désactiver le webhook :

    kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
    
  2. L'exemple de code suivant montre comment réactiver le webhook :

    kubectl apply -f manifest-0.2.6.yaml
    
  3. L'exemple de code suivant montre comment supprimer toutes les ressources liées à l'autorisation binaire :

    kubectl delete -f manifest-0.2.6.yaml
    kubectl delete namespace binauthz-system
    

Étape suivante