Limiter l'utilisation des comptes de service

Resource Manager fournit des contraintes pouvant être utilisées dans les règles d'administration pour limiter l'utilisation des comptes de service Cloud Identity and Access Management.

La plupart de ces contraintes déterminent si des comptes de service et d'autres ressources peuvent être créés ou configurés de manière spécifique. Ces contraintes ne sont pas rétroactives. Elles n'affectent pas les comptes de service créés et configurés précédemment.

Avant de commencer

Vous devez être autorisé à modifier les règles d'administration pour définir des contraintes. Par exemple, le rôle orgpolicy.policyAdmin est autorisé à définir des contraintes de règle d'administration. Consultez la page Utiliser des contraintes pour en savoir plus sur la gestion des règles au niveau de l'organisation.

Contraintes booléennes

Les contraintes suivantes sont des types de boolean constraint, définies sur "true" ou "false".

Désactiver les attributions automatiques de rôles pour les comptes de service par défaut

Certains services Google Cloud créent automatiquement des comptes de service par défaut. Lorsqu'un compte de service par défaut est créé, le rôle Éditeur (roles/editor) lui est automatiquement attribué sur votre projet.

Pour renforcer la sécurité, nous vous recommandons vivement de désactiver l'attribution automatique des rôles. Pour ce faire, vous pouvez utiliser la contrainte booléenne iam.automaticIamGrantsForDefaultServiceAccounts.

Désactiver la création de comptes de service

Vous pouvez utiliser la contrainte booléenne iam.disableServiceAccountCreation pour désactiver la création de comptes de service. Cela vous permet de centraliser la gestion des comptes de service sans restreindre les autres autorisations détenues par vos développeurs pour les projets.

Si vous appliquez cette contrainte dans un projet, certains services Google Cloud ne peuvent pas créer automatiquement de comptes de service par défaut. Par conséquent, si le projet exécute des charges de travail nécessitant d'emprunter l'identité d'un compte de service, il est possible que le projet ne contienne pas de compte de service utilisable par la charge de travail. Pour résoudre ce problème, vous pouvez activer l'emprunt d'identité des comptes de service entre les projets. Lorsque vous activez cette fonctionnalité, vous pouvez créer des comptes de service dans un projet centralisé, puis associer ces comptes de service à des ressources situées dans d'autres projets.

Pour en savoir plus sur l'organisation des comptes de service, consultez la section Où créer des comptes de service.

Désactiver la création de clés de compte de service

Vous pouvez utiliser la contrainte booléenne iam.disableServiceAccountKeyCreation pour désactiver la création de clés de compte de service externes. Cela vous permet de contrôler l'utilisation des identifiants à long terme non gérés pour les comptes de service. Lorsque cette contrainte est définie, les identifiants gérés par l'utilisateur ne peuvent pas être créés pour les comptes de service dans les projets affectés par la contrainte.

Désactiver l'importation de clés dans un compte de service

Vous pouvez utiliser la contrainte booléenne iam.disableServiceAccountKeyUpload pour désactiver l'importation de clés publiques externes dans des comptes de service. Lorsque cette contrainte est définie, les utilisateurs ne peuvent pas importer de clés publiques dans les comptes de service de projets affectés par la contrainte.

Désactiver l'association de comptes de service à des ressources situées dans d'autres projets

Chaque compte de service est situé dans un projet. Vous pouvez utiliser la contrainte booléenne iam.disableCrossProjectServiceAccountUsage pour empêcher que les comptes de service d'un projet soient associés à des ressources d'autres projets.

Si vous souhaitez autoriser l'utilisation des comptes de service entre plusieurs projets, consultez la page Activer l'emprunt d'identité des comptes de service entre les projets.

Restreindre la suppression des privilèges de projet lorsque des comptes de service sont utilisés entre plusieurs projets

Lorsque vous autorisez l'association de comptes de service d'un projet à des ressources d'autres projets, Cloud IAM ajoute un privilège de projet qui vous empêche de supprimer le projet. Par défaut, toute personne disposant de l'autorisation resourcemanager.projects.updateLiens sur le projet peut supprimer le privilège.

