DEA / ドメイン4 データセキュリティとガバナンス
Secrets Manager と Parameter Store
データパイプラインは、データベースのパスワード、 の キー、接続先のホスト名など、多くの設定値と認証情報を使います。これらをコードやジョブの引数に書くと、漏えいやローテーションの漏れにつながります。 DEA では、認証情報を に保管して自動でローテーションし、ほかの設定値は Parameter Store に置く、という使い分けが問われます。
Point
- Secret は「秘密」で、パスワードや API キーのように漏れてはいけない値です。
- Rotation は「交代、回転」で、認証情報を定期的に新しい値へ替えることです。
- SecureString は、Parameter Store で KMS により暗号化して保存する型です。
- 和訳
- Rotation: 回転、交代
- Weblio英和辞書「rotation」
概要
どちらも「値を安全に保管し、 の権限があるプログラムだけに取り出させる」サービスです。 違いは、 が認証情報のライフサイクル (生成、ローテーション、データベースとの同期) まで面倒を見るのに対し、Parameter Store は設定値の階層的な保管が中心である点です。
| 見るポイント | 代表的な判断 |
|---|---|
| データベースのパスワードを自動で替えたいか | Secrets Manager の自動ローテーションを使います。 |
| 単なる設定値 (名、閾値) か | Parameter Store の String を使います。 |
| 費用を抑えて暗号化した値を置きたいか | Parameter Store の SecureString (標準パラメータ) を使います。 |
| 別アカウントや別で使うか | Secrets Manager のリソースポリシーやレプリカを検討します。 |
主要技術
①Secrets Manager のシークレット
シークレットは、キーと値の組 () やテキストとして保存され、必ず で暗号化されます。既定は AWS マネージドキー (aws/secretsmanager) で、も選べます。
| 機能 | 内容 | 判断ポイント |
|---|---|---|
| 取得 | GetSecretValue で値を取り出します。 | 取り出す主体に secretsmanager:GetSecretValue と、カスタマー管理キーなら kms:Decrypt が必要です。 |
| リソースポリシー | シークレットに付けるポリシーです。 | 別アカウントに共有する場合に使います。その場合はカスタマー管理キーで暗号化し、キーポリシーでも相手を許可します。 |
| レプリカ | シークレットを別へ複製します。 | のパイプラインや で、各リージョンから同じ値を読めます。 |
| バージョンとステージングラベル | AWSCURRENT、AWSPENDING、AWSPREVIOUS で版を区別します。 | ローテーション中も、アプリは AWSCURRENT を読めば正しい値を得ます。 |
②自動ローテーション ⚠️ 頻出
| 方式 | 仕組み | 対象 |
|---|---|---|
| マネージドローテーション | サービス側がローテーションを設定・実行します。 関数は不要です。 | ・ のマスターユーザーのパスワードを で管理する設定、 の管理者パスワードの管理など、サービスが管理するシークレットです。 |
| Lambda 関数によるローテーション | ローテーション用の Lambda 関数が、新しいパスワードの生成、データベースへの設定、検証、切り替えを行います。 | RDS・Aurora・Redshift・ 用のテンプレートがあります。それ以外 ( の キーなど) は自作の関数で替えます。 |
ローテーションの戦略は2つあります。
| 戦略 | 動き | 向いている場面 |
|---|---|---|
| シングルユーザー | 1つのユーザーのパスワードを更新します。 | 一般的な用途です。切り替えの一瞬に古いパスワードで接続していた処理が失敗する可能性があります。 |
| 交代ユーザー (alternating users) | 2つのユーザーを交互に更新し、片方は常に有効です。 | 停止できない高可用の処理向けです。ユーザーを複製する権限 (管理者のシークレット) が必要です。 |
スケジュールは rate() または cron() 式で指定し、最短で4時間ごと、最長で999日ごとにローテーションできます。ローテーションはローテーションウィンドウ (最短1時間) の中で行われます。
ローテーション用の Lambda 関数を 内で動かす場合は、データベースへの経路と、Secrets Manager の API への経路 (インターフェイスまたは ゲートウェイ) の両方が必要です。ローテーションが失敗する典型的な原因です。
③Systems Manager Parameter Store
Parameter Store は、/pipeline/prod/source-bucket のような階層の名前で値を保管します。階層の途中までを指定してまとめて取得 (GetParametersByPath) でき、 ポリシーも階層単位で絞れます。
| 型 | 内容 |
|---|---|
| String | 平文の文字列です。 |
| StringList | カンマ区切りの複数の値です。 |
| SecureString | で暗号化した文字列です。取得時に WithDecryption を指定して復号します。 |
| 項目 | 標準パラメータ | アドバンストパラメータ |
|---|---|---|
| 数 (アカウント・ごと) | 10,000 | 100,000 |
| 値の最大サイズ | 4 KB | 8 KB |
| パラメータポリシー (有効期限、期限前の通知、変更がないことの通知) | 不可 | 可 |
| 他アカウントとの共有 | 不可 | 可 |
| 料金 | 追加料金なし | 有料 |
標準からアドバンストへは変更できますが、アドバンストから標準へは戻せません。 Parameter Store には自動ローテーションの機能はありません。アドバンストパラメータのポリシーで「期限が近い」と通知することはできますが、値の更新は自分で行います。
④Secrets Manager と Parameter Store の比較 ⚠️ 頻出
| 観点 | Parameter Store | |
|---|---|---|
| 主な用途 | データベースの認証情報、 キー | 設定値、機能フラグ、少量の機密値 |
| 自動ローテーション | あり (マネージド、) | なし |
| 暗号化 | 常に で暗号化 | SecureString のときだけ KMS で暗号化 |
| 料金 | シークレットの数と API 呼び出しに課金 | 標準は追加料金なし |
| 別への複製 | レプリカあり | なし |
| 別アカウントとの共有 | リソースポリシー | アドバンストパラメータの共有 |
Parameter Store の /aws/reference/secretsmanager/シークレット名 という名前で、Secrets Manager のシークレットを参照することもできます。設定値の取得を Parameter Store の API に統一したい場合に使えます。
⑤パイプラインからの参照
| 参照する側 | 方法 |
|---|---|
| の接続 | 接続にユーザー名とパスワードを直接書かず、 のシークレットを指定します。ジョブのロールにシークレットの取得権限を付けます。 |
| で取得するか、AWS Parameters and Secrets Lambda Extension で取得結果をし、呼び出しのたびの 呼び出しと遅延を減らします。 | |
| 管理者のパスワードを Secrets Manager で管理できます。Redshift Data API では、シークレットの ARN を指定して認証できます。では、接続先の ・ の認証情報をシークレットで渡します。 | |
| / | MWAA では、 の接続や変数の保管先 (シークレットバックエンド) に Secrets Manager を設定できます。 |
動的参照 {{resolve:secretsmanager:...}} や {{resolve:ssm:...}} でテンプレートに値を書かずに参照します。 |
試験対策
認証情報の問題では、「自動でローテーションしたいか」でまず分けます。ローテーションが要件なら 、設定値の保管や費用重視なら Parameter Store です。 コード・環境変数・ジョブの引数への平文のパスワードの埋め込みは、どの問題でも誤答です。
①判断マトリクス
| 問題文のキーワード | 選ぶもの | 理由 |
|---|---|---|
| のパスワードを30日ごとに自動で替えたい | の自動ローテーション | データベースとシークレットを同期して替えます。 |
| 運用の手間を最小にして RDS のマスターパスワードを管理 | RDS の Secrets Manager 統合 (マネージドローテーション) | 関数を用意せずに済みます。 |
| ローテーション中も接続を切らしたくない | 交代ユーザーの戦略 | 片方のユーザーが常に有効です。 |
| ジョブの 接続にパスワードを書きたくない | Glue 接続に Secrets Manager のシークレットを指定 | ジョブのロールで取得します。 |
| 名や閾値などの設定値を環境ごとに管理 | Parameter Store の階層 (/env/app/...) | 階層で取得と権限を分けられます。 |
| 暗号化した値を追加料金なしで保管したい | Parameter Store の SecureString (標準) | 標準パラメータは追加料金がありません。 |
| 8 KB の値やパラメータの有効期限が必要 | Parameter Store のアドバンストパラメータ | 標準は 4 KB で、ポリシーを使えません。 |
| Lambda から頻繁に読み、遅延と費用を減らしたい | Parameters and Secrets Lambda Extension | 取得結果をします。 |
| 別アカウントのジョブにシークレットを使わせる | リソースポリシー + | AWS マネージドキーは他アカウントに許可できません。 |
| 複数で同じ認証情報を使う | Secrets Manager のレプリカ | リージョンごとに読めます。 |
②よくある誤答
- Parameter Store に自動ローテーションがあると考えること。ローテーションは の機能です。
- ローテーション用の を に置いたのに、Secrets Manager への経路を用意しないこと。か が必要です。
- 別アカウントへの共有で、リソースポリシーだけ設定して キーの許可を忘れること。
- 認証情報を ジョブの引数や Lambda の環境変数に平文で置くこと。
参考文献
- What is AWS Secrets Manager?
- Rotate AWS Secrets Manager secrets
- Rotation schedules
- Lambda function rotation strategies
- AWS Systems Manager Parameter Store
- Choosing parameter tiers in Parameter Store
- Use AWS Secrets Manager secrets in AWS Lambda functions
- AWS Certified Data Engineer - Associate 試験ガイド