Autenticação da federação de identidade da força de trabalho

Nesta página, descrevemos como configurar e usar a federação de identidade de colaboradores (também conhecida como autenticação do IAM de terceiros) com o Cloud SQL. Com a federação de identidade de colaboradores, é possível usar seu provedor de identidade (IdP) atual, como o Microsoft Active Directory ou o Okta, para acessar instâncias do Cloud SQL sem precisar de uma Google conta.

Os principais benefícios de usar a federação de identidade de colaboradores incluem:

  • Redução da sobrecarga: não é necessário verificar domínios nem sincronizar identidades com o Cloud Identity.
  • Segurança aprimorada: gerenciamento centralizado do acesso ao banco de dados pelo IdP empresarial atual.
  • Facilidade de escalonamento: adequado para grandes organizações com necessidades complexas de gerenciamento de identidades.

Para uma descrição detalhada da federação de identidade de colaboradores, consulte a visão geral da federação de identidade de colaboradores.

Como funciona

Com a Federação de Identidade de Colaboradores, os usuários podem se autenticar no Google Cloud usando uma identidade externa. No Cloud SQL, isso significa que os principais de um pool de força de trabalho podem se conectar a instâncias do Cloud SQL para PostgreSQL.

O Cloud SQL é compatível com a federação de identidade de colaboradores pelo tipo de usuário CLOUD_IAM_WORKFORCE_IDENTITY. Para conceder acesso, o Cloud SQL valida suas credenciais da força de trabalho e a permissão do IAM no nível do projeto durante o login.

Antes de começar

Antes de configurar a autenticação de banco de dados da federação de identidade da força de trabalho, verifique se você atende aos seguintes pré-requisitos:

Papéis e permissões

Para receber as permissões necessárias para configurar e usar a autenticação da federação de identidade de colaboradores, peça ao administrador para conceder a você os seguintes papéis do IAM na organização:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

Configurar a autenticação da federação de identidade de colaboradores

As seções a seguir mostram como configurar sua instância para usar a autenticação da federação de identidade de colaboradores.

Ativar a autenticação do IAM na instância

Para ativar a autenticação do IAM, defina a flag cloudsql.iam_authentication como on.

Console

  1. No console Google Cloud , acesse a página Instâncias do Cloud SQL.

    Acesse "Instâncias do Cloud SQL"

  2. Para abrir a página Visão geral de uma instância, clique no nome dela.
  3. Clique em Editar.
  4. Abra a seção Personalizar sua instância.
  5. Expanda a seção Conexões.
  6. Em Segurança, marque a caixa de seleção Ativar autenticação do IAM do Cloud SQL.
  7. Clique em Salvar.

gcloud

Use o comando a seguir para ativar a autenticação do IAM:

gcloud sql instances patch INSTANCE_NAME \
    --database-flags=cloudsql.iam_authentication=on
  

Substitua INSTANCE_NAME pelo nome da instância.

Terraform

Adicione o bloco database_flags ao recurso google_sql_database_instance:

resource "google_sql_database_instance" "instance" {
  name             = "INSTANCE_NAME"
  database_version = "POSTGRES_15"
  region           = "REGION"

  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql.iam_authentication"
      value = "on"
    }
  }
}
  

Substitua:

  • INSTANCE_NAME: o nome da instância.
  • REGION: a região em que a instância reside.

REST v1

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto;
  • LOCATION_ID: o ID do local
  • INSTANCE_ID: o ID da instância buscada
  • REGION: a região desejada
  • DATABASE_VERSION: string de tipo enumerado da versão do banco de dados. Por exemplo: POSTGRES_12
  • PASSWORD: a senha do usuário raiz
  • MACHINE_TYPE: string de tipo enumerado do tipo de máquina (camada), como: db-custom-[CPUS]-[MEMORY_MBS]

Método HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances

