Configure contas de serviço especificadas pelo utilizador

Para seguir o princípio do menor privilégio no Cloud Build, pode configurar o Cloud Build para usar uma conta de serviço com privilégios suficientes para executar uma compilação. Esta página explica como configurar uma conta de serviço.

Se não especificar uma conta de serviço, o Cloud Build pode selecionar automaticamente uma conta de serviço para executar compilações em seu nome. Esta conta de serviço pode ter autorizações desnecessariamente amplas para o seu exemplo de utilização, como acesso aos seus Cloud Source Repositories e a qualquer contentor do Cloud Storage no seu projeto.

Para melhorar a postura de segurança dos seus projetos e reduzir o potencial impacto de configurações incorretas ou utilizadores maliciosos, recomendamos que siga o princípio do privilégio mínimo. Ao adotar este princípio, pode atribuir a cada conta de serviço as autorizações e as funções com âmbito na tarefa que executa. Por exemplo, pode usar uma conta de serviço para criar e enviar imagens para o Artifact Registry, conforme mostrado no Google Cloud blogue.

Antes de começar

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • Se planeia usar esta conta para criar e gerir credenciais, por exemplo, para criar credenciais de curta duração, ative a API IAM Service Account Credentials.

    Enable the IAM Service Account Credentials API.

    Enable the API

  • Crie uma conta de serviço, se ainda não o tiver feito.

Conceda autorizações de IAM

Para permitir que a sua compilação aceda aos serviços aos quais precisa de se ligar, tem de conceder algumas funções e autorizações:

  1. Abra a página de definições do Cloud Build:

    Abra a página de definições do Cloud Build

    É apresentado o separador Autorizações da conta de serviço:

    Captura de ecrã da página de autorizações da conta de serviço

  2. Na lista pendente, selecione a conta de serviço cujas funções quer alterar.

  3. Defina o estado da função que quer adicionar como Ativar.

  4. Se a função de que precisa para a sua pipeline de compilação não estiver listada aqui, pode conceder funções adicionais na página de configurações de IAM.

Pode encontrar informações adicionais sobre as funções normalmente necessárias para uma compilação em Configurar o acesso aos recursos do Cloud Build e na lista completa de funções e autorizações do IAM do Cloud Build.

Configure registos de compilação

Quando especifica a sua própria conta de serviço para compilações, tem de armazenar os registos de compilação no Cloud Logging ou num contentor do Cloud Storage criado pelo utilizador. Não pode armazenar os seus registos no contentor de registos predefinido.

Execute uma compilação com um ficheiro de configuração

Para executar manualmente uma compilação com um ficheiro de configuração:

  1. No diretório raiz do projeto, crie um ficheiro de configuração de compilação do Cloud Build denominado cloudbuild.yaml ou cloudbuild.json.

  2. Adicione o campo serviceAccount e a configuração de registo preferida.

    • Se estiver a armazenar os registos de compilação no Cloud Logging, adicione um campo logging e defina o valor do campo como CLOUD_LOGGING_ONLY.

    • Se estiver a armazenar os registos de compilação num contentor do Cloud Storage criado pelo utilizador:

      • Adicione um campo logging e defina o respetivo valor como GCS_ONLY.
      • Adicione um campo logsBucket e defina o respetivo valor como a localização do contentor do Cloud Storage.

    O exemplo seguinte configura o Cloud Build para executar compilações através de uma conta de serviço especificada pelo utilizador e configura os registos de compilação para serem armazenados num contentor do Cloud Storage criado pelo utilizador:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    
    

    Substitua os valores dos marcadores de posição no ficheiro de configuração de compilação pelo seguinte:

    • LOGS_BUCKET_LOCATION é o contentor do Cloud Storage para armazenar registos de compilação. Por exemplo, gs://mylogsbucket.
    • PROJECT_ID é o ID do Google Cloud projeto onde está a executar a compilação.
    • SERVICE_ACCOUNT é o endereço de email ou o ID exclusivo da conta de serviço que quer especificar para compilações. Por exemplo, um endereço de email de uma conta de serviço tem o seguinte aspeto: service-account-name@project-id.iam.gserviceaccount.com.
  3. Inicie a compilação com o ficheiro de configuração de compilação:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Substitua os valores dos marcadores de posição nos comandos acima pelo seguinte:

    • CONFIG_FILE_PATH é o caminho para o ficheiro de configuração de compilação.
    • SOURCE_DIRECTORY é o caminho ou o URL para o código-fonte.

    Se não especificar um CONFIG_FILE_PATH e um SOURCE_DIRECTORY no comando gcloud builds submit, o Cloud Build assume que o ficheiro de configuração de compilação e o código-fonte estão no diretório de trabalho atual.

