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 single source of truth (SSOT) untuk mengelola, mengakses, dan mengaudit secret di seluruh Google Cloud.

Anda dapat menggunakan konektor Workflows untuk Secret Manager API untuk mengakses Secret Manager dalam alur kerja. Hal ini menyederhanakan integrasi untuk Anda, karena konektor menangani pemformatan permintaan, dan menyediakan metode serta 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 penggunaan konektor Workflows lebih lanjut, 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 tingkat project dan di tingkat resource individual. Untuk informasi selengkapnya, lihat Kontrol akses dengan IAM.

Alur kerja menggunakan akun layanan untuk memberi alur kerja akses 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 Alur Kerja 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

Serupa dengan memanggil endpoint HTTP, panggilan konektor memerlukan kolom call dan args. Untuk 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 secret sebagai string. Cara ini lebih sederhana daripada menggunakan access API karena data secret otomatis didekode ke format string.

Anda juga dapat menggunakan metode helper addVersionString untuk menambahkan nilai secret baru ke secret yang ada. Cara ini lebih sederhana daripada menggunakan addVersion API karena data secret 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 Secret Manager connector:
# Retrieve a secret using three different methods
# Expected output: the secret data (thrice)
- 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"
# Add 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"
# Retrieve the secret in string format without base-64 decoding and assume
# that the secret data is a valid UTF-8 string; if not, raise an error
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # if not set, "latest" is used
      project_id: ${project_id}
    result: str_secret
# Retrieve the secret in string format without base-64 decoding
- access_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.access
    args:
      name: ${"projects/" + project_id + "/secrets/" + secret_id + "/versions/" + version}
    result: base64_encoded_secret
# Retrieve the secret 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}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}
      - ${secret_str_from_exp}

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}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}",
        "${secret_str_from_exp}"
      ]
    }
  }
]

Langkah selanjutnya