【初学者向け】Google Cloud の Secret Manager ってなんだ
はじめに
こんにちは。クラウドエースの中野(大)です。
今回は Google Cloud のシークレットおよび認証情報の管理サービスである Secret Manager についてまとめようと思います。
対象読者
- Google Cloud を学びたての方
- Google Cloud の別のサービスはよく使用しているが、Secret Manager のことについて分からない方
上記のような方を対象として執筆しました。
Secret Manager とは
Secret Manager は、API キー、ユーザー名、パスワード、証明書などの機密データを安全に保存および管理するための Google Cloud のサービスです。
主な特徴としては以下の通りです。
- 機密データの保存と管理:API キー、パスワードなどの機密データを一元的に管理できます。
- バージョニングによる管理:バージョン管理機能により、段階的なロールアウトや緊急時のロールバックが可能になり、シークレットに加えられた変更履歴を保持します。また、不要になったシークレットバージョンは無効化または破棄できます。
- データの暗号化:保存中および転送中のシークレットデータはデフォルトで暗号化されます。保存時には AES 256 ビット暗号鍵が使用され、転送時には TLS が使用されます。CMEK を使用して、よりきめ細かい制御を行うことも可能です。
- 高可用性と障害復旧:複数のリージョンにシークレットを複製することで、地理的なロケーションに関わらずアプリケーションの高可用性と障害復旧を確保できます。
- シークレットのローテーション:シークレットのローテーションスケジュールを設定することができます。
Secret Manager の使い方
ここで、Secret Manager を使用する手順について解説します。
Secret Manager へ遷移し、「シークレットを作成」をクリックします。
名前とシークレットの値を入力します。ファイルアップロードでシークレットの値を入力することも可能です。
「このシークレットのロケーションを手動で管理する」にチェックを入れると、シークレットの値の複製リージョンを指定することができますが、チェックを入れない場合は Google が可用性と耐久性のために複数のロケーションにシークレットを自動的に複製します。この場合、特定のリージョンに限定されません。
今回の名前とシークレットの値は以下のように設定しました。
- 名前:test-secret
- シークレットの値:P@ssw0rd
「ローテーション期間を設定する」にチェックを入れるとシークレットのスケジュール管理と通知を行うことができます。
注意点として、実際にシークレットの新しい値を生成し、それを Secret Manager に登録し、関連するシステム(例: データベース、API)に新しい値を反映させるロジックは、ユーザーが実装する必要があります。
「有効期限を設定する」にチェックを入れるとシークレットの値に有効期限を設定することができ、期間を過ぎると設定したシークレットの値は使用することができなくなります。
「破棄の遅延期間を設定する」にチェックを入れるとシークレットバージョンの破棄に遅延を設定することができます。
設定が完了したら「シークレットを作成」をクリックします。
シークレットが作成されます。
ここで、Secret Manager で設定した内容を呼び出すことができるか確認してみます。
以下の Python コードを実行します。
- Python コードの access_secret_version 関数の第 3 引数で、Secret Manager に保存したバージョンを指定できます。
- デフォルト値は latest であり、これは保存されているシークレット値の中で最新のものを指定するエイリアス名です。
from google.cloud import secretmanager
def access_secret_version(project_id: str, secret_id: str, version_id: str = "latest") -> str | None:
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
response = client.access_secret_version(request={"name": name})
payload = response.payload.data.decode("UTF-8")
print(f"シークレット '{secret_id}' (バージョン: {version_id}) の値を取得しました。")
return payload
if __name__ == "__main__":
project_id = "<project ID>"
secret_id = "test-secret"
secret_value = access_secret_version(project_id, secret_id)
if secret_value:
print(secret_value)
- 実行結果
$ Python secret_manager.py
シークレット 'test-secret' (バージョン: latest) の値を取得しました。
P@ssw0rd
上記のように Secret Manager に格納している値を安全かつ簡単に呼び出すことができます。
バージョンを追加する(Google Cloud コンソール)
Secret の値を変更・追加するために、Google Cloud コンソールで Secret のバージョンを追加します。
「新しいバージョン」をクリックします。
今回はファイルをアップロードする形式でシークレットの値を追加しようと思います。
サンプルで作成した secret.txt を作成し、「参照」からファイルをアップロードします。そうするとファイルに記載したシークレットの値が取得されます。
「Disable all past versions」にチェックを入れると、今回追加するシークレットの値以前のシークレットの値を全て削除します。
取得されたシークレットの値が間違っていないことを確認し、「新しいバージョンを追加」をクリックします。
バージョンが追加されたことを確認します。
先ほどの Python コードを再度実行します。
- 実行結果
$ Python secret_manager.py
シークレット 'test-secret' (バージョン: latest) の値を取得しました。
Password
今回の Python コードの str = "latest" の部分を取得したいバージョンの値に変更することで、以前のバージョンのシークレットの値を取得することも可能です。
- 実行結果
$ Python secret_manager.py
シークレット 'test-secret' (バージョン: 1) の値を取得しました。
P@ssw0rd
バージョンを追加する(Python)
Python コードでもバージョンを追加することが可能です。
以下のコードを実行します。
import os
from google.cloud import secretmanager
def add_secret_version(project_id: str, secret_id: str, payload_data: str) -> str:
client = secretmanager.SecretManagerServiceClient()
parent = client.secret_path(project_id, secret_id)
payload_bytes = payload_data.encode("UTF-8")
response = client.add_secret_version(
request={
"parent": parent,
"payload": {"data": payload_bytes},
}
)
new_version_name = response.name
print(f"シークレット '{secret_id}' に新しいバージョン '{new_version_name}' を追加しました。")
return new_version_name
if __name__ == "__main__":
project_id = "<project ID>"
secret_id = "test-secret"
print(f"シークレット '{secret_id}' に追加する新しい値を入力してください:")
new_secret_data = input("> ")
added_version = add_secret_version(project_id, secret_id, new_secret_data)
print(f"\n追加されたバージョンのフルネーム: {added_version}")
- 実行結果
$ Python secret_maneger_version_add
シークレット 'test-secret' に追加する新しい値を入力してください:
> new_password
シークレット 'test-secret' に新しいバージョン 'projects/<project ID>/secrets/test-secret/versions/3' を追加しました。
追加したシークレットの値が取得できるか確認します。
- 実行結果
$ Python secret_manager.py
シークレット 'test-secret' (バージョン: latest) の値を取得しました。
new_password
新規で追加した new_password も取得することができました。
Parameter Manager について
Secret Manager の拡張機能として最近 GA となった Parameter Manager というサービスがあります。
Parameter Manager は、ワークロードのデプロイに関連する全ての構成パラメータを一元的に保存するために設計されたサービスです。Secret Manager のシークレットの参照や構造化データをパラメータとして扱うことができます。
今回は軽く触れるに留めておきますが、機会があれば Parameter Manager の解説記事も執筆しようと思います。
まとめ
Secret Manager を使用することで、機密データの漏洩リスクを低減し、管理の手間を省きセキュリティポリシーの適用と監査を容易にすることで、より安全で効率的なシステム運用・開発体制の構築ができるようになります。
機密データを安全に管理したい場合は、Google Cloud の Secret Manager を使用してみてください。
Discussion