Configurer l'accès contextuel pour les comptes de service

Ce guide explique comment configurer l'accès contextuel pour sécuriser l'accès des comptes de service aux API Google Cloud , en fonction des niveaux d'accès que vous définissez.

Limites

Les limites suivantes s'appliquent aux règles d'accès contextuel pour les comptes de service :

  • Les attributs basés sur le réseau ou l'adresse IP ne peuvent pas être utilisés pour les liaisons de compte de service si le compte de service est utilisé pour les exécutions de workflow et Cloud Scheduler.

  • Les connexions aux clusters GKE privés à l'aide de kubectl et à Cloud SQL à l'aide du proxy d'authentification ne peuvent pas être bloquées par les règles d'accès contextuel.

  • Si un niveau d'accès associé à un compte de service contient des attributs non compatibles, tels que des attributs Device, l'accès à l'API est refusé.

  • Les niveaux d'accès limités ne sont pas acceptés pour les comptes de service.

Si vous utilisez Cloud Build et Cloud Run, nous vous recommandons d'utiliser les fonctionnalités VPC intégrées suivantes :

Avant de commencer

  1. Assurez-vous de disposer d'une organisationGoogle Cloud et d'au moins un projetGoogle Cloud .
  2. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  3. Installez la Google Cloud CLI.

  4. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  5. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  6. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

  7. Vérifiez que la facturation est activée pour votre projet Google Cloud .

  8. Installez la Google Cloud CLI.

  9. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  10. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  11. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

  12. Vérifiez que la facturation est activée pour votre projet Google Cloud .

  13. Mettez à jour les composants de Google Cloud CLI :
    gcloud components update --quiet
  14. Créez un compte de service dans votre projet si vous n'en avez pas déjà un. Ce compte de service est la cible de la règle d'accès.

Rôles requis

Cette section décrit les rôles IAM (Identity and Access Management) requis pour utiliser l'accès contextuel.

Rôles au niveau du projet

Pour obtenir l'autorisation dont vous avez besoin au niveau du projet, demandez à votre administrateur de vous attribuer le rôle IAM Administrateur de compte de service (roles/iam.serviceAccountAdmin) pour le compte utilisateur ou le compte de service. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ce rôle prédéfini contient l'autorisation the required permissions, qui est nécessaire au niveau du projet.

Vous pouvez également obtenir cette autorisation avec des rôles personnalisés ou d'autres rôles prédéfinis.

Rôles au niveau de l'organisation

Pour obtenir l'autorisation dont vous avez besoin au niveau de l'organisation, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le compte utilisateur ou le compte de service :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ce rôle prédéfini contient l'autorisation the required permissions, qui est nécessaire au niveau de l'organisation.

Vous pouvez également obtenir cette autorisation avec des rôles personnalisés ou d'autres rôles prédéfinis.

Associer des règles d'accès à différents niveaux de ressources

Vous pouvez associer des règles d'accès avec le même mode d'application à des ressources situées à différents niveaux de la hiérarchie des ressources. Lorsqu'une ressource tente d'accéder à une autre ressource, l'accès contextuel utilise la règle associée à cette ressource avant de tenter d'utiliser une règle associée à une ressource de niveau supérieur.

Par exemple, vous pouvez associer une stratégie d'accès en mode application directement à un compte de service et une autre stratégie en mode application au projet contenant le compte de service. Lorsque le compte de service tente d'accéder à des ressources, l'accès contextuel évalue la stratégie associée au compte de service. Pour les autres comptes de service du projet auxquels aucune règle d'accès n'est associée, l'accès contextuel évalue la règle en mode application associée au projet. Il en va de même si le mode d'application est défini sur "Simulation" pour la stratégie au niveau du projet et celle au niveau du compte de service.

Vous pouvez utiliser plusieurs règles d'accès pour déployer des règles d'accès de manière incrémentielle et sélective. Par exemple, vous pouvez effectuer les opérations suivantes :

  1. Assurez-vous que la stratégie d'accès fonctionne comme prévu en associant une stratégie d'accès en mode dry run au niveau du projet et en vérifiant les événements d'accès refusé dans Cloud Audit Logs.
  2. Liez la stratégie d'accès en mode d'application uniquement à des comptes de service spécifiques.
  3. Associez la stratégie d'accès en mode application au niveau du projet, et associez une stratégie d'accès en mode application moins restrictive à des comptes de service spécifiques, si nécessaire.

Attributs de niveau d'accès pour les comptes de service

Cette section liste les niveaux d'accès compatibles avec les comptes de service.