Execute compilações através de acionadores

Para executar uma compilação com acionadores do Cloud Build usando a sua própria conta de serviço, configure a opção de registo preferida e selecione a conta de serviço preferida quando criar o acionador.

  1. No ficheiro de configuração de compilação:

    • Se estiver a armazenar os registos de compilação no Cloud Logging, adicione um campo logging e defina o valor do campo como CLOUD_LOGGING_ONLY.

    • Se estiver a armazenar os registos de compilação num contentor do Cloud Storage criado pelo utilizador:

      • Adicione um campo logging e defina o respetivo valor como GCS_ONLY.
      • Adicione um campo logsBucket e defina o respetivo valor como a localização do contentor do Cloud Storage.

    O exemplo seguinte configura os registos de compilação para serem armazenados num contentor do Cloud Storage criado pelo utilizador:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    

    Substitua LOGS_BUCKET_LOCATION pelo contentor do Cloud Storage para armazenar registos de compilação. Por exemplo, gs://mylogsbucket.

  2. Especifique uma conta de serviço a usar com o seu acionador de compilação:

    Consola

    Para executar compilações através da página Acionador na Google Cloud consola, a conta de serviço especificada pelo utilizador tem de estar no mesmo projeto que o acionador de compilação. Para usar acionadores com contas de serviço entre projetos, crie o acionador de compilação com a ferramenta gcloud.

    1. Crie ou edite o acionador de compilação.

    2. No campo Conta de serviço, especifique a sua conta de serviço. Se não especificar uma conta de serviço, o Cloud Build usa a conta de serviço predefinida.

    3. Clique em Criar para guardar o acionador de compilação.

    gcloud

    Quando criar um acionador de compilação, especifique a sua conta de serviço através da flag --service-account. No exemplo seguinte, o comando gcloud cria um acionador de compilação que extrai código de um repositório Git:

    gcloud builds triggers create github \
       --name=TRIGGER_NAME \
       --repo-name=REPO_NAME \
       --repo-owner=REPO_OWNER \
       --branch-pattern=BRANCH_PATTERN
       --build-config=BUILD_CONFIG_FILE
       --service-account=SERVICE_ACCOUNT
       --project=BUILD_PROJECT
    

    Substitua os valores dos marcadores de posição no ficheiro de configuração de compilação pelo seguinte:

    • TRIGGER_NAME é o nome do acionador de compilação.
    • REPO_NAME é o nome do seu repositório.
    • REPO_OWNER é o nome de utilizador do proprietário do repositório.
    • BRANCH_PATTERN é o nome do ramo no seu repositório para invocar a compilação.
    • TAG_PATTERN é o nome da etiqueta no seu repositório para invocar a compilação.
    • BUILD_CONFIG_FILE é o caminho para o ficheiro de configuração de compilação.
    • SERVICE_ACCOUNT é a sua conta de serviço no formato /projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL.
    • BUILD_PROJECT é o projeto onde está a começar a criar.

Configuração entre projetos

Se a conta de serviço especificada pelo utilizador estiver num projeto diferente do projeto onde está a iniciar as compilações, conceda o acesso necessário:

  • No projeto que tem a sua conta de serviço especificada pelo utilizador, certifique-se de que a iam.disableCrossProjectServiceAccountUsage restrição da política da organização não é aplicada. Esta restrição é aplicada por predefinição. Para desativar esta restrição da política da organização, execute o seguinte comando em que SERVICE_ACCOUNT_PROJECT_ID é o projeto que contém a conta de serviço especificada pelo utilizador:

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    
  • No projeto que tem a sua conta de serviço especificada pelo utilizador, conceda a função roles/iam.serviceAccountTokenCreator ao agente de serviço do Cloud Build do projeto onde está a executar compilações:

    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member="serviceAccount:BUILD_SERVICE_AGENT" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    Substitua os valores dos marcadores de posição no comando pelo seguinte:

    • SERVICE_ACCOUNT_PROJECT_ID: o ID do projeto do projeto que contém a conta de serviço especificada pelo utilizador.
    • BUILD_SERVICE_AGENT: o ID do email do agente de serviço no formato service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com, em que BUILD_PROJECT_NUMBER é o número do projeto do projeto onde está a executar compilações. Pode obter o número do projeto na página de definições do projeto.

Limitações:

  • O seu Google Cloud projeto tem de estar numa Google Cloud organização.

  • Tem de iniciar as compilações na linha de comandos com gcloud builds submit ou gcloud builds triggers create. Para usar a página Acionadores na Google Cloud consola, a conta de serviço especificada pelo utilizador e o acionador de compilação têm de estar no mesmo projeto.

O que se segue?