Corpo JSON da solicitação:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto;
  • LOCATION_ID: o ID do local
  • INSTANCE_ID: o ID da instância buscada
  • REGION: a região desejada
  • DATABASE_VERSION: string de tipo enumerado da versão do banco de dados. Por exemplo: POSTGRES_12
  • PASSWORD: a senha do usuário raiz
  • MACHINE_TYPE: string de tipo enumerado do tipo de máquina (camada), como: db-custom-[CPUS]-[MEMORY_MBS]

Método HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances

Corpo JSON da solicitação:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Adicionar o usuário de identidade do Workforce à instância

Adicione o principal externo à sua instância usando o tipo CLOUD_IAM_WORKFORCE_IDENTITY.

Verifique se o ID do usuário usado corresponde ao valor fornecido pelo mapeamento de atributos do seu provedor de identidade de colaboradores. Normalmente, isso é configurado como um endereço de e-mail, por exemplo, cruz@example.com.

Console

  1. No console Google Cloud , acesse a página Instâncias do Cloud SQL.

    Acesse "Instâncias do Cloud SQL"

  2. Para abrir a página Visão geral de uma instância, clique no nome da instância.
  3. Selecione Usuários no menu de navegação do SQL.
  4. Clique em Adicionar conta de usuário. O painel Adicionar uma conta de usuário à instância INSTANCE_NAME é aberto.
  5. Selecione Federação de identidade de colaboradores.
  6. No campo Usuário da força de trabalho, insira o ID do usuário que você quer adicionar.
  7. Clique em Adicionar.

gcloud

Execute o comando a seguir para criar o usuário:

gcloud sql users create USER_ID \
    --instance=INSTANCE_NAME \
    --type=CLOUD_IAM_WORKFORCE_IDENTITY
  

Substitua:

  • USER_ID: o ID do usuário que você quer adicionar. Por exemplo, cruz@example.com.
  • INSTANCE_NAME: o nome da instância.

Terraform

Use o recurso google_sql_user para definir o usuário de identidade de colaboradores:

resource "google_sql_user" "workforce_user" {
  name     = "USER_ID" # e.g., "cruz@example.com"
  instance = "INSTANCE_NAME"
  type     = "CLOUD_IAM_WORKFORCE_IDENTITY"
}
  

Substitua:

  • USER_ID: o ID do usuário que você quer adicionar. Por exemplo, cruz@example.com.
  • INSTANCE_NAME: o nome da instância.

REST v1

Criar uma conta de usuário

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto;
  • INSTANCE_ID: o ID da instância em que você está adicionando o usuário.
  • USERNAME: o endereço de e-mail do usuário

Método HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

Corpo JSON da solicitação:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "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"
}

REST v1beta4

Criar uma conta de usuário

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto;
  • INSTANCE_ID: o ID da instância em que você está adicionando o usuário.
  • USERNAME: o endereço de e-mail do usuário

Método HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

Corpo JSON da solicitação:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
  }

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "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"
}

Conceder função do usuário da instância

Conceda o papel roles/cloudsql.instanceUser ao principal de identidade da força de trabalho ou a todo o pool.

Console

  1. No console Google Cloud , acesse a página Contas de serviço.

    Acessar IAM

  2. Clique em Permitir acesso.
  3. No campo Novos principais, faça o seguinte:

    • Para conceder acesso a um principal individual, insira a identidade da força de trabalho como um principal:

      principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID

    • Para conceder acesso a todo o pool, insira o pool de funcionários como um principalSet:

      principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*

  4. Na lista Papel, selecione Cloud SQL > Usuário da instância do Cloud SQL.
  5. Opcional: se você quiser se conectar usando o proxy do Cloud SQL Auth ou os conectores de linguagem do Cloud SQL, clique em Adicionar outro papel e selecione Cloud SQL > Cliente do Cloud SQL.
  6. Clique em Salvar.

gcloud

Para conceder acesso a um usuário individual, use o comando gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" \
    --role="roles/cloudsql.instanceUser"
  

