Menggunakan secret dari Secret Manager

Halaman ini menjelaskan cara menyertakan informasi sensitif seperti sandi dan kunci API di Cloud Build.

Secret Manager adalah layanan Google Cloud yang menyimpan kunci API, sandi, dan data sensitif lainnya dengan aman. Untuk menyertakan informasi sensitif dalam build, Anda dapat menyimpan informasi di Secret Manager, lalu mengonfigurasi build untuk mengakses informasi dari Secret Manager.

Sebelum memulai

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  • Untuk menggunakan contoh command line dalam panduan ini, instal dan konfigurasikan Google Cloud CLI.

  • Pastikan Anda telah menyimpan secret di Secret Manager. Untuk mengetahui petunjuknya, lihat Membuat secret.

    • Catat nama secret dan versi secret Anda. Anda memerlukan informasi ini untuk mengonfigurasi Cloud Build agar dapat mengakses secret.

Izin IAM yang diperlukan

Berikan peran IAM Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) untuk secret ke akun layanan yang Anda gunakan untuk build:

  1. Buka halaman Secret Manager di konsol Google Cloud:

    Buka halaman Secret Manager

  2. Centang kotak secret yang ingin Anda gunakan dalam build.

  3. Jika belum terbuka, klik Tampilkan panel info untuk membuka panel.

  4. Di panel, pada bagian Permissions, klik Add principal.

  5. Di kolom New principals, masukkan alamat email akun layanan Anda.

  6. Di kotak drop-down Select a role, pilih Secret Manager Secret Accessor.

  7. Klik Simpan.

Mengonfigurasi build untuk mengakses secret UTF-8 dari Secret Manager

  1. Di direktori utama project, buat file konfigurasi Cloud Build bernama cloudbuild.yaml atau cloudbuild.json.

  2. Di file konfigurasi build:

    • Setelah semua build steps, tambahkan kolom availableSecrets untuk menentukan versi secret dan variabel lingkungan yang akan digunakan untuk secret Anda. Anda dapat menyertakan variabel penggantian dalam nilai kolom secretVersion. Anda dapat menentukan lebih dari satu secret dalam build.
    • Pada langkah build tempat Anda ingin menentukan secret:
      • Tambahkan kolom entrypoint yang mengarah ke bash untuk menggunakan alat bash di langkah build. Hal ini diperlukan untuk merujuk ke variabel lingkungan untuk secret.
      • Tambahkan kolom secretEnv yang menentukan variabel lingkungan.
      • Di kolom args, tambahkan flag -c sebagai argumen pertama. Setiap string yang Anda teruskan setelah -c akan diperlakukan sebagai perintah. Untuk informasi selengkapnya tentang cara menjalankan perintah bash dengan -c, lihat dokumentasi bash.
      • Saat menentukan secret di kolom args, tentukan secret menggunakan variabel lingkungan yang diawali dengan $$.

    The following example build config file shows how to login to Docker using the Docker username and password stored in Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
  3. Use the build config file to start a build using the command line or to automate builds using triggers.

Example: Accessing secrets from scripts and processes

secretEnv field adds the value of the secret to the environment and you can access this value via environment variable from scripts or processes:

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

The following contents of main.py prints the first five characters of the secret:

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

Example: authenticating to Docker

In some situations, before interacting with Docker images, your build would need to authenticate to Docker. For example, Docker authentication is required for builds to pull private images and push private or public images to Docker Hub. In these cases, you can store your Docker username and password in Secret Manager and then configure Cloud Build to access the username and password from Secret Manager. For instructions on doing this see Interacting with Docker Hub images.

Example: GitHub pull request creation

Another example where you might want to configure your build to access a sensitive information from Secret Manager is for creating a GitHub pull request in response to builds. To do this:

  • Create a GitHub token.
  • Store the GitHub token in Secret Manager.
  • In your build config file:
    • After all the build steps, add an availableSecrets field to specify the secret version and the environment variable to use for the GitHub token.
    • Add a build step to invoke the command to create a GitHub pull request.
  • Create a GitHub app trigger and use the build config file to invoke the trigger.

The following example config file shows how to create a GitHub pull request using the GitHub token:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

Ganti nilai placeholder dalam perintah di atas dengan yang berikut ini:

  • PROJECT_ID: ID project Google Cloud tempat Anda menyimpan secret.
  • GITHUB_USERNAME: Nama pengguna GitHub pemilik repositori.
  • REPO_NAME: Nama repositori GitHub.
  • HEAD_BRANCH: Nama cabang tempat perubahan diimplementasikan. Untuk permintaan pull lintas repositori di jaringan yang sama, namespace head dengan pengguna seperti ini: username:branch.
  • BASE_BRANCH: Nama cabang tempat Anda ingin perubahan ditarik. Cabang ini harus merupakan cabang yang ada di repositori saat ini. Anda tidak dapat mengirimkan permintaan pull ke satu repositori yang meminta penggabungan ke basis repositori lain.
  • GH_TOKEN_SECRET_NAME: Nama secret yang sesuai dengan token GitHub Anda.
  • NEW_PR: Pull request baru yang ingin Anda buat.

Mengonfigurasi build untuk mengakses secret non-UTF-8 dari Secret Manager

  1. Dalam file konfigurasi build, tambahkan langkah build untuk mengakses versi secret di Secret Manager dan menyimpannya dalam file. Langkah build berikut mengakses secret-name dan menyimpannya dalam file bernama decrypted-data.txt:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  2. Gunakan file dengan data yang didekripsi dalam langkah build. Cuplikan kode berikut menggunakan decrypted-data.txt untuk login ke registry Docker pribadi:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  3. Gunakan file konfigurasi build untuk memulai build menggunakan command line atau untuk mengotomatiskan build menggunakan pemicu.

Langkah selanjutnya