Les attributs suivants sont acceptés pour les comptes de service :

  • les sous-réseaux IP, qui sont basés sur l'adresse IP publique.
  • les réseaux VPC, qui sont basés sur l'adresse IP privée.
  • La géolocalisation, qui est basée sur l'adresse IP publique.

    Lorsque le compte de service envoie une requête aux API Google Cloud, l'accès contextuel évalue la requête et compare l'adresse IP de la requête à celles spécifiées dans la règle d'accès contextuel. Si les adresses IP correspondent, l'appel d'API est autorisé. Si l'adresse IP ne correspond pas, l'appel d'API est refusé.

  • Niveau d'accès personnalisé avec une expression CEL (Common Expression Language). L'expression doit renvoyer la valeur true pour autoriser l'accès et false pour le refuser.

    L'expression CEL suivante est utile pour restreindre l'accès par compte de service.

    L'expression renvoie true si la requête provient d'un ou de plusieurs numéros de projet spécifiés :

        expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"
        

    originatesFromProjects vérifie si la requête provient d'un réseau associé au projet spécifié et si elle provient d'une adresse IP privée.

  • Heure de la journée, basée sur l'heure et la date de la demande dans un fuseau horaire spécifié.

    Pour en savoir plus, consultez Configurer des conditions d'accès basées sur le jour et l'heure.

Créer un niveau d'accès

Cette section explique comment créer un niveau d'accès dans votre organisation. Les niveaux d'accès définissent les conditions dans lesquelles l'accès est autorisé.

  1. Suivez les instructions pour créer un niveau d'accès de base ou créer un niveau d'accès personnalisé.

  2. Notez le nom complet de la règle d'accès, qui est au format suivant : accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME.

Créer une liaison d'accès

Associez le niveau d'accès au compte de service sélectionné. Cela permet d'appliquer les conditions définies dans le niveau d'accès. Vous pouvez associer le niveau d'accès à un seul compte de service ou à tous les comptes de service d'un projet.

Associer le niveau d'accès à un compte de service spécifique

Cette section explique comment associer le niveau d'accès à un compte de service spécifique.

gcloud

Associez le niveau d'accès à un compte de service à l'aide de la gcloud CLI.

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Remplacez les éléments suivants :

  • ORGANIZATION_ID : ID de votre organisation Google Cloud
  • SERVICE_ACCOUNT_NAME : nom (et non adresse e-mail) du compte de service cible
  • SERVICE_ACCOUNT_PROJECT_ID : ID du projet contenant le compte de service cible.
  • POLICY_ID : ID de la règle d'accès.
  • ACCESS_LEVEL_NAME : nom du niveau d'accès que vous avez créé

    Pour utiliser l'accès contextuel sans appliquer le niveau d'accès ni refuser l'accès, vous pouvez associer le niveau d'accès en mode simulation.

API REST

Pour associer le niveau d'accès à un compte de service spécifique à l'aide de l'API REST, exécutez la commande suivante :

  1. Créez un fichier request.json avec le contenu suivant :

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Remplacez les éléments suivants :

    • SERVICE_ACCOUNT_NAME : nom (et non adresse e-mail) du compte de service cible

    • SERVICE_ACCOUNT_PROJECT_ID : ID du projet contenant le compte de service cible

    • POLICY_ID : ID de la règle d'accès.

    • ACCESS_LEVEL_NAME : nom du niveau d'accès que vous avez créé

  2. Exécutez la commande suivante :

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet que vous utilisez pour effectuer les appels d'API

    • ORGANIZATION_ID : l'ID de votre organisation Google Cloud.

Associer le niveau d'accès à tous les comptes de service d'un projet

Cette section explique comment associer le niveau d'accès à tous les comptes de service d'un projet.

gcloud

Pour associer le niveau d'accès à tous les comptes de service d'un projet à l'aide de la gcloud CLI, exécutez la commande suivante :

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Remplacez les éléments suivants :

  • ORGANIZATION_ID : ID de votre organisation Google Cloud
  • PROJECT_NUMBER : numéro du projet contenant tous les comptes de service auxquels vous souhaitez associer l'accès
  • POLICY_ID : ID de la règle d'accès.
  • ACCESS_LEVEL_NAME : nom du niveau d'accès que vous avez créé.

API REST

Pour associer le niveau d'accès à tous les comptes de service d'un projet à l'aide de l'API REST, procédez comme suit :

  1. Créez un fichier request.json avec le contenu suivant :

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER : numéro du projet contenant tous les comptes de service auxquels vous souhaitez associer l'accès
    • POLICY_ID : ID de la règle d'accès.
    • ACCESS_LEVEL_NAME : nom du niveau d'accès que vous avez créé.
  2. Exécutez la commande suivante :

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet que vous utilisez pour effectuer les appels d'API
    • ORGANIZATION_ID : ID de votre organisation Google Cloud

