Ajouter et gérer des utilisateurs utilisant l'authentification IAM pour les bases de données

Cette page explique comment ajouter un compte d'utilisateur ou de service qui utilise l'authentification IAM pour les bases de données à une base de données et comment gérer ces comptes d'utilisateur et de service. Pour en savoir plus sur l'intégration IAM, consultez la page Présentation de l'authentification IAM pour les bases de données.

Avant de commencer

  1. 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 gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Installez et initialisez le SDK Cloud.
  5. Activez Cloud Key Management Service API.

    Activer l'API

  6. Assurez-vous que vous disposez du rôle d'administrateur Cloud SQL sur votre compte utilisateur.

    Accéder à la page IAM

  7. Activez l'authentification IAM pour les bases de données sur votre instance Cloud SQL.
  8. Assurez-vous d'accorder un accès IAM aux utilisateurs qui en ont besoin pour chaque projet contenant des bases de données auxquelles les utilisateurs doivent accéder. Consultez Accorder, modifier et révoquer les accès à des ressources.
  9. Assurez-vous d'avoir ajouté un compte de service pour chaque service nécessitant un accès aux bases de données du projet.

Ajouter un compte d'utilisateur ou de service IAM à la base de données

Vous devez créer un utilisateur de base de données pour chaque utilisateur IAM devant pouvoir accéder à l'instance de base de données. Le nom d'utilisateur de la base de données doit correspondre à l'adresse e-mail de l'utilisateur IAM, par exemple test-user@gmail.com.

Lorsque vous utilisez des commandes REST, le nom d'utilisateur doit utiliser être placé entre des guillemets car il contient des caractères spéciaux (@ et .).

Les comptes de service utilisent le format service-account-name@project-id.iam.gserviceaccount.com. Lorsque vous ajoutez un compte de service IAM à la base de données, il n'est pas nécessaire d'indiquer le domaine .gserviceaccount.com.

Pour ajouter un compte d'utilisateur ou de service IAM, vous devez ajouter un nouvel utilisateur de base de données et sélectionner IAM en tant que méthode d'authentification :

Console

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

    Accéder à la page Instances Cloud SQL

  2. Cliquez sur le nom de l'instance pour ouvrir la page Présentation.
  3. Dans le menu de navigation SQL, sélectionnez Utilisateurs.
  4. Cliquez sur Ajouter un compte utilisateur. L'onglet Ajouter un compte d'utilisateur à l'instance nom_instance s'ouvre.
  5. Cochez la case d'option Cloud IAM.
  6. Ajoutez l'adresse e-mail du compte d'utilisateur ou de service que vous souhaitez ajouter dans le champ Membre.
  7. Cliquez sur Ajouter. L'utilisateur figure maintenant dans la liste des utilisateurs.
  8. Pour accorder des privilèges de connexion utilisateur, cliquez sur triangle et sélectionnez Ajouter un rôle IAM. Cette action attribue à l'utilisateur le rôle Utilisateur d'instance Cloud SQL.

gcloud

Création de compte utilisateur

Utilisez l'adresse e-mail, telle que test-user@gmail.com, pour identifier l'utilisateur.

Remplacez l'élément suivant :

  • USERNAME : l'adresse e-mail de l'utilisateur
  • INSTANCE_NAME : le nom de l'instance à laquelle vous souhaitez autoriser l'utilisateur à accéder
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

Créer un compte de service

Remplacez l'élément suivant :

  • USERNAME : l'adresse e-mail du compte de service. En raison de la limite de longueur du nom d'utilisateur de la base de données, vous devez omettre le suffixe .gserviceaccount.com dans l'e-mail. Par exemple, le nom d'utilisateur du compte de service sa-name@project-id.iam.gserviceaccount.com doit être sa-name@project-id.iam.
  • INSTANCE_NAME : le nom de l'instance à laquelle vous souhaitez autoriser le compte de service à accéder
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

REST v1

Création de compte utilisateur

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • project-id : ID de votre projet
  • instance-id : ID de l'instance à laquelle vous ajoutez l'utilisateur
  • user-name : adresse e-mail de l'utilisateur
  • operation-id : ID de l'opération

Méthode HTTP et URL :

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Corps JSON de la requête :

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Créer un compte de service

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • service-account-id : ID de votre compte de service
  • project-id : ID de votre projet
  • instance-id : ID de l'instance à laquelle vous ajoutez le compte de service
  • operation-id : ID de l'opération

Méthode HTTP et URL :

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Corps JSON de la requête :

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

REST v1beta4

Création de compte utilisateur

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • project-id : ID de votre projet
  • instance-id : ID de l'instance à laquelle vous ajoutez l'utilisateur
  • user-name : adresse e-mail de l'utilisateur
  • operation-id : ID de l'opération

Méthode HTTP et URL :

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Corps JSON de la requête :

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Créer un compte de service

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • service-account-id : ID de votre compte de service
  • project-id : ID de votre projet
  • instance-id : ID de l'instance à laquelle vous ajoutez le compte de service
  • operation-id : ID de l'opération

Méthode HTTP et URL :

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Corps JSON de la requête :

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Accorder des droits pour une base de données à l'utilisateur IAM

Lorsqu'un utilisateur IAM est ajouté à une instance de base de données, ce nouvel utilisateur ne dispose par défaut d'aucun droit sur les bases de données.

Lorsqu'un utilisateur ou un compte de service se connecte à une base de données, il peut exécuter des requêtes sur tous les objets de base de données dont l'accès a été accordé à PUBLIC.

