Menggunakan kredensial terenkripsi dari Cloud KMS

Cloud Key Management Service adalah layanan Google Cloud yang memungkinkan Anda mengelola dan menggunakan kunci kriptografis. Halaman ini menjelaskan cara menggunakan informasi terenkripsi dari Cloud KMS di Cloud Build.

Sebelum memulai

  • Enable the Cloud Build and Cloud KMS APIs.

    Enable the APIs

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

  • Enkripsi informasi sensitif menggunakan Cloud KMS. Cloud KMS menyimpan konten terenkripsi Anda dalam file.

  • [OPSIONAL] Untuk mengonfigurasi build agar menggunakan data terenkripsi, konversikan ENCRYPTED_FILE menjadi base64 (langkah ini tidak diperlukan untuk konfigurasi build yang menggunakan file terenkripsi):

        base64 ENCRYPTED_FILE
    

Izin IAM yang diperlukan

Berikan peran IAM Cloud KMS Bigtable Decrypter (roles/cloudkms.cryptoKeyDecrypter) ke akun layanan Cloud Build:

  1. Di konsol Google Cloud, buka halaman Settings Cloud Build:

    Buka halaman Setelan

  2. Cari baris dengan peran Cloud KMS Bigtable Decrypter dan tetapkan Statusnya ke ENABLED.

Mengonfigurasi build untuk menggunakan data terenkripsi

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

  2. Dalam file konfigurasi build Anda:

    • Setelah semua build steps, tambahkan kolom availableSecrets untuk menentukan nilai terenkripsi sebagai variabel lingkungan dan kmsKeyName yang akan digunakan untuk mendekripsinya. Anda dapat menggunakan variabel substitusi dalam nilai kmsKeyName.
    • 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 rahasia.
      • Tambahkan kolom secretEnv yang menentukan variabel lingkungan untuk nilai terenkripsi.
      • Di kolom args, tambahkan tanda -c sebagai argumen pertama. Setiap string yang Anda teruskan setelah -c diperlakukan sebagai perintah. Untuk mengetahui informasi selengkapnya tentang menjalankan perintah bash dengan -c, lihat dokumentasi bash.
      • Saat menentukan nilai yang dienkripsi di kolom args, tentukan nilai tersebut menggunakan variabel lingkungan yang diawali dengan $$.

    Contoh file konfigurasi build berikut menunjukkan cara login ke Docker dan mengambil image pribadi:

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

    Ganti nilai placeholder dalam perintah di atas dengan perintah berikut:

    • PROJECT_ID: ID project Google Cloud yang berisi layanan Cloud KMS Anda.
    • USERNAME_KEYRING_NAME: Nama key ring dari nama pengguna Docker Anda.
    • USERNAME_KEY_NAME: Nama kunci nama pengguna Docker Anda.
    • ENCRYPTED_USERNAME: Nama pengguna Docker terenkripsi dalam format base64.
    • PASSWORD_KEYRING_NAME: Nama key ring sandi Docker Anda.
    • PASSWORD_KEY_NAME: Nama kunci sandi Docker Anda.
    • ENCRYPTED_PASSWORD: Sandi Docker terenkripsi dalam format base64.
    • REPOSITORY: Nama repositori Docker tempat Anda mengambil image.
    • TAG: Nama tag gambar Anda.

  3. Gunakan file konfigurasi build untuk memulai build secara manual atau untuk mengotomatiskan build menggunakan pemicu.

Mengonfigurasi build untuk menggunakan file terenkripsi

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

  2. Pada file konfigurasi build, sebelum langkah build apa pun yang berinteraksi dengan file yang didekripsi, tambahkan langkah build gcloud untuk mendekripsi file terenkripsi menggunakan kunci enkripsi. Contoh file konfigurasi build berikut menunjukkan cara login ke Docker menggunakan file terenkripsi dengan sandi 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"
        ]
       }
      ]
    }
    

    Ganti nilai placeholder dalam perintah di atas dengan perintah berikut:

    • KEYRING_NAME: Nama key ring sandi Docker Anda.
    • KEY_NAME: Nama kunci sandi Docker Anda.
    • ENCRYPTED_PASSWORD_FILE: File terenkripsi dengan sandi Docker Anda.
    • PLAINTEXT_PASSWORD_FILE: File teks biasa dengan sandi Docker Anda.
  3. Gunakan file konfigurasi build untuk memulai build secara manual atau untuk mengotomatiskan build menggunakan pemicu.

Mengonfigurasi build untuk menggunakan data terenkripsi (lama)

Untuk mengenkripsi data sensitif menggunakan Cloud KMS dan menggunakan data tersebut dalam file konfigurasi build:

  1. Di file konfigurasi build, tambahkan kolom secrets untuk menentukan nilai yang dienkripsi dan CryptoKey yang akan digunakan untuk mendekripsinya. Kemudian, pada langkah build tempat Anda ingin menggunakan variabel terenkripsi, tambahkan kolom secretEnv untuk menentukan variabel sebagai variabel lingkungan. Sertakan nama variabel di kolom secretEnv. Jika Anda menentukan nilai variabel, atau variabel lingkungan non-rahasia dengan nama yang sama, Cloud Build akan menampilkan error.

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

Langkah selanjutnya