Usar condições do IAM

As condições do IAM permitem definir e aplicar o controle de acesso condicional e baseado em atributos para recursos do Google Cloud, incluindo instâncias do Cloud SQL. Para mais informações sobre as Condições do IAM, consulte a página Visão geral das Condições do IAM.

Introdução

No Cloud SQL, é possível aplicar o acesso condicional com base nos atributos a seguir:

  • Atributos de data/hora: usados para definir acesso temporário (expirando), programado ou de duração limitada aos recursos do Cloud SQL. Por exemplo, é possível permitir que um usuário acesse uma instância de banco de dados até uma data específica. Também é possível usar atributos de data/hora em qualquer nível da hierarquia de recursos. Para mais informações, consulte Como configurar o acesso temporário.
  • Atributos de recurso: usados para configurar o acesso condicional com base em uma tag, um nome de recurso, tipo de recurso ou atributo de serviço do recurso. No Cloud SQL, é possível usar atributos de instâncias do banco de dados para configurar o acesso condicional. Por exemplo, permita que um usuário acesse somente instâncias com uma tag específica. Para mais informações, consulte Como configurar o acesso baseado em recursos.

Os casos de uso incluem:

  • Como permitir que os usuários se conectem a instâncias específicas

  • Como permitir que usuários criem instâncias com prefixos ou sufixos específicos (por exemplo, "teste").

  • Como limitar o acesso a operações de backup para instâncias de teste

  • Como permitir que os usuários excluam instâncias de desenvolvimento e teste, mas não instâncias de produção.

  • Como permitir que os usuários executem operações administrativas em determinadas datas ou em certos horários.

Permitir que os usuários se conectem a instâncias específicas

Suponha que você queira permitir que um usuário ou conta de serviço tenha permissão para se conectar a apenas uma instância específica do Cloud SQL. É possível incluir uma condição do IAM na vinculação da política do IAM que conceda à conta as permissões de um papel do Cloud SQL.

Por padrão, o papel predefinido de cliente do Cloud SQL (roles/cloudsql.client), que contém a permissão cloudsql.instances.connect, autoriza o membro a se conectar a todas as instâncias do Cloud SQL em um projeto. Ao introduzir uma condição do IAM na vinculação de política, é possível conceder permissão apenas à instância nomeada.

Console

Neste exemplo, você verá como modificar a vinculação atual do IAM do projeto para atribuir a uma conta de serviço um papel de cliente do Cloud SQL para uma instância específica.

Neste exemplo, usamos as seguintes variáveis:

  • PROJECT_ID: o projeto do Google Cloud
  • INSTANCE_ID: o nome da instância à qual você quer conceder acesso.

  1. No Console do Google Cloud, abra a página IAM.

    Acessar IAM

  2. Clique em Add.
  3. Na caixa de entrada Novos membros, insira o e-mail da conta de serviço.
  4. Clique na lista suspensa Papel e selecione o papel Cliente do Cloud SQL.
  5. Clique em Adicionar condição.
  6. Digite um título e uma descrição.
  7. Selecione a guia Editor da condição.
  8. Na seção Criador de condições:
    • Em Tipo de condição - Recurso - Nome, insira projects/PROJECT_ID/instances/INSTANCE_ID
    • Verifique se a condicional AND está selecionada.
    • Em Tipo de condição - Recurso - Serviço, selecione sqladmin.googleapis.com.
  9. Clique em Salvar para salvar a condição.
  10. Clique em Salvar para salvar a política.

gcloud

Neste exemplo, mostramos como modificar a vinculação atual de política do IAM para o projeto para atribuir a uma conta de serviço específica o papel de cliente do Cloud SQL, mas somente para uma instância específica.

Neste exemplo, usamos as seguintes variáveis:

  • PROJECT_ID: o projeto do Google Cloud
  • INSTANCE_ID: o nome da instância à qual você quer conceder acesso.
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail completo da conta de serviço com o acesso que você quer modificar.

  1. Reúna as vinculações de política do IAM e envie-as para o arquivo bindings.json:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. Adicione a seguinte vinculação de papel condicional ao arquivo 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. Atualize a política do IAM com o novo arquivo bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

Terraform

Para permitir que os usuários se conectem a instâncias específicas, use um recurso de dados google_iam_policy do Terraform e um recurso google_project_iam_policy do Terraform .

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
}

Aplique as alterações

Para aplicar a configuração do Terraform em um projeto do Google Cloud, conclua as etapas nas seções a seguir.

Preparar o Cloud Shell

  1. Inicie o Cloud Shell.
  2. Defina o projeto padrão do Google Cloud em que você quer aplicar as configurações do Terraform.

    Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

Preparar o diretório

Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.

  1. No Cloud Shell, crie um diretório e um novo arquivo dentro dele. O nome do arquivo precisa ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o arquivo é chamado de main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.

    Copie o exemplo de código no main.tf recém-criado.

    Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.

  3. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
  4. Salve as alterações.
  5. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
    terraform init

    Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

    terraform init -upgrade

Aplique as alterações

  1. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:
    terraform plan

    Faça as correções necessárias na configuração.

  2. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply

    Aguarde até que o Terraform exiba a mensagem "Apply complete!".

  3. Abra seu projeto do Google Cloud para ver os resultados. No console do Google Cloud, navegue até seus recursos na IU para verificar se foram criados ou atualizados pelo Terraform.

Excluir as alterações