Si vous appliquez la contrainte booléenne iam.restrictCrossProjectServiceAccountLienRemoval, les comptes principaux ne peuvent supprimer le privilège que s'ils disposent de l'autorisation resourcemanager.projects.updateLiens sur l'organisation.

Nous vous recommandons d'appliquer cette contrainte si l'un de vos projets autorise l'emprunt d'identité des comptes de service entre les projets.

Désactiver la création de clusters Workload Identity

Vous pouvez utiliser la contrainte booléenne iam.disableWorkloadIdentityClusterCreation pour exiger que la fonctionnalité Workload Identity de tous les nouveaux clusters Google Kubernetes Engine soit désactivée au moment de leur création. Si vous souhaitez contrôler étroitement l'accès au compte de service dans votre organisation, vous souhaiterez peut-être désactiver Workload Identity en plus de la création de comptes de service et de clés de compte de service.

Les clusters GKE existants pour lesquels Workload Identity est activé ne seront pas affectés et continueront de fonctionner normalement.

Appliquer une contrainte booléenne

Console

Pour définir une règle d'administration qui applique une contrainte permettant de restreindre l'utilisation du compte de service, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Règles d'administration.

    Accéder à la page Règles d'administration

  2. Dans le sélecteur de projet, choisissez l'organisation pour laquelle vous souhaitez restreindre l'utilisation du compte de service.

  3. Cliquez sur l'une des contraintes booléennes d'utilisation du compte de service répertoriées sur cette page.

  4. Cliquez sur Gérer la règle.

  5. Sous S'applique à, sélectionnez Remplacer la règle parente.

  6. Cliquez sur Ajouter une règle.

  7. Sous Application, sélectionnez Activé.

  8. Pour appliquer la règle, cliquez sur Définir la règle.

gcloud

Les règles peuvent être définies via la Google Cloud CLI.

Pour restreindre l'utilisation du compte de service, exécutez la commande suivante :

gcloud resource-manager org-policies enable-enforce \
    --organization 'ORGANIZATION_ID' \
    BOOLEAN_CONSTRAINT

BOOLEAN_CONSTRAINT est la contrainte booléenne que vous souhaitez appliquer.

Pour désactiver l'application forcée, la même commande peut être émise à l'aide de la commande

disable-enforce
vous exécutez "terraform plan".

Pour en savoir plus sur l'utilisation de contraintes dans les règles d'administration, consultez la page Utiliser des contraintes.

Exemple de stratégie avec une contrainte booléenne

L'extrait de code suivant présente une règle d'administration qui applique la contrainte booléenne iam.disableServiceAccountCreation, qui empêche la création de comptes de service :

name: organizations/012345678901/policies/iam.disableServiceAccountCreation
spec:
  rules:
  - enforce: true

Contraintes de liste

Les contraintes suivantes sont des types de contrainte de liste, qui sont définies sur une liste de valeurs.

Prolonger la durée de vie des jetons d'accès OAuth 2.0

Vous pouvez créer un jeton d'accès OAuth 2.0 qui fournit des identifiants éphémères pour un compte de service. Par défaut, la durée de vie maximale d'un jeton d'accès est de 1 heure, soit 3 600 secondes. Toutefois, vous pouvez prolonger la durée de vie maximale à 12 heures. Pour ce faire, identifiez les comptes de service qui ont besoin de jetons d'accès à durée de vie prolongée, puis ajoutez ces comptes de service à une règle d'administration qui comprend la contrainte de liste constraints/iam.allowServiceAccountCredentialLifetimeExtension.

Limiter la durée de vie des clés de compte de service

Une clé de compte de service vous permet d'authentifier une requête en tant que compte de service. Par défaut, les clés de compte de service n'expirent jamais. Vous pouvez modifier cette valeur par défaut en définissant un délai d'expiration pour toutes les clés nouvellement créées dans votre projet, dossier ou organisation.

