Use condições do IAM

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

Introdução

No Cloud SQL, pode aplicar o acesso condicional com base nos seguintes atributos:

  • Atributos de data/hora: usados para definir o acesso temporário (com data de validade), agendado ou de duração limitada aos recursos do Cloud SQL. Por exemplo, pode permitir que um utilizador aceda a uma instância da base de dados até uma data especificada. Pode usar atributos de data/hora em qualquer nível da hierarquia de recursos. Para mais informações, consulte o artigo Configurar o acesso temporário.
  • Atributos de recursos: usados para configurar o acesso condicional com base numa etiqueta, num nome de recurso, num tipo de recurso ou num atributo de serviço de recurso. No Cloud SQL, pode usar atributos de instâncias de base de dados para configurar o acesso condicional. Por exemplo, pode permitir que um utilizador aceda apenas a instâncias com uma etiqueta específica. Para mais informações, consulte o artigo Configurar o acesso baseado em recursos.

Os exemplos de utilização incluem:

  • Permitir que os utilizadores se associem a instâncias específicas.

  • Permitir que os utilizadores criem instâncias com prefixos ou sufixos específicos (por exemplo, "teste").

  • Limitar o acesso a operações de cópia de segurança para instâncias de teste

  • Permitir que os utilizadores eliminem instâncias de desenvolvimento e teste, mas não instâncias de produção.

  • Permitir que os utilizadores realizem operações administrativas em determinadas datas ou em determinadas horas.

Permita que os utilizadores se associem a instâncias específicas

Suponhamos que quer permitir que um utilizador ou uma conta de serviço tenha autorização para se ligar apenas a uma instância específica do Cloud SQL. Pode incluir uma condição de IAM na associação da política de IAM que concede a essa conta as autorizações de uma função do Cloud SQL.

Por predefinição, a função de cliente do Cloud SQL predefinida (roles/cloudsql.client), que contém a autorização cloudsql.instances.connect, autoriza o respetivo membro a ligar-se a todas as instâncias do Cloud SQL num projeto. Ao introduzir uma condição do IAM na associação de políticas, pode conceder autorização apenas à instância nomeada.

Consola

Este exemplo mostra como modificar a associação de IAM existente para o projeto de modo a atribuir a uma conta de serviço uma função de cliente do Cloud SQL para uma instância específica.

Este exemplo usa as seguintes variáveis:

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

  1. Na Google Cloud consola, aceda à página IAM.

    Aceda ao IAM

  2. Clique em Adicionar.
  3. Na caixa de entrada Novos membros, introduza o email da conta de serviço.
  4. Clique na lista pendente Função e selecione a função Cliente do Cloud SQL.
  5. Clique em Adicionar condição.
  6. Introduza um título e uma descrição.
  7. Selecione o separador Editor de condições.
  8. Na secção Construtor de condições:
    • Para Tipo de condição – Recurso – Nome, introduza projects/PROJECT_ID/instances/INSTANCE_ID
    • Certifique-se de que a condição AND está selecionada.
    • Para Tipo de condição – Recurso – Serviço, selecione sqladmin.googleapis.com.
  9. Clique em Guardar para guardar a condição.
  10. Clique em Guardar para guardar a política.

gcloud

Este exemplo mostra como modificar a associação da política de IAM existente para o projeto de modo a atribuir a uma conta de serviço específica a função de cliente do Cloud SQL, mas apenas para uma instância específica.

Este exemplo usa as seguintes variáveis:

  • PROJECT_ID: o seu Google Cloud projeto.
  • INSTANCE_ID: o nome da instância à qual quer conceder acesso.
  • SERVICE_ACCOUNT_EMAIL: o endereço de email completo da conta de serviço cujo acesso quer modificar.

  1. Obtenha as associações de políticas IAM existentes e apresente-as no ficheiro bindings.json:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
  3. Adicione a seguinte associação de funções condicional ao ficheiro 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 de IAM com o novo ficheiro bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json

Terraform

Para permitir que os utilizadores se liguem a instâncias específicas, use um recurso de dados do google_iam_policyTerraform e um google_project_iam_policy recurso 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 num Google Cloud projeto, conclua os passos nas secções seguintes.

Prepare o Cloud Shell

  1. Inicie o Cloud Shell.
  2. Defina o Google Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

    Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

Prepare o diretório

Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

  1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

    Copie o exemplo de código para o ficheiro main.tf criado recentemente.

    Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

  3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
  4. Guarde as alterações.
  5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
    terraform init

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

    terraform init -upgrade

Aplique as alterações

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

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

  2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
    terraform apply

    Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

  3. Abra o seu Google Cloud projeto para ver os resultados. Na Google Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

Eliminar as alterações

Para eliminar as alterações, faça o seguinte:

  1. Para desativar a proteção contra eliminação, no ficheiro de configuração do Terraform, defina o argumento deletion_protection como false.
    deletion_protection =  "false"
  2. Aplique a configuração do Terraform atualizada executando o seguinte comando e introduzindo yes no comando:
    terraform apply
  1. Remova os recursos aplicados anteriormente com a sua configuração do Terraform executando o seguinte comando e introduzindo yes no comando:

    terraform destroy

Limite o acesso às operações de cópia de segurança para instâncias de teste