Pour utiliser l'accès contextuel sans appliquer le niveau d'accès ni refuser l'accès, vous pouvez associer la règle d'accès en mode simulation.

La réponse de l'API pour l'opération de création de liaison inclut le nom de la liaison, qui contient l'ID unique de la liaison.

Utiliser le mode de simulation

Vous pouvez associer la stratégie d'accès en mode dry run. Lorsque vous utilisez le mode simulation, vos comptes de service peuvent continuer à accéder aux ressources sans application forcée. Toutefois, si vos comptes de service tentent d'accéder à des ressources en violation des règles d'accès, les violations sont consignées dans Cloud Audit Logs.

Associer des règles d'accès en mode dry run

gcloud

Pour associer des règles d'accès en mode de simulation, remplacez le paramètre --level par --dry-run-level, au format suivant :

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

API REST

Pour associer des règles d'accès en mode dry run, créez le fichier request.json avec le contenu suivant :

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

Remplacez les éléments suivants :

  • TARGET_PROJECT_NUMBER : numéro du projet cible
  • POLICY_ID : ID de la règle d'accès.
  • ACCESS_LEVEL_NAME : nom du niveau d'accès

Vérifier les journaux d'audit Cloud

Cette section explique comment vérifier dans Cloud Audit Logs les refus d'accès en mode simulation pour votre compte de service. Pour savoir comment rechercher des entrées en mode simulation dans Cloud Audit Logs, consultez Afficher les journaux en mode simulation.

Console

Pour afficher les refus d'accès au compte de service en mode d'essai Cloud Audit Logs à l'aide de la console Google Cloud , procédez comme suit :

Dans la console Google Cloud , accédez à la pageExplorateur de journaux :

Accéder à l'explorateur de journaux

Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est Logging.

  1. Dans la console Google Cloud , sélectionnez votre projet ou votre organisation.

  2. Dans le champ "Requête de journal", saisissez la requête suivante :

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("`SERVICE_ACCOUNT_NAME`")
    
  3. Dans le sélecteur de période, choisissez une période relative prédéfinie, comme 30 dernières minutes, Dernière heure ou Dernières 24 heures, ou spécifiez une période personnalisée.

gcloud

Pour afficher les refus d'accès aux comptes de service en mode dry run de Cloud Audit Logs à l'aide de gcloud CLI, procédez comme suit :

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("`SERVICE_ACCOUNT_NAME`")' \
  --organization=ORGANIZATION_ID

Remplacez les éléments suivants :

  • ORGANIZATION_ID : ID de l'organisation
  • SERVICE_ACCOUNT_NAME : nom du compte de service.

La commande gcloud logging read est compatible avec l'indicateur --freshness pour afficher les informations de journalisation sur des périodes relatives. Par exemple, en ajoutant --freshness=3h à la commande, vous pouvez afficher les entrées de journal du mode d'essai des trois dernières heures.

Dépannage

Cette section explique comment résoudre les problèmes liés à l'accès contextuel pour les comptes de service.

Dépannage d'ordre général

  1. Examinez les journaux d'audit Cloud.

    Utilisez la requête de journal suivante et consultez les entrées de journal pour en savoir plus.

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    
  2. Examinez le nom de ressource du niveau d'accès que l'accès contextuel indique lorsqu'il consigne des événements d'application.

  3. Assurez-vous que le niveau d'accès est une ressource au niveau de l'organisation.

  4. Assurez-vous que le niveau d'accès de vos règles d'accès est basé sur des attributs compatibles avec les comptes de service.

  5. Vérifiez que la règle d'accès est liée au compte de service prévu.

  6. Assurez-vous que l'accès à votre identité utilisateur n'est pas limité par une règle d'accès. Cela peut se produire lorsqu'une identité utilisateur est membre d'un groupe Google associé à une règle d'accès. Cette règle peut restreindre l'accès des utilisateurs, ce qui empêche le flux d'appels vers le compte de service.

  7. Contactez votre administrateur de sécurité.

Accès refusé

L'accès est refusé pour les raisons suivantes :

  • Vous avez lié la règle d'accès en mode d'application plutôt qu'en mode de simulation.

    Au lieu de l'application, vous pouvez utiliser le mode simulation pour permettre aux comptes de service d'accéder aux ressources et de consigner les événements d'application sans réellement refuser l'accès aux ressources. Vous pouvez également suivre les instructions de dépannage générales.

  • Le niveau d'accès doit être modifié pour inclure davantage de sources. Par exemple, une adresse IP est utilisée alors qu'elle n'était pas incluse dans le niveau d'accès lors de sa création.

Étapes suivantes