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
kubectlet à 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 :
Pour Cloud Run, utilisez l'accès au VPC sans serveur.
Pour Cloud Build, utilisez des pools privés.
Avant de commencer
- Assurez-vous de disposer d'une organisationGoogle Cloud et d'au moins un projetGoogle Cloud .
- 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.
-
Installez la Google Cloud CLI.
-
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.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
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'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar 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_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
-
Installez la Google Cloud CLI.
-
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.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
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'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar 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_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
- Mettez à jour les composants de Google Cloud CLI :
gcloud components update --quiet
- 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 :
- Administrateur de liaisons d'accès au cloud (
roles/accesscontextmanager.gcpAccessAdmin) - Administrateur Access Context Manager (
roles/accesscontextmanager.policyAdmin)
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 :
- 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.
- Liez la stratégie d'accès en mode d'application uniquement à des comptes de service spécifiques.
- 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
truepour autoriser l'accès etfalsepour le refuser.L'expression CEL suivante est utile pour restreindre l'accès par compte de service.
L'expression renvoie
truesi la requête provient d'un ou de plusieurs numéros de projet spécifiés :expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"originatesFromProjectsvé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é.
Suivez les instructions pour créer un niveau d'accès de base ou créer un niveau d'accès personnalisé.
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 CloudSERVICE_ACCOUNT_NAME: nom (et non adresse e-mail) du compte de service cibleSERVICE_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 :
Créez un fichier
request.jsonavec 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 cibleSERVICE_ACCOUNT_PROJECT_ID: ID du projet contenant le compte de service ciblePOLICY_ID: ID de la règle d'accès.ACCESS_LEVEL_NAME: nom du niveau d'accès que vous avez créé
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'APIORGANIZATION_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 CloudPROJECT_NUMBER: numéro du projet contenant tous les comptes de service auxquels vous souhaitez associer l'accèsPOLICY_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 :
Créez un fichier
request.jsonavec 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èsPOLICY_ID: ID de la règle d'accès.ACCESS_LEVEL_NAME: nom du niveau d'accès que vous avez créé.
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'APIORGANIZATION_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 ciblePOLICY_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.
Dans la console Google Cloud , sélectionnez votre projet ou votre organisation.
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`")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'organisationSERVICE_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
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"
Examinez le nom de ressource du niveau d'accès que l'accès contextuel indique lorsqu'il consigne des événements d'application.
Assurez-vous que le niveau d'accès est une ressource au niveau de l'organisation.
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.
Vérifiez que la règle d'accès est liée au compte de service prévu.
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.
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
- Découvrez comment gérer les liaisons d'accès.