Configurar o Acesso Baseado no Contexto para contas de serviço

Neste guia, descrevemos como configurar o acesso baseado no contexto para ajudar a proteger o acesso da conta de serviço às APIs do Cloud de Confiance by S3NS , com base nos níveis de acesso que você definir.

Limitações

As seguintes limitações se aplicam às políticas de acesso baseado no contexto para contas de serviço:

  • Não é possível usar atributos baseados em rede ou em endereço IP para vinculações de conta de serviço se a conta de serviço for usada para execuções de fluxo de trabalho e o Cloud Scheduler.

  • As políticas de acesso baseado no contexto não podem bloquear conexões com clusters particulares do Google Kubernetes Engine (GKE) usando kubectl ou com o Cloud SQL usando o proxy de autenticação.

  • Se um nível de acesso vinculado a uma conta de serviço tiver atributos não compatíveis, como atributos Device, o acesso baseado no contexto vai negar o acesso à API.

  • Os níveis de acesso com escopo não são compatíveis com contas de serviço.

Se você usa o Cloud Build e o Cloud Run, recomendamos que use os seguintes recursos integrados de nuvem privada virtual (VPC):

Antes de começar

  1. Verifique se você tem uma organização doCloud de Confiance e pelo menos um projeto doCloud de Confiance .
  2. Instale a CLI do Google Cloud.

  3. Configure a CLI gcloud para usar sua identidade federada.

    Para mais informações, consulte Fazer login na CLI gcloud com sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Crie ou selecione um projeto do Cloud de Confiance .

    Papéis necessários para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário ter um papel específico do IAM para selecionar um projeto. É possível selecionar qualquer projeto em que você tenha um papel.
    • Criar um projeto: para criar um projeto, é preciso ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Cloud de Confiance :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Cloud de Confiance que você está criando.

    • Selecione o projeto do Cloud de Confiance que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Cloud de Confiance .

  6. Verifique se o faturamento está ativado para o projeto do Cloud de Confiance .

  7. Ative as APIs IAM, Access Context Manager e API Resource Manager, se ainda não estiverem ativadas:

    Funções necessárias para ativar APIs

    Para ativar APIs, você precisa da permissão serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão pelo papel de proprietário (roles/owner). Caso contrário, é possível conseguir essa permissão pelo papel de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  8. Atualize os componentes da CLI do Google Cloud:
    gcloud components update --quiet
  9. Crie uma conta de serviço no projeto, se ainda não tiver uma. Essa conta de serviço é o destino da política de acesso baseado no contexto.

Funções exigidas

Nesta seção, descrevemos os papéis do Identity and Access Management (IAM) necessários para usar o acesso baseado no contexto.

Papéis para envolvidos no projeto

Para receber a permissão necessária no nível do projeto, peça ao administrador para conceder a você o papel do IAM de administrador da conta de serviço (roles/iam.serviceAccountAdmin) na conta de usuário ou de serviço. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém a permissão the required permissions, que é necessária no nível do projeto.

Também é possível receber essa permissão com papéis personalizados ou outros papéis predefinidos.

Papéis no nível da organização

Para receber a permissão necessária no nível da organização, peça ao administrador para conceder a você os seguintes papéis do IAM na conta de usuário ou de serviço:

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

Esse papel predefinido contém a permissão the required permissions, que é necessária no nível da organização.

Também é possível receber essa permissão com papéis personalizados ou outros papéis predefinidos.

Vincular políticas de acesso baseado no contexto a diferentes níveis de recursos

É possível vincular políticas de Acesso baseado no Contexto com o mesmo modo restrito a recursos que estão em diferentes níveis da hierarquia de recursos. Quando um recurso tenta acessar, o acesso baseado no contexto usa a política vinculada a esse recurso antes de tentar usar uma política vinculada a um recurso de nível mais alto.

Por exemplo, é possível vincular uma política de modo de aplicação diretamente a uma conta de serviço e uma política de modo de aplicação diferente ao projeto que contém a conta de serviço. Quando a conta de serviço tenta acessar recursos, o acesso baseado no contexto avalia a política vinculada à conta de serviço. Para outras contas de serviço no projeto que não têm políticas vinculadas, o acesso baseado no contexto avalia a política de modo restrito vinculada ao projeto. O mesmo acontece se o modo restrito estiver definido como simulação para a política para envolvidos no projeto e para a política no nível da conta de serviço.

