Utiliser des conditions IAM

Les conditions IAM vous permettent de définir et d'appliquer un contrôle d'accès conditionnel basé sur des attributs pour les ressources Google Cloud, y compris les instances Cloud SQL. Pour en savoir plus sur les conditions IAM, consultez la page Présentation des conditions IAM.

Présentation

Dans Cloud SQL, vous pouvez appliquer un accès conditionnel en fonction des attributs suivants :

  • Attributs de date et d'heure : permettent de définir un accès temporaire (expirant), planifié ou de durée limitée aux ressources Cloud SQL. Par exemple, vous pouvez autoriser un utilisateur à accéder à une instance de base de données jusqu'à une date spécifiée. Vous pouvez utiliser des attributs de date/heure à n'importe quel niveau de la hiérarchie des ressources. Pour en savoir plus, consultez la section Configurer un accès temporaire.
  • Attributs de ressource : permet de configurer un accès conditionnel en fonction d'un attribut de tag, de nom de ressource, de type de ressource ou de service de ressource. Dans Cloud SQL, vous pouvez utiliser des attributs d'instances de base de données pour configurer l'accès conditionnel. Par exemple, vous pouvez autoriser un utilisateur à accéder uniquement aux instances associées à un tag spécifique. Pour en savoir plus, consultez la section Configurer un accès basé sur les ressources.

Les cas d'utilisation incluent les situations suivantes :

  • Autoriser les utilisateurs à se connecter à des instances spécifiques

  • Autoriser les utilisateurs à créer des instances avec des préfixes ou des suffixes spécifiques (par exemple, "test").

  • Limiter l'accès aux opérations de sauvegarde pour les instances de test

  • Autoriser les utilisateurs à supprimer des instances de développement et de test, mais pas des instances de production.

  • Autoriser les utilisateurs à effectuer des opérations d'administration à certaines dates ou à certains moments.

Autoriser les utilisateurs à se connecter à des instances spécifiques

Supposons que vous souhaitiez autoriser un utilisateur ou un compte de service à se connecter à une seule instance Cloud SQL spécifique. Vous pouvez inclure une condition IAM dans la liaison de stratégie IAM qui accorde à ce compte les autorisations d'un rôle Cloud SQL.

Par défaut, le rôle Client Cloud SQL prédéfini (roles/cloudsql.client), qui contient l'autorisation cloudsql.instances.connect, autorise son membre à se connecter à toutes les instances Cloud SQL d'un projet. En introduisant une condition IAM dans la liaison de stratégie, vous pouvez accorder une autorisation à l'instance nommée uniquement.

Console

Cet exemple montre comment modifier la liaison IAM existante pour le projet afin d'attribuer à un compte de service un rôle de client Cloud SQL pour une instance spécifique.

Cet exemple utilise les variables suivantes :

  • PROJECT_ID : votre projet Google Cloud.
  • INSTANCE_ID : nom de l'instance à laquelle vous souhaitez accorder l'accès.

  1. Dans Google Cloud Console, accédez à la page IAM.

    Accéder à IAM

  2. Cliquez sur Ajouter.
  3. Dans la zone de saisie Nouveaux membres, saisissez l'adresse e-mail du compte de service.
  4. Cliquez sur la liste déroulante Rôle et sélectionnez le rôle Client Cloud SQL.
  5. Cliquez sur Ajouter une condition.
  6. Saisissez un titre et une description.
  7. Sélectionnez l'onglet Éditeur de conditions.
  8. Dans la section Créateur de conditions :
    • Dans le champ Type de condition - Ressource - Nom, saisissez projects/PROJECT_ID/instances/INSTANCE_ID.
    • Assurez-vous que la condition AND est sélectionnée.
    • Dans le champ Type de condition – Ressource – Service, sélectionnez sqladmin.googleapis.com.
  9. Cliquez sur Enregistrer pour enregistrer la condition.
  10. Cliquez sur Enregistrer pour enregistrer la règle.

gcloud

Cet exemple montre comment modifier la liaison de stratégie IAM existante pour le projet afin d'attribuer à un compte de service spécifique le rôle Client Cloud SQL, mais seulement pour une instance spécifique.

