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 tersebut di Secret Manager, lalu mengonfigurasi build untuk mengakses informasi tersebut dari Secret Manager.

Sebelum memulai

  • Aktifkan API Cloud Build and Secret Manager.

    Mengaktifkan API

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

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

    • Catat nama rahasia dan versi rahasianya. Anda akan 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 Cloud Build:

  1. Buka halaman Secret Manager di konsol Google Cloud:

    Buka halaman Secret Manager

  2. Pilih kotak centang rahasia yang ingin Anda gunakan dalam build.

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

  4. Di panel, pada Izin, klik Tambahkan akun utama.

  5. Di kotak teks New principals, masukkan alamat email akun layanan Cloud Build dengan format PROJECT_NUMBER@cloudbuild.gserviceaccount.com. PROJECT_NUMBER adalah nomor project tempat Anda menjalankan build. Anda dapat menemukan nomor project di halaman Setelan project.

  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. Dalam 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 substitusi 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. Ini diperlukan untuk merujuk ke variabel lingkungan untuk secret.
      • Tambahkan kolom secretEnv yang menentukan variabel lingkungan.
      • Di kolom args, tambahkan tanda -c sebagai argumen pertama. Setiap string yang Anda teruskan setelah -c akan diperlakukan sebagai perintah. Untuk mengetahui informasi selengkapnya tentang cara menjalankan perintah bash dengan -c, lihat dokumentasi bash.
      • Saat menentukan secret di kolom args, tentukan menggunakan variabel lingkungan yang diawali dengan $$.

    Contoh file konfigurasi build berikut menunjukkan cara login ke Docker menggunakan nama pengguna dan sandi Docker yang disimpan di 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"
         }]
      }
    }
    

    Ganti nilai placeholder dalam perintah di atas dengan perintah berikut:

    • PROJECT_ID: ID project Google Cloud tempat Anda menyimpan secret.
    • DOCKER_USERNAME_SECRET_NAME: Nama rahasia yang sesuai dengan nama pengguna Docker Anda. Anda bisa mendapatkan nama rahasia dari halaman Secret Manager di konsol Google Cloud.
    • DOCKER_USERNAME_SECRET_VERSION: Versi rahasia nama pengguna Docker Anda. Anda bisa mendapatkan versi secret dengan mengklik nama secret di halaman Secret Manager di konsol Google Cloud.
    • DOCKER_PASSWORD_SECRET_NAME: Nama rahasia yang sesuai dengan sandi Docker Anda. Anda bisa mendapatkan nama rahasia dari halaman Secret Manager di konsol Google Cloud.
    • DOCKER_PASSWORD_SECRET_VERSION: Versi rahasia sandi Docker Anda. Anda bisa mendapatkan versi secret dengan mengklik nama secret di halaman Secret Manager di konsol Google Cloud.
  3. Gunakan file konfigurasi build untuk memulai build menggunakan command line atau untuk mengotomatiskan build menggunakan pemicu.

Contoh: Mengakses secret dari skrip dan proses

Kolom secretEnv menambahkan nilai secret ke lingkungan, dan Anda dapat mengakses nilai ini melalui variabel lingkungan dari skrip atau proses:

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"
    }
  ]
}
}

Konten main.py berikut akan mencetak lima karakter pertama secret:

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

Contoh: mengautentikasi ke Docker

Dalam beberapa situasi, sebelum berinteraksi dengan image Docker, build Anda perlu melakukan autentikasi ke Docker. Misalnya, autentikasi Docker diperlukan agar build dapat mengambil image pribadi dan mengirim image pribadi atau publik ke Docker Hub. Dalam kasus ini, Anda dapat menyimpan nama pengguna dan sandi Docker di Secret Manager, lalu mengonfigurasi Cloud Build untuk mengakses nama pengguna dan sandi dari Secret Manager. Untuk mengetahui petunjuk cara melakukannya, lihat bagian Berinteraksi dengan image Docker Hub.

Contoh: Pembuatan permintaan pull GitHub

Contoh lain yang memungkinkan Anda mengonfigurasi build untuk mengakses informasi sensitif dari Secret Manager adalah dengan membuat permintaan pull GitHub sebagai respons terhadap build. Untuk melakukan ini:

  • Buat token GitHub.
  • Simpan token GitHub di Secret Manager.
  • Di file konfigurasi build:
    • Setelah semua build steps, tambahkan kolom availableSecrets untuk menentukan versi secret dan variabel lingkungan yang akan digunakan untuk token GitHub.
    • Tambahkan langkah build untuk memanggil perintah untuk membuat permintaan pull GitHub.
  • Buat pemicu aplikasi GitHub dan gunakan file konfigurasi build untuk memanggil pemicu.

Contoh file konfigurasi berikut menunjukkan cara membuat permintaan pull GitHub menggunakan token GitHub:

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 perintah berikut:

  • PROJECT_ID: ID project Google Cloud tempat Anda menyimpan secret.
  • GITHUB_USERNAME: Nama pengguna GitHub dari pemilik repositori.
  • REPO_NAME: Nama repositori GitHub.
  • HEAD_BRANCH: Nama cabang tempat perubahan diimplementasikan. Untuk permintaan pull lintas repositori dalam jaringan yang sama, beri namespace head dengan pengguna seperti ini: username:branch.
  • BASE_BRANCH: Nama cabang tempat Anda ingin menarik perubahan. Ini harus berupa cabang yang ada pada repositori saat ini. Anda tidak dapat mengirimkan permintaan pull ke satu repositori yang meminta penggabungan ke basis repositori lain.
  • GH_TOKEN_SECRET_NAME: Nama rahasia yang sesuai dengan token GitHub Anda.
  • NEW_PR: Permintaan pull 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. Menggunakan 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