É possível usar várias políticas para implantar políticas de forma incremental e seletiva. Por exemplo, é possível fazer o seguinte:

  1. Vincule uma política no modo de teste no nível do projeto e verifique se ela está funcionando como esperado, procurando eventos de acesso negado nos Registros de auditoria do Cloud.
  2. Vincule a política no modo restrito apenas a contas de serviço específicas.
  3. Vincule a política no modo restrito no nível do projeto e vincule uma política menos restritiva no modo restrito a contas de serviço específicas, conforme necessário.

Atributos de nível de acesso para contas de serviço

Nesta seção, listamos os atributos de nível de acesso compatíveis com contas de serviço.

Os seguintes atributos são compatíveis com contas de serviço:

  • Sub-redes de IP, que são baseadas no endereço IP público.
  • redes VPC, que são baseadas no endereço IP privado.
  • Geolocalização, que é baseada no endereço IP público.

    Quando a conta de serviço faz uma solicitação às APIs do Cloud de Confiance, o acesso baseado no contexto avalia a solicitação e compara o endereço IP dela com os endereços IP especificados na política de acesso baseado no contexto. Se os endereços IP forem iguais, o Acesso Baseado no Contexto vai permitir a chamada de API. Se os endereços IP não forem iguais, o acesso baseado no contexto vai negar a chamada de API.

  • Um nível de acesso personalizado com uma expressão da Common Expression Language (CEL). A expressão precisa ser avaliada como true para permitir o acesso e false para negá-lo.

    A expressão CEL a seguir é útil para restringir o acesso por contas de serviço.

    A expressão será avaliada como true se a solicitação for originada de um ou mais números de projeto especificados:

        expression: "originatesFromProjects(origin, ['projects/PROJECT_NUMBER'])"
        

    originatesFromProjects verifica se a solicitação vem de uma rede associada ao projeto especificado e se ela vem de um endereço IP particular.

  • Hora do dia, que se baseia na hora e na data da solicitação em um fuso horário especificado.

    Para mais informações, consulte Como configurar condições de acesso por hora e dia.

Criar um nível de acesso

Nesta seção, descrevemos como criar um nível de acesso na sua organização. Os níveis de acesso definem as condições em que o acesso é permitido.

  1. Siga as instruções para criar um nível de acesso básico ou criar um nível de acesso personalizado.

  2. Anote o nome completo do nível de acesso, que tem o formato: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME.

Criar uma vinculação de acesso

Vincule o nível de acesso à conta de serviço selecionada. Isso aplica as condições definidas no nível de acesso. É possível vincular o nível de acesso a uma única conta de serviço ou a todas as contas de serviço em um projeto.

Vincular o nível de acesso a uma conta de serviço específica

Nesta seção, descrevemos como vincular o nível de acesso a uma conta de serviço específica.

gcloud

Vincule o nível de acesso a uma conta de serviço usando a CLI gcloud.

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.s3ns.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Substitua:

  • ORGANIZATION_ID: o ID da organização do Cloud de Confiance.
  • SERVICE_ACCOUNT_NAME: o ID da conta de serviço de destino (a parte do endereço de e-mail antes do símbolo @).
  • SERVICE_ACCOUNT_PROJECT_ID: o ID do projeto que contém a conta de serviço de destino.
  • POLICY_ID: o ID da política de acesso do Access Context Manager.
  • ACCESS_LEVEL_NAME: o nome do nível de acesso que você criou.

    Para usar o acesso baseado no contexto sem aplicar o nível de acesso e proibir o acesso, vincule o nível de acesso no modo de teste.

API REST

Para vincular o nível de acesso a uma conta de serviço específica usando a API REST, execute o seguinte comando:

  1. Crie um arquivo request.json com o seguinte conteúdo:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.s3ns.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Substitua:

    • SERVICE_ACCOUNT_NAME: o ID da conta de serviço de destino (a parte do endereço de e-mail antes do símbolo @).

    • SERVICE_ACCOUNT_PROJECT_ID: o ID do projeto que contém a conta de serviço de destino.

    • POLICY_ID: o ID da política de acesso do Access Context Manager.

    • ACCESS_LEVEL_NAME: o nome do nível de acesso que você criou.

  2. Execute este comando:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que você está usando para fazer as chamadas de API.

    • ORGANIZATION_ID: o ID da organização do Cloud de Confiance.

