Halaman ini menjelaskan cara menyertakan informasi sensitif seperti sandi dan kunci API di Cloud Build.
Secret Manager adalah Google Cloud layanan 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
-
Aktifkan Cloud Build dan Secret Manager API.
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran. Untuk menggunakan contoh command line dalam panduan ini, instal dan konfigurasi 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 akan memerlukan informasi ini untuk mengonfigurasi Cloud Build agar dapat mengakses rahasia.
Izin IAM yang diperlukan
Berikan peran IAM Secret Manager Secret Accessor
(roles/secretmanager.secretAccessor) untuk secret ke akun layanan yang Anda gunakan untuk build:
Buka halaman Secret Manager di konsol Google Cloud :
Centang kotak rahasia yang ingin Anda gunakan dalam build.
Jika belum terbuka, klik Tampilkan panel info untuk membuka panel.
Di panel, di bagian Permissions, klik Add principal.
Di kolom New principals, masukkan alamat email akun layanan Anda.
Di kotak drop-down Select a role, pilih Secret Manager Secret Accessor.
Klik Simpan.
Mengonfigurasi build untuk mengakses secret UTF-8 dari Secret Manager
Di direktori root project Anda, buat file konfigurasi Cloud Build bernama
cloudbuild.yamlataucloudbuild.json.Di file konfigurasi build:
- Setelah semua build
steps, tambahkan kolomavailableSecretsuntuk menentukan versi secret dan variabel lingkungan yang akan digunakan untuk secret Anda. Anda dapat menyertakan variabel penggantian dalam nilai kolomsecretVersion. Anda dapat menentukan lebih dari satu rahasia dalam build. - Di langkah build tempat Anda ingin menentukan secret:
- Tambahkan kolom
entrypointyang mengarah kebashuntuk menggunakan alat bash di langkah build. Hal ini diperlukan untuk merujuk ke variabel lingkungan untuk secret. - Tambahkan kolom
secretEnvyang menentukan variabel lingkungan. - Di kolom
args, tambahkan tanda-csebagai argumen pertama. String apa pun yang Anda teruskan setelah-cdiperlakukan sebagai perintah. Untuk mengetahui informasi selengkapnya tentang menjalankan perintah bash dengan-c, lihat dokumentasi bash. - Saat menentukan secret di kolom
args, tentukan menggunakan variabel lingkungan yang diawali dengan$$.
- Tambahkan kolom
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 preceding commands with the following:
PROJECT_ID: The project ID or project number 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.
- Setelah semua build
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 anavailableSecretsfield 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.
- After all the build
- 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_TOKENJSON
{ "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" } ] } }
Replace the placeholder values in the preceding commands with the following:
PROJECT_ID: The project ID or project number of the Google Cloud project where you've stored your secrets.GITHUB_USERNAME: The GitHub username of the repository owner.REPO_NAME: The name of the GitHub repository.HEAD_BRANCH: The name of the branch where the changes are implemented. For cross-repository pull requests in the same network, namespaceheadwith a user like this:username:branch.BASE_BRANCH: The name of the branch you want the changes pulled into. This should be an existing branch on the current repository. You cannot submit a pull request to one repository that requests a merge to a base of another repository.GH_TOKEN_SECRET_NAME: The secret name corresponding to your GitHub token.NEW_PR: The new pull request you want to create.
Configuring builds to access non-UTF-8 secrets from Secret Manager
In your build config file, add a build step to access the secret version in Secret Manager and store it in a file. The following build step accesses secret-name and stores it in a file named 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" ] } ] }Use the file with the decrypted data in a build step. The following code snippet uses decrypted-data.txt to login to a private Docker registry:
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" ] } ] }Gunakan file konfigurasi build untuk memulai build menggunakan command line atau untuk mengotomatiskan build menggunakan pemicu.
Langkah berikutnya
- Pelajari cara menggunakan kredensial terenkripsi dalam build.
- Pelajari cara mengakses repositori GitHub pribadi.