Cet exemple utilise les variables suivantes :

  • PROJECT_ID : votre projet Google Cloud.
  • INSTANCE_ID : nom de l'instance à laquelle vous souhaitez accorder l'accès.
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail complète du compte de service dont vous souhaitez modifier l'accès.

  1. Obtenez les liaisons de stratégie IAM existantes et générez-les dans le fichier bindings.json :
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. Ajoutez la liaison de rôle conditionnelle suivante au fichier bindings.json :
    {
      "bindings": [
        {
          "role": "roles/cloudsql.client",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ],
          "condition": {
            "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
              && resource.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
    
  4. Mettez à jour la stratégie IAM avec le nouveau fichier bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

Terraform

Pour autoriser les utilisateurs à se connecter à des instances spécifiques, utilisez une ressource de données Terraform google_iam_policy et une ressource Terraform google_project_iam_policy.

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

Appliquer les modifications

Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.

Préparer Cloud Shell

  1. Lancez Cloud Shell.
  2. Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.

    Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.

Préparer le répertoire

Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).

  1. Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension .tf, par exemple main.tf. Dans ce tutoriel, le fichier est appelé main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.

    Copiez l'exemple de code dans le fichier main.tf que vous venez de créer.

    Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.

  3. Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
  4. Enregistrez les modifications.
  5. Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
    terraform init

    Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option -upgrade :

    terraform init -upgrade

Appliquer les modifications

  1. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
    terraform plan

    Corrigez les modifications de la configuration si nécessaire.

  2. Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  3. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

Supprimer les modifications

Pour supprimer vos modifications, procédez comme suit :

  1. Pour désactiver la protection contre la suppression, définissez l'argument deletion_protection sur false dans le fichier de configuration Terraform.
    deletion_protection =  "false"
  2. Appliquez la configuration Terraform mise à jour en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply
  1. Supprimez les ressources précédemment appliquées à votre configuration Terraform en exécutant la commande suivante et en saisissant yes à l'invite :

    terraform destroy

Limiter l'accès aux opérations de sauvegarde pour les instances de test

Supposons que la topologie de votre service soit configurée pour que toutes les instances de test comportent le préfixe test (par exemple, test-instance-1) et toutes les instances de production le préfixe prod (par exemple, prod-instance-1).

Vous pouvez limiter l'accès aux opérations de sauvegarde sur vos instances de test pour un utilisateur ou un compte de service. Si vous limitez l'accès, les opérations CREATE, GET, LIST ou DELETE sont limitées aux sauvegardes de vos instances de test.

Console

  1. Dans Google Cloud Console, accédez à la page IAM.

    Accéder à IAM

  2. Cliquez sur l'onglet COMPTES PRINCIPAUX.
  3. Recherchez l'adresse e-mail ou le compte de service (compte principal) de l'utilisateur auquel vous souhaitez limiter l'accès.
  4. Cliquez sur l'icône Modifier le compte principal à droite du compte principal. Cette icône se présente sous la forme d'un crayon.
  5. Dans la boîte de dialogue Modifier les autorisations, cliquez sur AJOUTER UN AUTRE RÔLE.
  6. Dans le champ Filtre de la boîte de dialogue suivante, saisissez Cloud SQL Admin. Sélectionnez ensuite le rôle Administrateur Cloud SQL qui s'affiche.

    La boîte de dialogue Modifier les autorisations est active, et le rôle Administrateur Cloud SQL apparaît désormais dans la boîte de dialogue.

  7. À droite du rôle Administrateur Cloud SQL, cliquez sur le lien Ajouter une condition.
  8. Dans la boîte de dialogue Modifier la condition, fournissez les informations suivantes :
    1. Dans le champ Titre, saisissez un nom pour la condition que vous ajoutez afin de limiter l'accès aux opérations de sauvegarde pour les instances de test. Par exemple, vous pouvez saisir Limit access to backup operations.
    2. Cliquez sur l'onglet ÉDITEUR DE CONDITIONS, puis ajoutez la condition suivante :

      resource.type == "sqladmin.googleapis.com/BackupRun" &&
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. Cliquez sur SAVE (ENREGISTRER).
  10. Dans la boîte de dialogue Modifier les autorisations, cliquez sur ENREGISTRER.

gcloud

Cet exemple utilise les variables suivantes :

  • PROJECT_ID : votre projet Google Cloud.
  • USER_EMAIL : adresse e-mail de l'utilisateur.
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail complète du compte de service dont vous souhaitez limiter l'accès.

  1. Limitez le niveau d'accès du rôle cloudsql.admin pour un utilisateur disposant de l'adresse e-mail USER_EMAIL.

    Le niveau d'accès du rôle est limité aux ressources dont le nom commence par projects/PROJECT_ID/instances/test.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. OU

  3. Limitez le niveau d'accès du rôle cloudsql.admin pour un utilisateur connecté avec un compte de service SERVICE_ACCOUNT_EMAIL.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

Autoriser les utilisateurs à supprimer des instances de test, mais pas des instances de production

Supposons que vous souhaitiez autoriser un compte de service à supprimer des instances de test, mais pas des instances de production. Pour ce faire, vous pouvez utiliser des tags et ajouter les deux liaisons de stratégie suivantes pour le compte de service :

  • Un rôle Éditeur Cloud SQL sur la ressource pour laquelle vous avez attribué le rôle et ses descendants. Si le rôle est attribué au projet, il s'applique à toutes les instances du projet. Le rôle Éditeur Cloud SQL ne contient pas l'autorisation cloudsql.instances.delete.
  • Un rôle Administrateur Cloud SQL sur les instances avec le tag test

Console

  1. Dans Google Cloud Console, accédez à la page IAM.

    Accéder à IAM

  2. Cliquez sur Ajouter.
  3. Dans le champ Nouveaux membres, saisissez l'adresse e-mail du compte de service.
  4. Cliquez sur la liste déroulante Rôle et sélectionnez le rôle Éditeur Cloud SQL. N'ajoutez rien de plus pour ce rôle.
  5. Cliquez sur Enregistrer pour enregistrer la condition.
  6. Cliquez sur le menu Rôle pour le même compte, puis sélectionnez le rôle Administrateur Cloud SQL.
  7. Cliquez sur Ajouter une condition.
  8. Saisissez un titre et une description.
  9. Sélectionnez l'onglet Éditeur de conditions.
  10. Dans la section Créateur de conditions :
    • Dans le champ Type de condition – Ressource, saisissez un nom pour la condition.
    • Dans le champ Type de condition – Ressource – Service, sélectionnez sqladmin.googleapis.com.
    • Dans le champ Type de condition – Ressource – Tag, saisissez le nom de l'espace de noms associé à la clé de tag. Dans cet exemple, l'Opérateur est matches et la valeur est 815471563813/env/test.
  11. Cliquez sur Enregistrer pour enregistrer la condition.
  12. Cliquez sur Enregistrer pour enregistrer la règle.

gcloud

Cet exemple utilise les variables suivantes :

  • PROJECT_ID : votre projet Google Cloud.
  • INSTANCE_ID : votre instance Cloud SQL.
  • REGION : la région dans laquelle se trouve votre instance Cloud SQL.
  • ORGANIZATION_ID : l'ID de l'organisation qui sera la ressource parente de cette clé de tag. Par exemple : 12345678901. Pour savoir comment obtenir votre ID d'organisation, consultez la page Créer et gérer des organisations.
  • SERVICE_ACCOUNT_EMAIL : l'adresse e-mail complète du compte de service dont vous souhaitez modifier l'accès.

  1. Créez une clé de tag nommée "env" avec les valeurs de tag "prod" et "test". Pour en savoir plus, consultez la section Créer et définir un nouveau tag.
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. Associez le tag "env" avec la valeur "test" aux instances Cloud SQL de votre environnement de test. Pour en savoir plus, consultez la page Tags Cloud SQL.
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. Obtenez les liaisons de stratégie IAM existantes et générez-les dans le fichier bindings.json :
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. Ajoutez les liaisons conditionnelles suivantes au fichier bindings.json :
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
    
  6. Mettez à jour les liaisons de stratégie IAM avec le nouveau fichier bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json