Vincular o nível de acesso a todas as contas de serviço em um projeto

Nesta seção, descrevemos como vincular o nível de acesso a todas as contas de serviço em um projeto.

gcloud

Para vincular o nível de acesso a todas as contas de serviço em um projeto usando a CLI gcloud, execute o seguinte comando:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Substitua:

  • ORGANIZATION_ID: o ID da organização do Cloud de Confiance.
  • PROJECT_NUMBER: o número do projeto que contém todas as contas de serviço a que você quer vincular o acesso.
  • POLICY_ID: o ID da política de acesso do Access Context Manager.
  • ACCESS_LEVEL_NAME: o nome do nível de acesso que você criou.

API REST

Para vincular o nível de acesso a todas as contas de serviço em um projeto usando a API REST, faça o seguinte:

  1. Crie um arquivo request.json com o seguinte conteúdo:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Substitua:

    • PROJECT_NUMBER: o número do projeto que contém todas as contas de serviço a que você quer vincular o acesso.
    • POLICY_ID: o ID da política de acesso do Access Context Manager.
    • ACCESS_LEVEL_NAME: o nome do nível de acesso que você criou.
  2. Execute este comando:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que você está usando para fazer as chamadas de API.
    • ORGANIZATION_ID: o ID da organização do Cloud de Confiance.

Para usar o acesso baseado no contexto sem aplicar o nível de acesso e negar o acesso, vincule o nível de acesso no modo de teste.

A resposta da API para a operação de criação de vinculação inclui o nome da vinculação, que contém o ID exclusivo dela.

Usar o modo de teste

É possível vincular o nível de acesso no modo de teste. Quando você usa o modo de teste, suas contas de serviço podem continuar acessando recursos sem restrições. No entanto, se as contas de serviço tentarem um acesso que viole o nível de acesso, o Acesso Baseado no Contexto registrará a violação nos Registros de Auditoria do Cloud.

Vincular o nível de acesso no modo de teste

gcloud

Para vincular o nível de acesso no modo de teste, substitua o parâmetro --level por --dry-run-level, formatado da seguinte maneira:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

API REST

Para vincular o nível de acesso no modo de teste, crie o arquivo request.json com o seguinte conteúdo:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

Substitua:

  • TARGET_PROJECT_NUMBER: o número do projeto de destino.
  • POLICY_ID: o ID da política de acesso do Access Context Manager.
  • ACCESS_LEVEL_NAME: o nome do nível de acesso.

Verificar os Registros de Auditoria do Cloud

Nesta seção, descrevemos como verificar os Registros de auditoria do Cloud em busca de negações de acesso no modo de teste para sua conta de serviço. Para saber mais sobre como pesquisar entradas do modo de teste nos Registros de Auditoria do Cloud, consulte Ver registros do modo de teste.

Console

Para ver as negações de acesso da conta de serviço do modo de teste dos Registros de auditoria do Cloud usando o console do Cloud de Confiance , faça o seguinte:

No console do Cloud de Confiance , acesse a página Análise de registros:

Acessar a Análise de registros

Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Logging.

  1. No console do Cloud de Confiance , selecione seu projeto ou organização.

  2. No campo Consulta de registro, insira a seguinte consulta:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("SERVICE_ACCOUNT_NAME")
    
  3. No seletor de período, escolha um tempo relativo predefinido, como Últimos 30 minutos, Última hora ou Últimas 24 horas, ou especifique um período personalizado.

gcloud

Para ver as negações de acesso à conta de serviço do modo de teste dos Registros de auditoria do Cloud usando a CLI gcloud, faça o seguinte:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("SERVICE_ACCOUNT_NAME")' \
  --organization=ORGANIZATION_ID

Substitua:

  • ORGANIZATION_ID: o ID da organização.
  • SERVICE_ACCOUNT_NAME: o ID da conta de serviço (a parte do endereço de e-mail antes do símbolo @).

O comando gcloud logging read é compatível com a flag --freshness para visualizar informações de registro em períodos relativos. Por exemplo, ao adicionar --freshness=3h ao comando, é possível visualizar as entradas de registro do modo de teste nas últimas três horas.

A seguir