Pour définir un délai d'expiration, utilisez la contrainte de liste constraints/iam.serviceAccountKeyExpiryHours afin de spécifier le nombre d'heures pendant lesquelles une clé nouvellement créée est valide. Passé ce délai, la clé de compte de service expire et vous ne pouvez plus l'utiliser.

Cette contrainte de liste accepte les valeurs ALLOW suivantes, mais pas les valeurs DENY. Nous vous recommandons d'utiliser le délai d'expiration le plus court répondant à vos besoins:

  • 1h: 1 heure
  • 8h: 8 heures
  • 24h: 24 heures (1 jour)
  • 168h: 168 heures (7 jours)
  • 336h: 336 heures (14 jours)
  • 720h: 720 heures (30 jours)
  • 1440h: 1 440 heures (60 jours)
  • 2160h: 2 160 heures (90 jours)

La contrainte constraints/iam.serviceAccountKeyExpiryHours ne peut pas être fusionnée avec une règle parente. Pour appliquer cette contrainte, vous devez remplacer ou hériter de la règle parente.

Spécifier les fournisseurs d'identité externes autorisés

Si vous utilisez la fédération d'identité de charge de travail qui permet aux identités externes d'accéder aux ressources Google Cloud, vous pouvez spécifier les fournisseurs d'identité externes autorisés. Par défaut, tous les fournisseurs sont autorisés. Pour définir une limite, utilisez la contrainte de liste constraints/iam.workloadIdentityPoolProviders afin de spécifier des URI pour les fournisseurs autorisés, en utilisant les formats suivants :

  • Amazon Web Services (AWS) : https://sts.amazonaws.com

    Pour limiter les comptes AWS autorisés, utilisez la contrainte de liste constraints/iam.workloadIdentityPoolAwsAccounts décrite sur cette page.

  • Microsoft Azure : https://sts.windows.net/azure-tenant-id

  • Autres fournisseurs d'identité compatibles avec OpenID Connect (OIDC) : utilisez l'URI d'émetteur de votre fournisseur d'identité.

Spécifier les comptes AWS autorisés

Si vous utilisez la fédération d'identité de charge de travail qui permet aux identités externes d'accéder aux ressources Google Cloud, vous pouvez spécifier les comptes AWS autorisés à accéder à vos ressources. Par défaut, les charges de travail de n'importe quel compte AWS sont autorisées à accéder à vos ressources Google Cloud. Pour limiter les comptes AWS autorisés, utilisez la contrainte de liste constraints/iam.workloadIdentityPoolAwsAccounts pour spécifier une liste d'ID de comptes autorisés.

Désactiver automatiquement les clés de compte de service exposées

Google Cloud détecte occasionnellement qu'une clé de compte de service particulière a été divulguée. Par exemple, il peut détecter une clé dans un dépôt public. Pour spécifier ce que Google Cloud fait avec ces clés, utilisez la contrainte de liste iam.serviceAccountKeyExposureResponse.

Cette contrainte de liste accepte les valeurs ALLOW suivantes, mais pas les valeurs DENY.

  • DISABLE_KEY: si Google Cloud détecte une clé divulguée, il la désactive automatiquement.
  • WAIT_FOR_ABUSE: Google Cloud ne désactive pas de manière proactive les clés divulguées. Toutefois, Google Cloud peut toujours désactiver les clés divulguées si elles sont utilisées d'une manière qui affecte la plate-forme.

Lorsque Google Cloud désactive une clé, les journaux d'audit contiennent le compte principal gcp-compromised-key-response@system.gserviceaccount.com.

Nous vous recommandons vivement de définir cette contrainte sur DISABLE_KEY. Définir cette contrainte sur WAIT_FOR_ABUSE augmente le risque que les clés divulguées soient mal utilisées.

Si vous décidez de définir la contrainte sur WAIT_FOR_ABUSE, nous vous recommandons de vérifier vos coordonnées de sécurité dans Contacts essentiels et de vous assurer que vos contacts de sécurité répondent aux notifications dans les meilleurs délais.

La contrainte iam.serviceAccountKeyExposureResponse ne peut pas être fusionnée avec une règle parente. Pour appliquer cette contrainte, vous devez remplacer la règle parente.

