Batch で Secret Manager を使用してセンシティブ データを保護する

このドキュメントでは、Secret Manager の Secret を使用して Batch ジョブに指定するセンシティブ データを保護する方法について説明します。

Secret Manager の Secret は、暗号化によってセンシティブ データを保護します。 Batch ジョブでは、1 つ以上の既存の Secret を指定して、そこに含まれるセンシティブ データを安全に渡すことができます。これを使用すると、次のことを行えます。

  • センシティブ データを含むカスタム環境変数を安全に定義します。

  • Docker Registry のログイン認証情報を安全に指定すると、ジョブの実行可能ファイルでプライベート コンテナ イメージにアクセスできます。

準備

センシティブ データをカスタム環境変数に安全に渡す

Secret Manager の Secret からカスタム環境変数にセンシティブ データを安全に渡すには、環境の Secret 変数(secretVariables)サブフィールドで各環境変数を定義し、値ごとに Secret を指定する必要があります。ジョブで Secret を指定するたびに、Secret のバージョンの形式 projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION にする必要があります。

Secret 変数を定義するジョブを作成するには、gcloud CLI または Batch API を使用します。次の例は、すべての実行可能ファイルの環境(taskSpecenvironment サブフィールド)の Secret 変数を定義して使用するジョブの作成方法を示しています。

gcloud

  1. ジョブの構成の詳細を指定する JSON ファイルを作成し、1 つ以上の環境の secretVariables サブフィールドを含めます。

    たとえば、環境ですべての実行可能ファイルに対して Secret 変数を使用する基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
                }
              }
            ],
            "environment": {
              "secretVariables": {
                "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
              }
            }
          }
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    次のように置き換えます。

    • SECRET_VARIABLE_NAME: Secret 変数の名前。慣例により、環境変数名は大文字です。

      変数の Secret Manager の Secret からセンシティブ データに安全にアクセスするには、このジョブの実行可能ファイルでこの変数名を指定します。Secret 変数には、Secret 変数を定義しているのと同じ環境にあるすべての実行可能ファイルからアクセスできます。

    • PROJECT_ID: プロジェクトのプロジェクト ID

    • SECRET_NAME: 既存の Secret Manager の Secret の名前。

    • VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。 バージョン番号または latest を指定できます。

  2. ジョブを作成して実行するには、gcloud batch jobs submit コマンドを使用します。

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    以下を置き換えます。

    • JOB_NAME: ジョブの名前。

    • LOCATION: ジョブのロケーション

    • JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。

API

jobs.create メソッドPOST リクエストを送ります。これにより、1 つ以上の環境の secretVariables サブフィールドを指定します。

たとえば、環境ですべての実行可能ファイルに対して Secret 変数を使用する基本的なスクリプト ジョブを作成するには、次のリクエストを行います。

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
            }
          }
        ],
        "environment": {
          "secretVariables": {
            "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
          }
        }
      }
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

次のように置き換えます。

  • PROJECT_ID: プロジェクトのプロジェクト ID

  • LOCATION: ジョブのロケーション

  • JOB_NAME: ジョブの名前。

  • SECRET_VARIABLE_NAME: Secret 変数の名前。慣例により、環境変数名は大文字です。

    変数の Secret Manager の Secret からセンシティブ データに安全にアクセスするには、このジョブの実行可能ファイルでこの変数名を指定します。Secret 変数には、Secret 変数を定義しているのと同じ環境にあるすべての実行可能ファイルからアクセスできます。

  • SECRET_NAME: 既存の Secret Manager の Secret の名前。

  • VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。 バージョン番号または latest を指定できます。

Docker レジストリ認証情報を必要とするコンテナ イメージに安全にアクセスする

非公開 Docker レジストリのコンテナ イメージを使用するには、実行可能ファイルで Docker レジストリへのアクセスを許可するログイン認証情報を指定する必要があります。具体的には、イメージ URI(imageUri)フィールドでコンテナの実行可能ファイルが非公開 Docker レジストリのイメージに設定されているの場合は、ユーザー名(username)フィールドパスワード(password)フィールドを使用して、その Docker レジストリにアクセスするために必要な認証情報を指定する必要があります。

これらのフィールドを直接定義するのではなく、情報を含む既存の Secret を指定することで、Docker レジストリの機密性の高い認証情報を保護できます。ジョブで Secret を指定するたびに、Secret のバージョンの形式 projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION にする必要があります。

gcloud CLI または Batch API を使用して、非公開 Docker レジストリのコンテナ イメージを使用するジョブを作成できます。次の例は、ユーザー名とパスワードを Secret として直接指定し、非公開 Docker レジストリのコンテナ イメージを使用するジョブを作成する方法を示しています。

gcloud

  1. ジョブの構成の詳細を指定する JSON ファイルを作成します。非公開 Docker レジストリのイメージを使用するコンテナ実行可能ファイルの場合は、そのアクセスに必要な認証情報を username フィールドと password フィールドに含めます。

    たとえば、非公開 Docker レジストリからイメージを指定する基本的なコンテナジョブを作成するには、次の内容の JSON ファイルを作成します。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "container": {
                  "imageUri": "PRIVATE_IMAGE_URI",
                  "commands": [
                    "-c",
                    "echo This runnable uses a private image."
                  ],
                  "username": "USERNAME",
                  "password": "PASSWORD"
                }
              }
            ],
          }
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    次のように置き換えます。

    • PRIVATE_IMAGE_URI: 非公開 Docker レジストリのコンテナ イメージのイメージ URI。このイメージに他のコンテナ設定が必要な場合は、それらも含める必要があります。

    • USERNAME: 非公開 Docker レジストリのユーザー名。Secret として、または直接指定できます。

    • PASSWORD: 非公開 Docker レジストリのパスワード。Secret として(推奨)、または直接指定できます。

      たとえば、パスワードを Secret として指定するには、PASSWORD を次のように設定します。

      projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
      

      次のように置き換えます。

  2. ジョブを作成して実行するには、gcloud batch jobs submit コマンドを使用します。

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    以下を置き換えます。

    • JOB_NAME: ジョブの名前。

    • LOCATION: ジョブのロケーション

    • JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。

API

jobs.create メソッドPOST リクエストを送信します。非公開 Docker レジストリのイメージを使用するコンテナ実行可能ファイルの場合は、そのアクセスに必要な認証情報を username フィールドと password フィールドに含めます。

たとえば、非公開 Docker レジストリからイメージを指定する基本的なコンテナジョブを作成するには、次のリクエストを行います。

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "container": {
              "imageUri": "PRIVATE_IMAGE_URI",
                "commands": [
                  "-c",
                  "echo This runnable uses a private image."
                ],
                "username": "USERNAME",
                "password": "PASSWORD"
            }
          }
        ],
      }
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

次のように置き換えます。

  • PROJECT_ID: プロジェクトのプロジェクト ID

  • LOCATION: ジョブのロケーション

  • JOB_NAME: ジョブの名前。

  • PRIVATE_IMAGE_URI: 非公開 Docker レジストリのコンテナ イメージのイメージ URI。このイメージに他のコンテナ設定が必要な場合は、それらも含める必要があります。

  • USERNAME: 非公開 Docker レジストリのユーザー名。Secret として、または直接指定できます。

  • PASSWORD: 非公開 Docker レジストリのパスワード。Secret として(推奨)、または直接指定できます。

    たとえば、パスワードを Secret として指定するには、PASSWORD を次のように設定します。

    projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
    

    次のように置き換えます。

次のステップ