Suponhamos que a topologia do seu serviço está configurada de modo que todas as instâncias de teste tenham o prefixo test (por exemplo, test-instance-1) e todas as instâncias de produção tenham o prefixo prod (por exemplo, prod-instance-1).

Pode limitar o acesso às operações de cópia de segurança às suas instâncias de teste para um utilizador ou uma conta de serviço. A limitação do acesso inclui a restrição das operações CREATE, GET, LIST ou DELETE a cópias de segurança para as suas instâncias de teste.

Consola

  1. Na Google Cloud consola, aceda à página IAM.

    Aceda ao IAM

  2. Clique no separador PRINCIPAIS.
  3. Localize o endereço de email ou a conta de serviço (principal) do utilizador ao qual quer restringir o acesso.
  4. Clique no ícone Editar principal à direita do principal. Este ícone aparece como um lápis.
  5. Na caixa de diálogo Editar autorizações, clique em ADICIONAR OUTRA FUNÇÃO.
  6. No campo Filtrar da caixa de diálogo seguinte, introduza Cloud SQL Admin. Em seguida, selecione a função Administrador do Cloud SQL apresentada.

    A caixa de diálogo Editar autorizações está ativa e a função Administrador do Cloud SQL aparece agora na caixa de diálogo.

  7. À direita da função Administrador do Cloud SQL, clique no link Adicionar condição.
  8. Na caixa de diálogo Editar condição, indique as seguintes informações:
    1. No campo Título, introduza um nome para a condição que está a adicionar para limitar o acesso às operações de cópia de segurança para instâncias de teste. Por exemplo, pode introduzir Limit access to backup operations.
    2. Clique no separador EDITOR DE CONDIÇÕES e, de seguida, adicione a seguinte condição:

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

  9. Clique em GUARDAR.
  10. Na caixa de diálogo Editar autorizações, clique em GUARDAR.

gcloud

Este exemplo usa as seguintes variáveis:

  • PROJECT_ID: o seu Google Cloud projeto.
  • USER_EMAIL: o endereço de email do utilizador.
  • SERVICE_ACCOUNT_EMAIL:o endereço de email completo da conta de serviço cujo acesso quer limitar.

  1. Limite o âmbito da função cloudsql.admin para um utilizador que tenha um endereço de email de USER_EMAIL.

    O âmbito da função está limitado aos recursos cujos nomes de recursos começam por 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 âmbito da função cloudsql.admin para um utilizador que tenha sessão iniciada 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 utilizadores eliminem instâncias de teste, mas não instâncias de produção

Suponhamos que quer permitir que uma conta de serviço elimine instâncias de teste, mas não instâncias de produção. Pode fazê-lo usando etiquetas e adicionando as seguintes duas associações de políticas para a conta de serviço:

  • Uma função de editor do Cloud SQL no recurso onde concedeu a função e os respetivos descendentes. Se for concedida no projeto, a função aplica-se a todas as instâncias no projeto. A função de editor do Cloud SQL não contém a autorização cloudsql.instances.delete.
  • Uma função de administrador do Cloud SQL em instâncias com a etiqueta test.

Consola

  1. Na Google Cloud consola, aceda à página IAM.

    Aceda ao IAM

  2. Clique em Adicionar.
  3. No campo Novos membros, introduza o email da conta de serviço.
  4. Clique na lista pendente Função e selecione a função Editor do Cloud SQL. Não adicione mais nada para esta função.
  5. Clique em Guardar para guardar a condição.
  6. Clique no menu Função para a mesma conta e selecione a função Administrador do Cloud SQL.
  7. Clique em Adicionar condição.
  8. Introduza um título e uma descrição.
  9. Selecione o separador Editor de condições.
  10. Na secção Construtor de condições:
    • Em Tipo de condição – Recurso – Nome, introduza um nome para a condição.
    • Para Tipo de condição – Recurso – Serviço, selecione sqladmin.googleapis.com.
    • Para Tipo de condição – Recurso – Etiqueta, introduza o nome com espaço de nomes da chave da etiqueta. Para este exemplo, o operador é matches e o valor é 815471563813/env/test.
  11. Clique em Guardar para guardar a condição.
  12. Clique em Guardar para guardar a política.

gcloud

Este exemplo usa as seguintes variáveis:

  • PROJECT_ID: o seu Google Cloud projeto.
  • INSTANCE_ID: a sua instância do Cloud SQL.
  • REGION: a região em que a sua instância do Cloud SQL se encontra.
  • ORGANIZATION_ID: O ID da organização que vai ser o recurso principal desta chave de etiqueta; por exemplo: 12345678901. Para saber como obter o ID da sua organização, consulte o artigo Criar e gerir organizações.
  • SERVICE_ACCOUNT_EMAIL:o endereço de email completo da conta de serviço cujo acesso quer modificar.

  1. Crie uma chave de etiqueta denominada "env" com os valores de etiqueta "prod" e "test". Para mais informações, consulte o artigo Criar e definir uma nova etiqueta.
    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 etiqueta `env` com o valor `test` às instâncias do Cloud SQL do seu ambiente de teste. Para mais informações, consulte a página Etiquetas 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. Obtenha as associações de políticas IAM existentes e apresente-as no ficheiro bindings.json:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
  5. Adicione as seguintes associações condicionais ao ficheiro 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 associações de políticas de IAM com o novo ficheiro bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json