Vaultとシークレットストア
Vaultなどのツールでシークレットを一元管理します。
「Vaultとシークレットストア」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
シークレットストアで解決できること
シークレットストア(または保管庫)とは、シークレットの保存、アクセス制御、監査だけを目的とした、集中管理された堅牢なサービスです。拡散の原因となる、散在したファイルや環境変数に置き換わるものです。
優れたシークレットマネージャーは、次の4つの中核機能を提供します。
- 一元的な保存:信頼できる唯一の情報源。
- アクセス制御:各シークレットを誰が何のために読み取れるかを細かく定めるポリシー。
- 監査ログ:インシデント対応に利用できる、すべてのアクセスの記録。
- 暗号化:保存時と転送時のシークレットを暗号化。
例として、HashiCorp Vault、AWS Secrets Manager、Azure Key Vault、GCP Secret Managerがあります。
HashiCorp Vaultの構造
HashiCorp Vaultは、広く利用されているオープンソースのシークレットマネージャーです。機能を、パスにマウントされたプラグイン可能なシークレットエンジンとして構成します。
- KVエンジン:静的なキーと値のシークレットを保存します。
- データベースエンジン:動的で短期間だけ有効なデータベース認証情報を生成します。
- PKIエンジン:必要に応じてTLS証明書を発行します。
- Transitエンジン:キーを公開せずに、サービスとして暗号化を提供します。
VaultとはHTTP APIまたはCLIを通じてやり取りします。各パスにはポリシーが設定され、そこで誰が読み書きできるかが決まります。
# Enable a KV v2 secrets engine at the 'secret/' path
vault secrets enable -path=secret kv-v2
# Write and read a static secret
vault kv put secret/app/db password='S3cr3t' user='app'
vault kv get secret/app/dbシールとアンシールのモデル
Vaultはシール/アンシール機構によってデータを保護します。Vaultの起動時はシール状態です。暗号化されたデータの場所は把握していますが、復号できません。
ストレージを復号するマスターキー自体も、アンシールキーによって暗号化されています。Shamir's Secret Sharingを使い、そのアンシールキーを複数の断片に分割して、異なる運用担当者に配布します。
設定可能なしきい値(例:5個中3個の断片)を提供してキーを再構成し、Vaultをアンシールする必要があります。1人だけではアンシールできないため、内部関係者による侵害から保護できます。
# Initialize Vault: 5 key shares, threshold of 3 to unseal
vault operator init -key-shares=5 -key-threshold=3
# Each operator supplies one shard until threshold is met
vault operator unseal <shard-1>
vault operator unseal <shard-2>
vault operator unseal <shard-3>認証:あなたは誰ですか?
シークレットを読み取る前に、クライアントは認証を行ってトークンを取得する必要があります。Vaultは、さまざまな識別情報に対応した認証方式を多数サポートしています。
- AppRole:アプリケーションやCIシステム向け(ロールID+シークレットID)。
- Kubernetes:Podのサービスアカウントトークンを使用します。
- AWS/GCP/Azure IAM:クラウドプラットフォームの識別情報を信頼します。
- OIDC/LDAP:SSOを介した人間のユーザー向けです。
重要な原則は、識別情報をプラットフォームから取得することであり、長期間有効なパスワードを使わないことです。KubernetesのPodは自身のサービスアカウントトークンを使って身元を証明するため、漏えいするブートストラップ用シークレットは必要ありません。
# App authenticates via AppRole to receive a token
vault write auth/approle/login \
role_id="db-app-role" \
secret_id="$WRAPPED_SECRET_ID"
# Response includes client_token used for subsequent readsポリシーによる認可
認証は身元を証明し、ポリシーはその身元に許可される操作を決定します。VaultのポリシーはHCLで記述し、最小権限に従って、ワークロードに必要なパスと機能だけを許可します。
このポリシーでは、サービスが自身のデータベースシークレットだけを読み取り、他には何もできないようにします。
機能はAPIの動詞に対応します。read、create、update、delete、listです。デフォルトでは拒否し、明示的に許可してください。
# policy: billing-app.hcl
path "secret/data/billing/*" {
capabilities = ["read"]
}
path "database/creds/billing-readonly" {
capabilities = ["read"]
}
# everything else is implicitly deniedクラウドネイティブなシークレットストア
単一のクラウド上で運用する場合は、プロバイダーのマネージドストアによって運用上の負担をなくせます。シール/アンシールも、パッチを適用するサーバーも必要ありません。
- AWS Secrets Manager:IAMと統合でき、ローテーション用のLambdaを組み込みでサポートします。
- Azure Key Vault:RBACを使用してシークレット、キー、証明書を保存します。
- GCP Secret Manager:IAMバインディングによってアクセスを制御する、バージョン管理されたシークレットを提供します。
アクセスはクラウドのIAMによって管理されるため、ワークロードは既存のロールを使ってシークレットを読み取れます。別のパスワードは必要ありません。代わりに、ベンダーロックインが発生し、Vaultと比べてマルチクラウドのサポートが弱くなるというトレードオフがあります。
# Read a secret from AWS Secrets Manager (workload uses its IAM role)
aws secretsmanager get-secret-value \
--secret-id prod/billing/db \
--query SecretString --output text
# GCP equivalent
gcloud secrets versions access latest --secret=billing-dbサービスとしての暗号化
シークレットをまったく保存せず、アプリケーションが暗号化キーを保持することもなくアプリケーションデータを暗号化したい場合があります。VaultのTransitエンジンは、まさにこれを実現します。
アプリケーションは平文をVaultに送信し、暗号文を受け取ります。キーを見ることはありません。復号も同じ方法で行います。これをサービスとしての暗号化と呼びます。
この方式の利点は、キーがVault内部にのみ存在し、一元的にローテーションできることです。また、侵害されたアプリケーションは、そもそも保持していないキーを漏えいさせることができません。
# Encrypt data without the app ever seeing the key
vault write transit/encrypt/orders-key \
plaintext=$(echo -n 'card=4111...' | base64)
# returns: ciphertext=vault:v1:abc123...
# Decrypt later
vault write transit/decrypt/orders-key ciphertext='vault:v1:abc123...'ワークロードへのシークレットの注入
保管庫は、アプリケーションがパスやトークンをハードコードせずにシークレットを利用できて初めて役立ちます。一般的な注入パターンには次のようなものがあります。
- サイドカー/エージェント:Vault Agentがアプリケーションと並行して実行され、認証を行い、共有のインメモリボリュームへシークレットを書き込みます。
- CSIドライバー:Secrets Store CSI driverを介して、Kubernetesがシークレットをファイルとしてマウントします。
- SDKによる取得:アプリケーションが起動時に保管庫のAPIを直接呼び出します。
環境変数よりもインメモリファイルシステム(tmpfs)へのマウントを優先し、シークレットが残存する可能性のあるディスクへの書き込みは避けてください。
# Vault Agent template renders a secret to an in-memory file
template {
contents = "DB_PASS={{ with secret \"secret/app/db\" }}{{ .Data.data.password }}{{ end }}"
destination = "/run/secrets/db.env"
}監査ログと説明責任
Vault 内のすべての読み取り、書き込み、認証イベントは、監査ログに記録する必要があります。これにより、インシデント発生時にもシークレット管理の妥当性を説明できます。
監査ログによって、誰が、どのシークレットに、いつ、どこからアクセスしたのかという重要な疑問に答えられます。Vault はログ内の機密性の高い値をハッシュ化するため、ログ自体からシークレットが漏洩することはありません。
監査ログは、改ざんを検知できる独立したシステム(SIEM)に送信してください。そうすれば、攻撃者が Vault ホストを侵害しても、アクセスした内容の証拠まで消去することはできません。
# Enable a file audit device (HMAC-hashes secret values)
vault audit enable file file_path=/var/log/vault/audit.log
# Forward to a SIEM/syslog endpoint for tamper resistance
vault audit enable syslog tag="vault" facility="AUTH"Vault 自体の保護
集中管理型のストアでは、Vault が停止するとすべてが停止するため、リスクが集中します。最も重要な資産として、次のように堅牢化してください。
- すべてのエンドポイントで TLS を使用し、API を暗号化なしで公開してはいけません。
- 厳格なファイアウォールルールの背後にあるプライベートネットワーク上に Vault を配置してください。
- 手動でシャードを扱う必要をなくすため、クラウド KMS による auto-unseal を有効にしてください。ただし、その KMS キーは厳重に保護する必要があります。
- 短いトークン TTL と更新可能なリースを使用し、盗まれたトークンがすぐに期限切れになるようにしてください。
- 速やかにパッチを適用し、異常がないか監査ログを監視してください。
Vault では、多数の障害点を、極めて堅牢に防御された単一の障害点に集約します。
適切なストアの選択
すべての環境に最適な単一のツールはありません。環境に合ったストアを選択してください。
- 単一クラウドで要件が単純な場合は、運用負荷が最も低いネイティブマネージャー(AWS/Azure/GCP)を使用してください。
- マルチクラウドまたはオンプレミスの場合は、HashiCorp Vault によって一貫性のあるポータブルな抽象化を実現できます。
- 動的シークレットまたはサービスとしての暗号化が必要な場合は、Vault のエンジンが最も高機能です。
- Kubernetes を多用する環境では、ストアを CSI ドライバーや External Secrets のようなオペレーターと組み合わせてください。
何を選んでも目的は同じです。分散した平文のシークレットを、監査とアクセス制御が適用された信頼できる唯一の情報源に置き換えることです。
理解度チェック
Vault の保護モデルについての理解度を確認しましょう。
まとめ:Vault とシークレットストア
分散したシークレットを、集中管理され監査可能なストアに置き換える方法を学びました。
- シークレットストアは、集中管理されたストレージ、アクセス制御、監査ログ、暗号化を提供します。
- HashiCorp Vaultは、プラグイン可能なシークレットエンジンと、Shamir's Secret Sharing によって保護されたseal/unsealモデルを使用します。
- 認証方式はプラットフォーム(Kubernetes、IAM、AppRole)から ID を導出し、ポリシーによって最小権限を適用します。
- クラウドネイティブストア(AWS、Azure、GCP)は、移植性と引き換えに運用負荷を低く抑えられます。
- Transit エンジンはサービスとして暗号化を提供するため、アプリがキーを保持する必要はありません。
- エージェントまたは CSI を使ってシークレットをメモリ上のストレージに注入し、すべてのアクセスを記録します。また、最も重要な資産として Vault を堅牢化してください。
次は、シークレットを動的かつ短期間だけ有効なものとして生成し、さらに安全にします。
AI チューターと学ぶ Cyber Security Academy — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 76
- レッスン
- 303
よくある質問
「Vaultとシークレットストア」レッスンは無料ですか?
はい。「Vaultとシークレットストア」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「Vaultとシークレットストア」で何を学びますか?
Vaultなどのツールでシークレットを一元管理します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Vaultとシークレットストア」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シークレットの拡散問題
- Vaultとシークレットストア
- 動的シークレットとリース
- キーのローテーションと検知