Como usar credenciais criptografadas do Cloud KMS

O Cloud Key Management Service é um serviço do Google Cloud em que é possível gerenciar e usar chaves criptográficas. Nesta página, explicamos como usar informações criptografadas do Cloud KMS no Cloud Build.

Antes de começar

  • Ative as APIs Cloud Build and Cloud KMS.

    Ative as APIs

  • Para usar os exemplos de linha de comando deste guia, instale e configure o SDK do Cloud.

  • Criptografe as informações confidenciais usando o Cloud KMS. O Cloud KMS salva o conteúdo criptografado em um arquivo.

  • [OPCIONAL] Para configurar versões para usar dados criptografados, converta ENCRYPTED_FILE em base64. Esta etapa não é necessária para configurações de criação que usam arquivos criptografados:

        base64 ENCRYPTED_FILE
    

Permissões do IAM obrigatórias

Conceda o papel do IAM de Descriptografador do Cloud KMS CryptoKey (roles/cloudkms.cryptoKeyDecrypter) à conta de serviço do Cloud Build:

  1. No Console do Cloud, acesse a página Configurações do Cloud Build:

    Abrir a página "Configurações"

  2. Localize a linha com o papel Descriptografador de CryptoKey do Cloud KMS e defina o Status como ENABLED.

Como configurar builds para usar dados criptografados

  1. No diretório raiz do projeto, crie um arquivo de configuração da versão do Cloud Build chamado cloudbuild.yaml ou cloudbuild.json.

  2. No arquivo de configuração de build, faça o seguinte:

    • Depois de todo o build steps, adicione um campo availableSecrets para especificar o valor criptografado como uma variável de ambiente e kmsKeyName a ser usado para descriptografá-lo. É possível usar variáveis de substituição no valor de kmsKeyName.
    • Na etapa de criação em que você quer especificar o secret:
      • Adicione um campo entrypoint apontando para bash para usar a ferramenta bash na etapa de criação. Isso é necessário para consultar a variável de ambiente do secret.
      • Adicione um campo secretEnv especificando a variável de ambiente para o valor criptografado.
      • No campo args, adicione uma sinalização -c como o primeiro argumento. Qualquer string que você passa depois de -c é tratada como um comando. Para mais informações sobre como executar comandos bash com -c, consulte a documentação do bash (em inglês).
      • Ao especificar o valor criptografado no campo args, especifique-o usando a variável de ambiente com o prefixo $$.

    O exemplo de arquivo de configuração de versão a seguir mostra como fazer login no Docker e extrair uma imagem particular:

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker pull $$USERNAME/IMAGE:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       inline:
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME
         envMap:
           USERNAME: 'ENCRYPTED_USERNAME'
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME
         envMap:
           PASSWORD: 'ENCRYPTED_PASSWORD'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker pull $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "inline": [{
          "kmsKeyName":  "projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME",
          "envMap": {
            "USERNAME": "ENCRYPTED_USERNAME"
           }
       },
       {
        "kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME",
        "envMap": {
            "PASSWORD": "ENCRYPTED_PASSWORD"
           }
       }]
     }
    }
    

    Substitua os valores dos marcadores nos comandos acima pelo seguinte:

    • PROJECT_ID: o ID do projeto do Cloud com o serviço do Cloud KMS.
    • USERNAME_KEYRING_NAME: o nome do keyring do nome de usuário do Docker.
    • USERNAME_KEY_NAME: o nome da chave do seu nome de usuário do Docker.
    • ENCRYPTED_USERNAME pelo nome de usuário do Docker criptografado no formato base64.
    • PASSWORD_KEYRING_NAME: o nome do keyring da senha do Docker.
    • PASSWORD_KEY_NAME: o nome da chave da senha do Docker.
    • ENCRYPTED_PASSWORD: sua senha do Docker criptografada no formato base64.
    • REPOSITORY: o nome do repositório do Docker de onde você está puxando a imagem.
    • TAG: o nome da tag da sua imagem.

  3. Use o arquivo de configuração de build para iniciar manualmente um build ou para automatizar builds usando acionadores.

Como configurar builds para usar arquivos criptografados

  1. No diretório raiz do projeto, crie um arquivo de configuração da versão do Cloud Build chamado cloudbuild.yaml ou cloudbuild.json.

  2. No arquivo de configuração da versão, antes de qualquer etapa de criação que interaja com o arquivo descriptografado, adicione uma etapa da criação gcloud para descriptografar o arquivo usando a chave. O exemplo de arquivo de configuração de versão a seguir mostra como fazer login no Docker usando o arquivo criptografado com senha do Docker:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      args:
      - kms
      - decrypt
      - "--ciphertext-file=ENCRYPTED_PASSWORD_FILE"
      - "--plaintext-file=PLAINTEXT_PASSWORD_FILE"
      - "--location=global"
      - "--keyring=KEYRING_NAME"
      - "--key=KEY_NAME"
    - name: gcr.io/cloud-builders/docker
      entrypoint: bash
      args:
      - "-c"
      - docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "args": [
          "kms",
          "decrypt",
          "--ciphertext-file=ENCRYPTED_PASSWORD_FILE",
          "--plaintext-file=PLAINTEXT_PASSWORD_FILE",
          "--location=global",
          "--keyring=KEYRING_NAME",
          "--key=KEY_NAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE"
        ]
       }
      ]
    }
    

    Substitua os valores dos marcadores nos comandos acima pelo seguinte:

    • KEYRING_NAME: o nome do keyring da senha do Docker.
    • KEY_NAME: o nome da chave da senha do Docker.
    • ENCRYPTED_PASSWORD_FILE: arquivo criptografado com a senha do Docker.
    • PLAINTEXT_PASSWORD_FILE: arquivo de texto simples com a senha do Docker.
  3. Use o arquivo de configuração de build para iniciar manualmente um build ou para automatizar builds usando acionadores.

Como configurar builds para usar dados criptografados (legado)

Para criptografar dados confidenciais usando o Cloud KMS e usar esses dados em um arquivo de configuração de versão:

  1. No arquivo de configuração da versão, adicione um campo secrets para especificar o valor criptografado e o CryptoKey a ser usado para descriptografá-lo. Em seguida, na etapa de versão em que você quer usar a variável criptografada, adicione um campo secretEnv para especificar a variável como uma variável de ambiente. Inclua o nome da variável no campo secretEnv. Se você especificar o valor da variável ou uma variável de ambiente não secreta com o mesmo nome, o Cloud Build emitirá um erro.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=user-name --password=$$PASSWORD']
      secretEnv: ['PASSWORD']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'user-name/myubuntu']
    secrets:
    - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name
      secretEnv:
        PASSWORD: 'encrypted-password'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=user-name --password=$$PASSWORD"
        ],
        "secretEnv": [
          "PASSWORD"
         ]
       },
       {
         "name": "gcr.io/cloud-builders/docker",
         "args": [
           "push",
           "user-name/myubuntu"
          ]
       }
       ],
       "secrets": [
       {
         "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name",
         "secretEnv": {
           "PASSWORD": "encrypted-password"
         }
       }
       ]
    }
    

A seguir