PUBLIC
SECURITYCREDENTIALS15 MIN READ

SECRET
MANAGER

秘密を、
安全に渡す仕組み

Secret Managerは、APIキーやパスワードを保管する「金庫」だけではありません。 誰が、どの秘密を、いつ取得できるかを、ID・権限・履歴と一緒に管理する仕組みです。

01WORKLOAD
02IAM
03SECRET
04AUDIT
FLOW

身元と権限を確認してから秘密を返し、その操作を監査ログへ残します。

CONTENTSこの記事の目次

QUICK OVERVIEW

30秒でつかむ

01PURPOSE

秘密の配布をやめる

値を一か所で管理し、必要な処理が必要な瞬間だけ取得します。

02CONTROL

IDとIAMで制限する

誰がどのSecretを取得できるかを、ワークロード単位で決めます。

03BOUNDARY

取得後は平文になる

ログ出力や過剰な権限など、アプリ側の扱いまで安全になるわけではありません。

01 — THE PROBLEM

秘密をコードに
置けない理由

パスワードをソースコードや設定ファイルに書くと、コピーされた瞬間から 「誰が持っているか」を制御できなくなります。

Gitの履歴、ビルド成果物、ログ、開発者のPC。秘密が複製される場所が増えるほど、 削除や更新は難しくなります。Secret Managerは値を一か所に集め、アプリには値ではなく 「取得する権限」を渡します。

02 — FOUR LAYERS

金庫を支える
4つの役割

暗号化だけでは、安全なSecret管理にはなりません。

01STORE

暗号化して保管

保存時は暗号化され、API通信もTLSで保護されます。必要ならCloud KMSのCMEKも利用できます。

02IDENTIFY

利用者の身元を確認

人間だけでなく、Cloud RunやCI/CDにもサービスアカウントなどのIDを割り当てます。

03AUTHORIZE

IAMで範囲を制限

Secret単位で読み取りを許可し、プロジェクト内のすべてのSecretへ広げないのが基本です。

04AUDIT

操作を追跡

誰がVersionを追加・無効化・取得したかを監査します。値の取得はData Accessログの有効化も確認します。

03 — ACCESS FLOW

アプリが秘密を
受け取るまで

Secret Managerへ接続するための固定パスワードを、アプリへ埋め込まないことが重要です。

REQUEST / database-password / version 7TLS
01WORKLOAD

身元を示す

Cloud Runなどの実行環境が、サービスアカウントとして認証する。

02IAM

権限を確かめる

そのIDに対象Secretのpayloadを読む権限があるか判定する。

03SECRET

値を取り出す

指定されたVersionを復号し、安全な通信経路で返す。

04AUDIT

操作を記録する

管理操作やデータアクセスをCloud Audit Logsで追跡できる。

ALLOWproduction-api → database-password → secretAccessor
SEQUENCE

固定キーを持たず、実行環境のIDを使って取得要求を認証します。

CI/CDからGCPへ

GitHub Actionsなどでは、長期サービスアカウントキーよりWorkload Identity Federationで短時間の認証情報を取得します。

04 — VERSION & ROTATION

値を上書きせず、
Versionを積む

Secretの値はVersionとして不変に保存し、更新時は新しいVersionを追加します。

SECRET / database-password
VERSION 5DISABLED
VERSION 6ENABLED
VERSION 7ACTIVEalias: latest
01

外部サービス側で新しい認証情報を作る

02

Secret Managerへ新Versionを追加

03

アプリをVersion 7へ切り替えて確認

04

旧Versionを無効化してから破棄

05 — SECRET MANAGER vs KMS

秘密と暗号鍵は
役割が違う

どちらもセキュリティ製品ですが、管理する対象が異なります。

SECRET MANAGER

秘密そのもの

DBパスワード
APIキー
証明書
アプリが値を取得して使う
VS

CLOUD KMS

暗号処理の鍵

暗号化・復号
署名
鍵の管理
データを暗号処理する

Secret Managerの保存データも暗号化されています。追加の制御が必要な場合は、Cloud KMS上の顧客管理鍵(CMEK)を指定できます。

06 — IMPLEMENTATION

実行時にAPIから
取得する

クライアントライブラリは、実行環境に割り当てられたIDを使って認証します。

secret.tsGOOGLE CLOUD / NODE.JS
import { SecretManagerServiceClient }
  from "@google-cloud/secret-manager";

const client = new SecretManagerServiceClient();

const [version] = await client.accessSecretVersion({
  name: [
    "projects/my-project",
    "secrets/database-password",
    "versions/7",
  ].join("/"),
});

const password = version.payload?.data?.toString();

01AUTH 実行環境のIDを自動利用

02VERSION productionでは番号を固定

03MEMORY 取得後は平文として慎重に扱う

07 — SECURITY BOUNDARY

Secret Managerでも
守れないこと

取得を許可されたプロセス内では、秘密は利用可能な平文になります。

01

ログへの出力

値、環境変数、エラーオブジェクトを丸ごと出力すると、Cloud Loggingなどへ秘密が残ります。

02

過剰なIAM権限

プロジェクト全体にAccessorを与えると、そのIDはすべてのSecretを取得できます。Secret単位を基本にします。

03

侵害されたアプリ

アプリ自体が乗っ取られれば、そのアプリに許可されたSecretは取得される可能性があります。

04

latestへの無条件追従

新Versionの問題が全インスタンスへ即時波及します。本番ではVersion番号を固定して段階的に切り替えます。

08 — SAME PATTERN, DIFFERENT CLOUDS

クラウドが変わっても
考え方は同じ

名称は違っても、「Secret・Identity・Policy・Audit」の組み合わせで捉えられます。

PLATFORMSECRET STOREWORKLOAD IDENTITY
GOOGLE CLOUDSecret ManagerService Account / WIF
AWSSecrets ManagerIAM Role
MICROSOFT AZUREKey Vault SecretsManaged Identity
SELF-HOSTEDHashiCorp VaultAuth Method

IN ONE SENTENCE

Secret Managerとは?

秘密を暗号化して保管し、IDとIAMで必要な相手だけに渡し、その操作を追跡する仕組み。

KEEP EXPLORING

DEVOPSCI / CD掲載中SECURITYIAM掲載中SECURITYKMS掲載中SECURITYWorkload Identity掲載中

SOURCES / GOOGLE CLOUD OFFICIAL

Secret Manager overview ↗Access control with IAM ↗Best practices ↗Rotation schedules ↗