Secret Manager は、Google Cloud Platform (GCP) が提供するフルマネージドのシークレット管理サービスです。APIキー、パスワード、証明書、その他の機密情報を安全に保存、管理、アクセス制御するためのプラットフォームを提供します。Secret Managerを使用することで、ハードコーディングされた認証情報や平文での機密情報の保存を避け、アプリケーションのセキュリティを向上させることができます。
Secret Managerは以下の主要コンポーネントで構成されています:
コンポーネント | 説明 |
---|---|
シークレット | 機密情報を格納するためのコンテナ。メタデータとバージョンを含む |
バージョン | シークレットの特定のインスタンス。各バージョンには一意の値が含まれる |
IAMポリシー | シークレットへのアクセスを制御するポリシー |
レプリケーションポリシー | シークレットがどのようにレプリケートされるかを定義(リージョンまたはマルチリージョン) |
暗号化キー | シークレットの暗号化に使用されるキー。デフォルトではGoogleが管理するキーが使用される |
Secret Managerと環境変数には以下のような違いがあります:
Secret Managerは、Google Cloud Console、gcloud CLIツール、またはAPIを使用して利用できます。
Google Cloud Consoleまたはgcloud CLIを使用してシークレットを作成できます:
gcloud secrets create my-api-key \
--replication-policy="automatic"
# ファイルからシークレット値を追加
gcloud secrets versions add my-api-key \
--data-file="/path/to/api_key.txt"
# コマンドラインから直接シークレット値を追加
echo -n "my-secret-value" | gcloud secrets versions add my-api-key --data-file=-
シークレットの値を取得する方法:
gcloud secrets versions access latest --secret=my-api-key
gcloud secrets versions access 1 --secret=my-api-key
アプリケーションからSecret Managerのシークレットにアクセスする例:
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');
const client = new SecretManagerServiceClient();
async function accessSecret() {
const name = 'projects/my-project/secrets/my-api-key/versions/latest';
const [version] = await client.accessSecretVersion({name});
const payload = version.payload.data.toString('utf8');
console.log(`Secret value: ${payload}`);
return payload;
}
accessSecret();
from google.cloud import secretmanager
def access_secret():
client = secretmanager.SecretManagerServiceClient()
name = f"projects/my-project/secrets/my-api-key/versions/latest"
response = client.access_secret_version(request={"name": name})
payload = response.payload.data.decode("UTF-8")
print(f"Secret value: {payload}")
return payload
access_secret()
デフォルトではGoogleが管理する暗号化キーが使用されますが、Cloud KMSで管理する独自のキーを使用することもできます:
gcloud secrets create my-cmek-secret \
--replication-policy="automatic" \
--kms-key-name="projects/my-project/locations/global/keyRings/my-keyring/cryptoKeys/my-key"
シークレットのローテーションは、新しいバージョンを作成することで実現できます:
# 新しいシークレット値でバージョンを追加
echo -n "my-new-secret-value" | gcloud secrets versions add my-api-key --data-file=-
Cloud Schedulerを使用して定期的なローテーションを自動化することもできます:
# Cloud Functionsを作成してシークレットをローテーション
gcloud functions deploy rotateSecret \
--runtime nodejs14 \
--trigger-http \
--entry-point=rotateSecret
# Cloud Schedulerでスケジュールを設定
gcloud scheduler jobs create http rotate-api-key \
--schedule="0 0 1 * *" \
--uri="https://us-central1-my-project.cloudfunctions.net/rotateSecret" \
--oidc-service-account-email="my-service-account@my-project.iam.gserviceaccount.com"
シークレットのレプリケーションポリシーを設定できます:
# 自動レプリケーション(マルチリージョン)
gcloud secrets create my-auto-secret \
--replication-policy="automatic"
# ユーザー管理レプリケーション(特定のリージョン)
gcloud secrets create my-user-secret \
--replication-policy="user-managed" \
--locations="asia-northeast1,us-central1"
# シークレットへのアクセス権を付与
gcloud secrets add-iam-policy-binding my-api-key \
--member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
--role=roles/secretmanager.secretAccessor
# シークレットの管理権限を付与
gcloud secrets add-iam-policy-binding my-api-key \
--member=user:admin@example.com \
--role=roles/secretmanager.admin
Secret ManagerはGoogle Cloud Monitoringおよびロギングと統合されており、シークレットの使用状況とアクセスを監視できます:
Secret Managerの監査ログを確認するには:
gcloud logging read 'resource.type="secretmanager.googleapis.com/Secret"'
Secret Managerのコストを最適化するためのベストプラクティス:
# 特定のバージョンを削除
gcloud secrets versions destroy 1 --secret=my-api-key
# 無効化されたバージョンをすべて削除
gcloud secrets versions list my-api-key --filter="state=DISABLED" --format="value(name.basename())" | xargs -I {} gcloud secrets versions destroy {} --secret=my-api-key
Secret Managerは以下のようなユースケースに適しています:
Secret Managerは他のGoogle Cloudサービスと統合して、より安全なアプリケーションを構築できます:
サービス | 統合の利点 |
---|---|
Cloud Run | サーバーレスアプリケーションで機密情報を安全に使用 |
GKE | Kubernetesワークロードで機密情報にアクセス |
Cloud Functions | サーバーレス関数で機密情報を安全に使用 |
Cloud Build | ビルドプロセスで機密情報を安全に使用 |
Cloud KMS | カスタマー管理の暗号化キーでシークレットを保護 |
Cloud IAM | シークレットへのアクセスを詳細に制御 |
VPC Service Controls | セキュリティ境界内でシークレットを管理 |
gcloud run deploy my-service \
--image=gcr.io/my-project/my-image \
--update-secrets=API_KEY=my-api-key:latest
# Secret Managerからシークレットを取得するPodの例
apiVersion: v1
kind: Pod
metadata:
name: secret-manager-pod
spec:
containers:
- name: secret-manager-container
image: gcr.io/my-project/my-image
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: my-api-key
key: latest
Secret Manager は、Google Cloud Platform上での機密情報の管理を簡素化するフルマネージドサービスです。APIキー、パスワード、証明書などの機密情報を安全に保存、アクセス制御、バージョン管理することができます。
Secret Managerの主な利点は以下の通りです:
Secret Managerを効果的に活用するには、最小権限の原則に基づくアクセス制御、定期的なシークレットローテーション、監査ログの監視が重要です。また、他のGCPサービスと組み合わせることで、エンドツーエンドのセキュアなアプリケーションを構築することができます。