Si l'utilisateur a besoin d'un accès supplémentaire, des droits supplémentaires peuvent lui être accordés à l'aide de l'instruction GRANT. Consultez la page de référence GRANT pour obtenir la liste complète des droits que vous pouvez accorder aux utilisateurs et aux comptes de service. Exécutez la commande GRANT à partir de la ligne de commande.

Remplacez l'élément suivant :

  • TABLE_NAME : nom de la table.
    postgres=> grant select on TABLE_NAME to "USERNAME";
    
  • Supprimer un compte d'utilisateur ou de service IAM de la base de données

    Pour supprimer un compte d'utilisateur ou de service de la base de données, supprimez-le de l'instance :

    Console

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

      Accéder à la page Instances Cloud SQL

    2. Cliquez sur le nom de l'instance pour ouvrir la page Présentation.
    3. Dans le menu de navigation SQL, sélectionnez Utilisateurs.
    4. Cliquez sur l'élément correspondant à l'utilisateur que vous souhaitez supprimer.
    5. Sélectionnez Supprimer. Cette opération révoque l'accès à cette instance uniquement.

    gcloud

    Révoquer un utilisateur

    Utilisez l'adresse e-mail, telle que test-user@gmail.com, pour identifier l'utilisateur.

    Remplacez l'élément suivant :

    • USERNAME : adresse e-mail sans le @nom de domaine.
    • INSTANCE_NAME : le nom de l'instance de laquelle vous souhaitez supprimer l'utilisateur.
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    Supprimer un compte de service

    Remplacez l'élément suivant :

    • USERNAME : l'adresse e-mail du compte de service. En raison de la limite de longueur du nom d'utilisateur de la base de données, vous devez omettre le suffixe .gserviceaccount.com dans l'e-mail. Par exemple, le nom d'utilisateur du compte de service sa-name@project-id.iam.gserviceaccount.com doit être sa-name@project-id.iam.
    • INSTANCE_NAME : le nom de l'instance de laquelle vous souhaitez supprimer l'utilisateur.
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    REST v1beta4

    La requête ci-dessous exécute la méthode users.delete pour supprimer le compte utilisateur spécifié.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • project-id : ID de votre projet
    • instance-id : ID de l'instance souhaitée
    • user-id : ID de l'utilisateur

    Méthode HTTP et URL :

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=&name=user-id

    Corps JSON de la requête :

    {
      "name": "user-id",
      "host": ""
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

    Afficher les informations de connexion dans les journaux d'audit

    Vous pouvez activer les journaux d'audit pour capturer les connexions IAM à la base de données. En cas de problèmes de connexion, vous pouvez utiliser les journaux d'audit pour diagnostiquer le problème.

    Remarque : La journalisation d'audit entraîne des frais supplémentaires. Pour en savoir plus, consultez la section Tarifs des données de journalisation.

    Une fois le service configuré, vous pouvez afficher les journaux d'audit d'accès aux données correspondant aux connexions réussies à l'aide de la visionneuse de journaux.

    Par exemple, un journal peut contenir des informations semblables aux suivantes :

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    Résoudre un échec de connexion

    Lorsqu'une tentative de connexion échoue, PostgreSQL renvoie un message d'erreur minimal pour des raisons de sécurité. Exemple :

    PGPASSWORD=not-a-password psql --host=... --username=... --dbname=...
    psql: error: could not connect to server: FATAL:  Cloud SQL IAM user authentication failed for user "..."
    FATAL:  pg_hba.conf rejects connection for host "...", user "...", database "...", SSL off
    

    Vous pouvez consulter les journaux d'erreur PostgreSQL pour obtenir plus de détails à propos de l'erreur. Pour en savoir plus, consultez la section Afficher les journaux.

    Par exemple, pour l'erreur précédente, l'entrée de journal suivante explique l'action que vous pouvez effectuer pour résoudre le problème.

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    Vérifiez le message d'erreur que vous recevez. Si le message n'indique pas que vous avez utilisé l'"Authentification IAM de l'utilisateur Cloud SQL" ou l'Authentification IAM du compte de service Cloud SQL", vérifiez que le type d'utilisateur de base de données utilisé pour se connecter est CLOUD_IAM_USER ou CLOUD_IAM_SERVICE_ACCOUNT. Vous pouvez le vérifier à l'aide de la console ou de la commande gcloud sql users list. Pour un utilisateur IAM, vérifiez que le nom d'utilisateur de la base de données correspond à l'adresse e-mail de l'utilisateur IAM.

    Si vous avez utilisé l'authentification IAM pour les bases de données, vérifiez les détails du message d'erreur. Vous pouvez trouver le message d'erreur dans le journal d'erreurs de la base de données. Si le jeton d'accès (OAuth 2.0) que vous avez envoyé en tant que mot de passe n'est pas valide, vous pouvez utiliser la commande gcloud gcloud auth application-default print-access-token pour obtenir les détails du jeton, comme suit :

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo
    

    Vérifiez que le jeton correspond à l'utilisateur ou au compte de service IAM prévu et n'a pas expiré.

    Si les informations indiquent qu'il manque une autorisation, vérifiez que l'utilisateur ou le compte de service IAM dispose de l'autorisation cloudsql.instances.login en utilisant le rôle prédéfini Cloud SQL Instance User ou le rôle personnalisé dans la stratégie IAM du projet de l'instance. . Utilisez l'outil Policy Troubleshooter d'IAM pour obtenir plus d'aide.

    Si une connexion échoue en raison de l'indisponibilité de l'authentification IAM pour les bases de données, l'utilisateur peut se connecter à l'aide de l'utilisateur et du mot de passe PostgreSQL par défaut. Cette méthode de connexion donne toujours à l'utilisateur l'accès à la base de données complète. Vérifiez que la connexion est sécurisée.

    Étape suivante