Substitua:

  • USER_ID: o ID do usuário que você quer adicionar. Por exemplo, cruz@example.com.
  • POOL_ID: o ID do pool de colaboradores.
  • PROJECT_ID: o identificador do projeto que contém a instância.

Para conceder acesso a todo o pool de força de trabalho, use o comando gcloud projects add-iam-policy-binding com o formato de membro principalSet:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*" \
    --role="roles/cloudsql.instanceUser"
  

Terraform

Use o recurso google_project_iam_member para conceder o papel ao principal da força de trabalho:

resource "google_project_iam_member" "workforce_user_iam" {
  project = "PROJECT_ID"
  role    = "roles/cloudsql.instanceUser"
  member  = "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
}
  

Substitua:

  • USER_ID: o ID do usuário que você quer adicionar. Por exemplo, cruz@example.com.
  • POOL_ID: o ID do pool de colaboradores.
  • PROJECT_ID: o identificador do projeto que contém a instância.

REST

Para conceder políticas do IAM usando a API, recupere a política do IAM do projeto usando o método getIamPolicy. Em seguida, anexe a nova vinculação à política e, por fim, aplique a política atualizada usando o método setIamPolicy.

Confira a seguir um exemplo de payload de vinculação a ser anexado à sua política do IAM:

{
  "bindings": [
    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
      ]
    }
  ]
}
  

Substitua:

  • USER_ID: o ID do usuário que você quer adicionar. Por exemplo, cruz@example.com.
  • POOL_ID: o ID do pool de colaboradores.

Conceder privilégios de banco de dados

É possível especificar os papéis de banco de dados que serão concedidos ao criar o usuário de identidade de colaboradores ou conceder manualmente os privilégios de banco de dados dentro dele.

Por exemplo, para conceder privilégios manualmente:

GRANT SELECT ON TABLE_NAME TO "USER_ID";

Substitua:

  • TABLE_NAME: o nome da tabela do banco de dados.
  • USER_ID: o ID do usuário do banco de dados de identidade da força de trabalho. Por exemplo, cruz@example.com.

Conecte-se à instância

Agora é possível se conectar à instância usando a CLI gcloud ou o proxy de autenticação do Cloud SQL.

Usar a CLI gcloud

Primeiro, autentique-se com sua identidade da força de trabalho para gerar um token de login.

  1. Para autenticar usando a federação de identidade da força de trabalho, use o comando gcloud auth login com a flag --cred-file:

    gcloud auth login --cred-file=CONFIGURATION_FILE
    

    Substitua CONFIGURATION_FILE pelo caminho do arquivo de configuração gerado para seu provedor de identidade da força de trabalho.

  2. Para se conectar usando um token gerado, execute o seguinte comando:

    bash export PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"

    Substitua:

  3. INSTANCE_IP: o endereço IP da instância do Cloud SQL.

  4. USER_ID: o ID do usuário da força de trabalho. Por exemplo, cruz@example.com.

  5. DB_NAME: o nome do banco de dados a que você quer se conectar.

Como usar o proxy do Cloud SQL Auth

Inicie o proxy com a flag --auto-iam-authn:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn

Para mais informações sobre o proxy, consulte Sobre o proxy de autenticação do Cloud SQL.

Restrições e limitações

  • ID de usuário duplicado em vários pools: o Cloud SQL não consegue distinguir entre assuntos com o mesmo ID de usuário em diferentes pools de força de trabalho ou provedores de identidade. Se você usa vários pools ou provedores de força de trabalho, é necessário usar políticas do IAM para garantir que não conceda a permissão de login roles/cloudsql.instanceUser a nomes de assunto duplicados de diferentes pools ou provedores. Isso impede o acesso não autorizado de outro pool ou provedor com o mesmo ID de usuário.
  • Cota de login: há uma cota de 12.000 logins por minuto para cada instância, que inclui tentativas de login bem-sucedidas e malsucedidas. Quando a cota é excedida, os logins ficam temporariamente indisponíveis. Recomendamos evitar logins frequentes e restringi-los usando redes autorizadas.

A seguir