Para excluir as mudanças, faça o seguinte:

  1. Para desativar a proteção contra exclusão, no arquivo de configuração do Terraform, defina o argumento deletion_protection como false.
    deletion_protection =  "false"
  2. Para aplicar a configuração atualizada do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply
  1. Remova os recursos aplicados anteriormente com a configuração do Terraform executando o seguinte comando e inserindo yes no prompt:

    terraform destroy

Limitar o acesso a operações de backup para instâncias de teste

Suponha que a topologia do serviço esteja configurada para que todas as instâncias de teste tenham um prefixo test (por exemplo, test-instance-1) e todas as instâncias de produção tenham um prefixo prod (por exemplo, prod-instance-1).

É possível limitar o acesso a operações de backup a instâncias de teste para um usuário ou uma conta de serviço. O limite de acesso inclui a restrição de operações CREATE, GET, LIST ou DELETE a backups das instâncias de teste.

Console

  1. No Console do Google Cloud, abra a página IAM.

    Acessar IAM

  2. Clique na guia PARTICIPANTES.
  3. Localize o endereço de e-mail ou a conta de serviço (principal) do usuário com o acesso que você quer restringir.
  4. Clique no ícone Editar participante à direita do participante. Este ícone aparece como um lápis.
  5. Na caixa de diálogo Editar permissões, clique em ADICIONAR OUTRO PAPEL.
  6. No campo Filtro da caixa de diálogo subsequente, insira Cloud SQL Admin. Em seguida, selecione o papel Administrador do Cloud SQL que será exibido.

    A caixa de diálogo Editar permissões está ativa, e o papel Administrador do Cloud SQL será exibido.

  7. À direita do papel Administrador do Cloud SQL, clique no link Adicionar condição.
  8. Na caixa de diálogo Editar condição, forneça as seguintes informações:
    1. No campo Título, insira um nome para a condição que você está adicionando para limitar o acesso às operações de backup das instâncias de teste. Por exemplo, digite Limit access to backup operations.
    2. Clique na guia EDITOR DE CONDIÇÃO e adicione a seguinte condição:

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

  9. Clique em Salvar.
  10. Na caixa de diálogo Editar permissões, clique em SALVAR.

gcloud

Neste exemplo, usamos as seguintes variáveis:

  • PROJECT_ID: o projeto do Google Cloud
  • USER_EMAIL: o endereço de e-mail do usuário.
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail completo da conta de serviço com o acesso você quer limitar.

  1. Limite o escopo do papel cloudsql.admin de um usuário que tenha um endereço de e-mail USER_EMAIL.

    O escopo do papel é limitado aos recursos com nomes que começam com 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. Limite o escopo do papel cloudsql.admin para um usuário que faça login com uma conta de serviço de 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"
        

Permitir que os usuários excluam instâncias de teste, mas não instâncias de produção

Suponha que você queira permitir que uma conta de serviço exclua instâncias de teste, mas não instâncias de produção. Para fazer isso, use tags e adicione as duas vinculações de política a seguir para a conta de serviço:

  • Um papel de editor do Cloud SQL no recurso em que você concedeu o papel e os respectivos descendentes. Se concedido no projeto, o papel se aplica a todas as instâncias no projeto. O papel de editor do Cloud SQL não contém a permissão cloudsql.instances.delete.
  • Um papel de administrador do Cloud SQL em instâncias com a tag test.

Console

  1. No Console do Google Cloud, abra a página IAM.

    Acessar IAM

  2. Clique em Add.
  3. No campo Novos membros, insira o e-mail da conta de serviço.
  4. Clique na lista suspensa Papel e selecione o papel Editor do Cloud SQL. Não adicione mais nada para esse papel.
  5. Clique em Salvar para salvar a condição.
  6. Clique no menu Papel da mesma conta e selecione o papel Administrador do Cloud SQL.
  7. Clique em Adicionar condição.
  8. Digite um título e uma descrição.
  9. Selecione a guia Editor da condição.
  10. Na seção Criador de condições:
    • Em Tipo de condição – Recurso - Nome, digite um nome para a condição.
    • Em Tipo de condição - Recurso - Serviço, selecione sqladmin.googleapis.com.
    • Em Tipo de condição - Recurso - Tag, digite o nome do namespace da chave de tag. Para este exemplo, o Operador é matches e o valor é 815471563813/env/test.
  11. Clique em Salvar para salvar a condição.
  12. Clique em Salvar para salvar a política.

gcloud

Neste exemplo, usamos as seguintes variáveis:

  • PROJECT_ID: o projeto do Google Cloud
  • INSTANCE_ID: a instância do Cloud SQL.
  • REGION: a região em que a instância do Cloud SQL está localizada.
  • ORGANIZATION_ID: o ID da organização que será o recurso pai dessa chave de tag; por exemplo: 12345678901. Para saber como conseguir o ID da organização, consulte Como criar e gerenciar organizações.
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail completo da conta de serviço com o acesso que você quer modificar.

  1. Crie uma chave de tag chamada "env" com os valores de tag "prod" e "test". Para mais informações, consulte Como criar e definir uma nova 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. Anexe a tag "env" com o valor "test" às instâncias do Cloud SQL do ambiente de teste. Para mais informações, consulte a página Tags do 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. Reúna as vinculações de política do IAM e envie-as para o arquivo bindings.json:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. Adicione as seguintes vinculações condicionais ao arquivo 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. Atualize as vinculações de política do IAM com o novo arquivo bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json