Cloud Service
AWS Secrets Manager
DB認証情報やAPIキーなどの機密情報を安全に保管し、世代管理しながら取得とローテーションを自動化するマネージドサービス。
- 1.DB認証情報やAPIキーなどの機密情報を暗号化して一元管理し、アプリからは平文を持たずにAPIで取得できる
- 2.RDSなどと統合した自動ローテーションをサポートし、Lambda関数で任意の認証情報も世代管理できる
- 3.IAMとリソースポリシーで取得権限を細かく制御し、KMSによる暗号化とCloudTrailによる監査を組み合わせる
AWS Secrets Manager は、データベースの接続情報や外部サービスの API キーといった機密情報を安全に保管し、アプリケーションから API 経由で安全に取得するためのマネージドサービスです。機密情報の暗号化、アクセス制御、自動ローテーション、世代管理を一括して提供します。
解決する課題
アプリケーションが必要とする認証情報を、ソースコードや設定ファイル、環境変数に平文で埋め込むと、リポジトリへの漏洩や権限のないユーザーによる閲覧といったリスクが生じます。また、認証情報を定期的に変更しようとしても、複数のアプリケーションや環境に散在していると、安全な差し替えが難しく運用負荷が高くなります。
Secrets Manager は、機密情報を一元的に暗号化保管し、必要なときだけ API で取得させることで平文の散在を防ぎます。さらに認証情報を新しい値へ自動的に切り替えるローテーション機能を備え、古い値と新しい値を世代として管理するため、切り替え中の整合性も保てます。
主要概念と用語
- シークレット: 保管する機密情報の単位。キーと値のペア(JSON 形式)または任意の文字列として保存でき、メタデータやタグも付与できる。
- シークレットの値(シークレット値): 実際に保管される認証情報そのもの。暗号化されて保存され、取得時に復号される。
- バージョン: シークレット値の世代。値を更新すると新しいバージョンが作られ、過去のバージョンも一定範囲で保持される。
- ステージングラベル: 各バージョンに付与する目印。代表的なものに現在値を指す AWSCURRENT、ローテーション中の新しい値を指す AWSPENDING、直前の値を指す AWSPREVIOUS がある。
- ローテーション: 認証情報を新しい値へ自動的に切り替える仕組み。RDS などと統合したマネージドな方式と、Lambda 関数を用いた独自方式がある。
- リソースベースのポリシー: シークレットに直接付与できるポリシー。クロスアカウントアクセスの制御などに用いる。
- KMS キー: シークレット値の暗号化に用いる鍵。AWS マネージドキーと顧客管理キーのいずれかを選べる。
仕様・制限・クォータ
- シークレットの保存形式は、複数のキーと値を持つ JSON、または単一の文字列のいずれかを選べる。バイナリも保存できる。
- 各シークレットは KMS によって暗号化される。鍵を指定しない場合は AWS マネージドキーが使われ、より細かい制御が必要な場合は顧客管理キーを指定する。
- 1 つのシークレット値のサイズには上限があり、大きなファイルの保管には向かない。サイズ上限や 1 アカウントあたりのシークレット数、API のスロットリングといった具体的な数値はリージョンや時期で変動しうるため、最新の公式クォータを確認すること。
- 削除には復元可能な待機期間(回復ウィンドウ)が設けられ、誤削除からの復旧が可能。即時削除を強制することもできるが慎重に扱う。
- リージョン単位のサービスであり、必要に応じて他リージョンへレプリケートして可用性を高められる。
内部の仕組み
シークレット値は保存時に KMS キーを使って暗号化され、取得時に呼び出し元の権限を検証したうえで復号して返されます。アプリケーションは GetSecretValue 系の API を呼び出すことで、平文の認証情報をメモリ上で受け取ります。
ローテーションは、ステージングラベルを使った世代の付け替えによって整合性を保ちます。新しい値はまず AWSPENDING ラベルが付いたバージョンとして作成され、対象システム(例: データベース)側にも反映・検証されたうえで、AWSCURRENT ラベルが新しいバージョンへ移動します。これにより、切り替えの途中でも現在有効な値が一意に定まり、取得側が不整合な値を受け取りにくい設計になっています。マネージドな方式では AWS が用意したローテーションの仕組みを利用でき、独自方式では Lambda 関数に作成・設定・テスト・確定の各ステップを実装します。
設計パターン / ベストプラクティス
アプリケーションには認証情報を直接配布せず、起動時や必要時に API で取得する設計にします。これにより、認証情報を更新しても再デプロイなしに新しい値を反映できます。
シークレットの取得を毎回 API 呼び出しで行うとレイテンシとコストに影響します。AWS が提供するクライアント側のキャッシュ機構を使い、一定時間は取得済みの値を再利用しつつ、ローテーションに追随できるようにするのが定石です。
- データベースには可能な限りマネージドなローテーションを設定し、認証情報の定期的な更新を自動化する。
- IAM ポリシーで取得可能なシークレットを限定し、最小権限を徹底する。タグやリソース名の条件で対象を絞る。
- 環境ごと(本番・検証など)にシークレットを分離し、誤った環境の値を参照しないようにする。
ローテーション直後は古い値がキャッシュに残ることがあります。認証エラー時にキャッシュを破棄して再取得するなど、値が切り替わっても接続が回復するようアプリ側を実装してください。
運用・監視
シークレットに対する API 呼び出し(取得・更新・削除・ローテーションなど)は CloudTrail に記録されるため、誰がいつどのシークレットにアクセスしたかを監査できます。CloudWatch のメトリクスやイベントと組み合わせることで、ローテーションの失敗や想定外のアクセスを検知できます。
- ローテーションの成功・失敗を監視し、失敗時に通知する仕組みを用意する。
- 一定期間ローテーションされていないシークレットを棚卸しし、リスクを可視化する。
- 削除予定のシークレットや、参照されていないシークレットを定期的に洗い出して整理する。
コスト
課金は主に、保管しているシークレットの数(保管期間に応じた月額)と、API 呼び出し回数に基づきます。取得を頻繁に繰り返すワークロードではクライアント側キャッシュによって呼び出し回数を抑えることが、コスト面でも有効です。具体的な単価はリージョンや時期によって変わるため、最新の料金ページで確認してください。なお、暗号化に顧客管理キーを使う場合は KMS 側の費用も発生します。
セキュリティ
シークレット値は常に暗号化され、アクセスは IAM とリソースベースのポリシーで制御します。取得操作には専用の API 権限が必要で、KMS キーの利用権限とあわせて成立するため、二重のアクセス制御が機能します。
取得した認証情報をログやエラーメッセージ、永続ストレージに書き出すと、せっかくの暗号化保管が無意味になります。平文はメモリ上にとどめ、不要になったら速やかに破棄する設計を徹底してください。
クロスアカウントで共有する場合は、リソースベースのポリシーと KMS キーポリシーの双方を適切に設定する必要があります。顧客管理キーを使うと、鍵の利用権限を通じてアクセスをさらに細かく制御でき、鍵の無効化によってアクセスを一括停止することもできます。
Well-Architected の観点
- セキュリティの柱: 認証情報を平文で持たず一元管理し、IAM と KMS で最小権限のアクセス制御を行う。
- 運用上の優秀性の柱: ローテーションを自動化し、認証情報の手動更新による運用ミスとダウンタイムを減らす。
- 信頼性の観点: マルチリージョンへのレプリケーションでシークレットの可用性を確保できる。
試験で問われるポイント
- 機密情報のローテーションが要件なら Secrets Manager、単純なパラメータ保管中心なら別サービスという使い分け。
- RDS などと統合した自動ローテーションが提供されること、独自ローテーションは Lambda で実装すること。
- シークレットの取得には GetSecretValue 系 API と KMS の復号権限の両方が必要であること。
- ステージングラベル(AWSCURRENT、AWSPENDING、AWSPREVIOUS)の役割と、ローテーション中の整合性の保ち方。
- 削除に回復ウィンドウがあり、誤削除から復旧できること。
関連サービス・比較
機密情報やパラメータの保管では、Systems Manager Parameter Store と比較されることが多いです。Parameter Store は設定値の保管に広く使われ、機密値は安全な文字列として保管できますが、認証情報のマネージドな自動ローテーションは Secrets Manager の強みです。
| 観点 | Secrets Manager | Parameter StoreのSecureString |
|---|---|---|
| 主な用途 | 認証情報やAPIキーなど機密情報の管理 | 設定値や機密値を含む幅広いパラメータ管理 |
| 自動ローテーション | RDS統合やLambdaで標準的に対応 | 標準機能としては持たない |
| 世代管理 | ステージングラベルで世代を明示管理 | バージョン履歴を保持 |
| コスト感 | 保管数とAPI呼び出しに応じた課金 | 基本機能は低コストで利用しやすい |
ハンズオン / CLI例
# シークレットの作成(DB認証情報をJSONで保存)
aws secretsmanager create-secret \
--name prod/app/db \
--description "Production database credentials" \
--secret-string '{"username":"app_user","password":"REPLACE_ME"}'
# シークレット値の取得(平文の取り扱いに注意)
aws secretsmanager get-secret-value \
--secret-id prod/app/db \
--query SecretString \
--output text
# シークレット値の更新(新しいバージョンが作成される)
aws secretsmanager put-secret-value \
--secret-id prod/app/db \
--secret-string '{"username":"app_user","password":"NEW_VALUE"}'
# 回復ウィンドウ付きでの削除予約
aws secretsmanager delete-secret \
--secret-id prod/app/db \
--recovery-window-in-days 30
AWS Service
AWS Secrets Managerを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
セキュリティ・ID
比較で見る軸
クラウド: AWS / カテゴリ: セキュリティ・ID / 難易度: basic
導入後に効く点
RDSなどと統合した自動ローテーションをサポートし、Lambda関数で任意の認証情報も世代管理できる
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- AWS
- カテゴリ
- セキュリティ・ID
- 難易度
- basic
- 関連資格
- DVA-C02 / SCS-C02
- 設計柱
- security / operational
判断チェックリスト
- 自社の用途が「セキュリティ・ID / security」に近いか確認する。
- 強みである「DB認証情報やAPIキーなどの機密情報を暗号化して一元管理し、アプリからは平文を持たずにAPIで取得できる」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。