Mengamankan dan menyimpan data sensitif menggunakan konektor Secret Manager

Secret Manager adalah sistem penyimpanan yang aman dan nyaman untuk kunci API, sandi, sertifikat, dan data sensitif lainnya. Secret Manager menyediakan tempat terpusat dan satu sumber tepercaya untuk mengelola, mengakses, dan mengaudit secret di seluruh Google Cloud.

Anda dapat menggunakan konektor Workflows untuk Secret Manager API agar dapat mengakses Secret Manager dalam alur kerja. Hal ini menyederhanakan integrasi untuk Anda karena konektornya menangani pemformatan permintaan, serta menyediakan metode dan argumen sehingga Anda tidak perlu mengetahui detail Secret Manager API. Konektor juga memiliki perilaku bawaan untuk menangani percobaan ulang dan operasi yang berjalan lama. Untuk mempelajari lebih lanjut cara menggunakan konektor Workflows, lihat Memahami konektor.

Memberi akun layanan Workflows akses ke Secret Manager

Secret Manager menggunakan Identity and Access Management (IAM) untuk kontrol akses. Untuk membuat, mengelola, mencantumkan, atau mengakses secret, izin IAM yang sesuai harus diberikan di level project dan level resource individual. Untuk informasi selengkapnya, lihat Kontrol akses dengan IAM.

Workflows menggunakan akun layanan untuk memberi akses alur kerja ke resource Google Cloud. Untuk mengakses versi secret, Anda harus memberikan peran Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) pada secret, project, folder, atau organisasi ke akun layanan. Pelajari lebih lanjut cara men-deploy alur kerja dengan akun layanan yang dikelola pengguna.

Mengaktifkan API

Sebelum menggunakan konektor Workflows untuk Secret Manager API, pastikan Anda mengaktifkan Secret Manager dan Workflows API.

Konsol

Aktifkan API

gcloud

  gcloud services enable secretmanager.googleapis.com workflows.googleapis.com

Memanggil panggilan konektor

Mirip dengan pemanggilan endpoint HTTP, panggilan konektor memerlukan kolom call dan args. Untuk mengetahui informasi selengkapnya, lihat Memanggil panggilan konektor.

Selain menggunakan langkah panggilan, Anda dapat memanggil metode helper dalam ekspresi seperti ini:

${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}

Misalnya, Anda dapat menggunakan metode helper accessString untuk mengambil data rahasia sebagai string. Ini lebih sederhana daripada menggunakan access API karena data rahasia secara otomatis didekode ke format string.

Anda juga dapat menggunakan metode helper addVersionString untuk menambahkan nilai secret baru ke secret yang ada. Ini lebih mudah daripada menggunakan addVersion API karena data rahasia otomatis dienkode ke string base-64 yang diperlukan oleh addVersion.

Mengambil secret menggunakan konektor Secret Manager

Alur kerja berikut menunjukkan cara menggunakan konektor Secret Manager untuk mengambil secret.

YAML

# This workflow demonstrates how to use the Cloud Secret Manager connector to.
# retrieve a secret.
# Expected successful output: the secret data.

- init:
    assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - secret_id: "test-secret"  # Make sure you have this secret and it has a version of 1.
      - version: "1"
# We provide a helper method to add a secret data to an existing secret without base-64 encoding.
- add_version_string:
    call: googleapis.secretmanager.v1.projects.secrets.addVersionString
    args:
      secret_id: ${secret_id}
      project_id: ${project_id}
      data: "a new secret"
# We provide a helper method to access the secret in string format without base-64 decoding.
# To compare the usage between accessRaw() and access(), we list two demo steps to retrieve
# the same secret below.
#
# accessString assumes the secret data is a valid UTF-8 string and if it detects non-UTF-8
# bytes, an error will be raised.
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # If not set, "latest" will be used.
      project_id: ${project_id}
    result: str_secret
- access_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.access
    args:
      name: ${"projects/" + project_id + "/secrets/" + secret_id + "/versions/" + version}
    result: base64_encoded_secret
# Secret can also be retrieved by using positional arguments in an expression.
- expression:
    assign:
      - secret_str_from_exp: ${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}
- the_end:
    return:
      - ${str_secret}
      - ${secret_str_from_exp}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}

JSON

[
  {
    "init": {
      "assign": [
        {
          "project_id": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}"
        },
        {
          "secret_id": "test-secret"
        },
        {
          "version": "1"
        }
      ]
    }
  },
  {
    "add_version_string": {
      "call": "googleapis.secretmanager.v1.projects.secrets.addVersionString",
      "args": {
        "secret_id": "${secret_id}",
        "project_id": "${project_id}",
        "data": "a new secret"
      }
    }
  },
  {
    "access_string_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.accessString",
      "args": {
        "secret_id": "${secret_id}",
        "version": "${version}",
        "project_id": "${project_id}"
      },
      "result": "str_secret"
    }
  },
  {
    "access_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.access",
      "args": {
        "name": "${\"projects/\" + project_id + \"/secrets/\" + secret_id + \"/versions/\" + version}"
      },
      "result": "base64_encoded_secret"
    }
  },
  {
    "expression": {
      "assign": [
        {
          "secret_str_from_exp": "${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}"
        }
      ]
    }
  },
  {
    "the_end": {
      "return": [
        "${str_secret}",
        "${secret_str_from_exp}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}"
      ]
    }
  }
]

Langkah selanjutnya