このページでは、チェックサムを使用して、シークレット バージョンの追加とアクセス時にシークレットのデータの整合性を維持、検証する方法について説明します。
チェックサムは、データの一意の指紋と考えることができます。これは、CRC32C アルゴリズムを使用してシークレット データから生成されたショートコードです。シークレット データの 1 ビットでも変更されると、チェックサムも変更されます。これにより、Secret Manager は誤って行われた変更や破損を検出できます。
Secret Manager では、次のようにチェックサムを使用します。
-
シークレット バージョンを追加する際は、次のようになります。
-
Secret Manager は、シークレット データの CRC32C チェックサムを計算します。
-
このチェックサムは、シークレット データとともに保存されます。
-
-
シークレット バージョンにアクセスする際は、次のようになります。
-
Secret Manager は、シークレット データとそのチェックサムを返します。
-
このチェックサムを使用して、受信したデータが Secret Manager に保存されているデータと完全に一致していることを確認できます。
-
チェックサムが SecretPayload 構造と互換性があることを確認するには、シークレット データのチェックサムを CRC32C アルゴリズムを使用して計算し、10 進の整数としてエンコードする必要があります。SecretVersion レスポンスには、サーバーがこのチェックサムを正常に受信して検証したかどうかを示すフィールドが含まれています。
次の例は、Secret Manager でのチェックサムの仕組みを示しています。
API
次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。
シークレット データをデータファイルに保存し、gcloud storage hash を使用してチェックサムを計算します。チェックサムは 10 進数形式に変換する必要があります。SecretPayload proto で int64 としてエンコードされます。
$ gcloud storage hash "/path/to/file.txt" --hex
コマンドラインで渡されたシークレット データを使用して、次のようにチェックサムを計算します。
$ gcloud storage hash --hex cat <(echo ${SECRET_DATA})
シークレット データを Base64 エンコードし、シェル変数として保存します。
$ SECRET_DATA=$(echo "seCr3t" | base64)
curl を使用して API を呼び出します。
$ curl "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/secret-id:addVersion" \
--request "POST" \
--header "authorization: Bearer $(gcloud auth print-access-token)" \
--header "content-type: application/json" \
--data "{\"payload\": {\"data\": \"${SECRET_DATA}\", \"data_crc32c\": $CHECKSUM}}"
シークレット バージョンにアクセスすると、返された SecretPayload にデータとそのチェックサムが含まれます。レスポンスの例を次に示します。
{ "name": "projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID", "payload": { "data": "YQo=", "dataCrc32c": "163439259" } }
コンソールでシークレット バージョンを追加すると、シークレットの値を入力したらチェックサムが自動的に計算されます。
顧客管理の暗号鍵(CMEK)で暗号化され、2021 年 7 月 16 日より前に作成されたシークレット バージョンには、チェックサムが保存されません。