Définir une contrainte de liste

Console

Pour définir une règle d'administration contenant une contrainte de liste, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Règles d'administration.

    Accéder à la page Règles d'administration

  2. Cliquez sur la liste déroulante Organisation en haut de la page, puis sélectionnez votre organisation.

  3. Cliquez sur la contrainte que vous souhaitez ajouter.

  4. Cliquez sur Gérer la règle.

  5. Sous S'applique à, sélectionnez Remplacer la règle parente.

  6. Sous Application des règles, sélectionnez Fusionner avec le parent pour fusionner cette règle avec les règles existantes dans votre hiérarchie.

  7. Cliquez sur Ajouter une règle.

  8. Sous Valeurs de règles, sélectionnez Personnalisé.

  9. Sous Type de règle, sélectionnez Autoriser.

  10. Sous Valeurs personnalisées, saisissez la première valeur de la contrainte de liste.

    1. Si vous souhaitez ajouter d'autres adresses, cliquez sur Nouvelle valeur de règle pour créer plus de lignes et ajouter une adresse à chaque ligne.
  11. Pour appliquer la règle, cliquez sur Définir la règle.

gcloud

Les règles peuvent être définies via la Google Cloud CLI:

gcloud resource-manager org-policies allow \
    CONSTRAINT_NAME \
    VALUE_1 [VALUE_N ...] \
    --organization=ORGANIZATION_ID \

Remplacez les valeurs suivantes :

  • CONSTRAINT_NAME : nom de la contrainte de liste. Exemple : constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • VALUE_1, VALUE_N... : valeurs de la contrainte de liste.

Pour en savoir plus sur l'utilisation de contraintes dans les règles d'administration, consultez la page Utiliser des contraintes.

Exemple de stratégie avec une contrainte de liste

L'extrait de code suivant présente une règle d'administration appliquant la contrainte de liste iam.allowServiceAccountCredentialLifetimeExtension, qui prolonge la durée de vie maximale des jetons d'accès OAuth 2.0 pour les comptes de service répertoriés :

name: organizations/012345678901/policies/iam.allowServiceAccountCredentialLifetimeExtension
spec:
  rules:
  - values:
      allowedValues:
      - SERVICE_ACCOUNT_ADDRESS

Messages d'erreur

Désactiver la création de comptes de service

Si la contrainte iam.disableServiceAccountCreation est appliquée, la création de compte de service échoue et l'erreur suivante s'affiche :

FAILED_PRECONDITION: Service account creation is not allowed on this project.

Désactiver la création de clés de compte de service

Si la contrainte iam.disableServiceAccountKeyCreation est appliquée, la création de compte de service échoue et l'erreur suivante s'affiche :

FAILED_PRECONDITION: Key creation is not allowed on this service account.

Désactiver la création de clusters Workload Identity

Si iam.disableWorkloadIdentityClusterCreation est appliqué, la création d'un cluster GKE pour lequel Workload Identity est activé échoue, avec l'erreur suivante :

FAILED_PRECONDITION: Workload Identity is disabled by the organization
policy constraints/iam.disableWorkloadIdentityClusterCreation. Contact your
administrator to enable this feature.

Résoudre les problèmes connus

Comptes de service par défaut

L'application de la contrainte iam.disableServiceAccountCreation empêche la création de comptes de service dans ce projet. Cette limitation concerne également les services Google Cloud qui, lorsqu'ils sont activés, créent automatiquement des comptes de service par défaut dans le projet, tels que :

  • Compute Engine
  • GKE
  • App Engine
  • Dataflow

Si la contrainte iam.disableServiceAccountCreation est appliquée, toute tentative d'activation de ces services échoue, car leurs comptes de service par défaut ne peuvent pas être créés.

Pour remédier à ce problème :

  1. Supprimez temporairement la contrainte iam.disableServiceAccountCreation.
  2. Activez les services souhaités.
  3. Créez tout autre compte de service souhaité.
  4. Réappliquez la contrainte.