Google Cloud Platformに戻る

Secret Manager

Secret Managerとは

Secret Manager は、Google Cloud Platform (GCP) が提供するフルマネージドのシークレット管理サービスです。APIキー、パスワード、証明書、その他の機密情報を安全に保存、管理、アクセス制御するためのプラットフォームを提供します。Secret Managerを使用することで、ハードコーディングされた認証情報や平文での機密情報の保存を避け、アプリケーションのセキュリティを向上させることができます。

Secret Managerの主な特徴

Secret Managerのアーキテクチャ

Secret Managerは以下の主要コンポーネントで構成されています:

コンポーネント 説明
シークレット 機密情報を格納するためのコンテナ。メタデータとバージョンを含む
バージョン シークレットの特定のインスタンス。各バージョンには一意の値が含まれる
IAMポリシー シークレットへのアクセスを制御するポリシー
レプリケーションポリシー シークレットがどのようにレプリケートされるかを定義(リージョンまたはマルチリージョン)
暗号化キー シークレットの暗号化に使用されるキー。デフォルトではGoogleが管理するキーが使用される

Secret Manager と環境変数の違い

Secret Managerと環境変数には以下のような違いがあります:

Secret Managerの使用方法

Secret Managerは、Google Cloud Console、gcloud CLIツール、またはAPIを使用して利用できます。

シークレットの作成

Google Cloud Consoleまたはgcloud CLIを使用してシークレットを作成できます:

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のシークレットにアクセスする例:

Node.jsでのシークレットアクセス例

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();

Pythonでのシークレットアクセス例

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()

Secret Managerの高度な機能

カスタマー管理の暗号化キー(CMEK)

デフォルトでは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"

Secret Managerのセキュリティベストプラクティス

IAMポリシーの設定例

# シークレットへのアクセス権を付与
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のモニタリングとロギング

Secret ManagerはGoogle Cloud Monitoringおよびロギングと統合されており、シークレットの使用状況とアクセスを監視できます:

主なモニタリング機能

監査ログの確認

Secret Managerの監査ログを確認するには:

gcloud logging read 'resource.type="secretmanager.googleapis.com/Secret"'

Secret Managerのコスト最適化

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は以下のようなユースケースに適しています:

Secret Managerとの統合サービス

Secret Managerは他のGoogle Cloudサービスと統合して、より安全なアプリケーションを構築できます:

サービス 統合の利点
Cloud Run サーバーレスアプリケーションで機密情報を安全に使用
GKE Kubernetesワークロードで機密情報にアクセス
Cloud Functions サーバーレス関数で機密情報を安全に使用
Cloud Build ビルドプロセスで機密情報を安全に使用
Cloud KMS カスタマー管理の暗号化キーでシークレットを保護
Cloud IAM シークレットへのアクセスを詳細に制御
VPC Service Controls セキュリティ境界内でシークレットを管理

Cloud Runとの統合例

gcloud run deploy my-service \
    --image=gcr.io/my-project/my-image \
    --update-secrets=API_KEY=my-api-key:latest

GKEとの統合例

# 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サービスと組み合わせることで、エンドツーエンドのセキュアなアプリケーションを構築することができます。