FOR LEARNERS学習中向け

Mセキュリティ・コスト・ガバナンス段2構成層仕組み

Secrets Manager と Parameter Store の仕組み|秘密をコードに書かない置き場と選び方

Secrets Manager と Parameter Store の仕組み|秘密をコードに書かない置き場と選び方

アプリをデータベースにつなぐパスワード、外部の API を呼ぶためのキー。動かすことを優先すると、設定ファイルや環境変数に平文で書いてしまいがちです。「Secrets Manager を使うべき」とは聞くけれど、Parameter Store とどう違うのか、ローテーションとは何が起きることなのか、アプリはいつ値を取りに行くのかが分からないまま、構成図の箱だけを覚えていませんか。この記事は、秘密の値をコードの外に出す理由から始めて、2つの置き場の仕組みと選び方を、IAM と KMS の役割を分けて整理します。

この記事の結論

  • パスワードや API キーをコードに書くと、コードが複製される場所すべてに秘密が広がり、変えるたびにコードの修正とデプロイが要ります。
  • AWS Secrets Manager は秘密の値を保管し、ローテーション(定期的な作り直し)とアカウントやリージョンをまたぐ共有まで受け持つサービスです。
  • Systems Manager Parameter Store は設定値を階層の名前で一元管理する置き場で、SecureString の型にすると KMS で暗号化して保存できます。
  • どちらも、読めるかどうかは IAM のポリシーで決まり、暗号化された値を開くには KMS キーを使う許可も要ります。
  • 自動のローテーションが要る認証情報は Secrets Manager、設定値と、ローテーションの要らない秘密を低い費用で置くなら Parameter Store が基本の選び方です。

パスワードや API キーをなぜコードに書かないのか

秘密の値をソースコードに書くと、困ることが3つあります。

1つ目は、秘密が広がることです。コードはリポジトリに入り、開発者の端末に複製され、ビルドの成果物やログにも残ります。コードを読める人は全員、その秘密も読めます。公開のリポジトリに一度でも上げれば、履歴から消しても取り戻せません。

2つ目は、変えにくいことです。パスワードを変えるたびにコードを直してデプロイし直すことになり、変える頻度が下がります。漏れたかもしれないと分かったときに、すぐ差し替えられません。

3つ目は、誰がいつ使ったかが分からないことです。コードの中の文字列は、読まれた記録を残しません。

AWS Secrets Manager と Parameter Store は、この3つを逆にするための置き場です。秘密はコードの外の保管庫に置き、読める人を IAM で絞り、値はアプリが実行時に取り出し、取り出した記録は CloudTrail に残ります。たとえるなら、合鍵を机の引き出しに入れておくのをやめて、鍵の保管庫に預けることです。誰が鍵を出してよいかは名簿(IAM のポリシー)で決め、鍵は定期的に作り直し(ローテーション)、使う人は必要なときに借ります。

CHECK 1ここまでの確認

アプリのデータベースのパスワードを、ソースコードの中に書かないほうがよい一番の理由は何ですか?

答えと解説

答え: 1. コードを読める人と、コードが置かれた場所すべてに秘密が広がり、変えるときにコードの修正と配布が要るから

コードはリポジトリ・ビルドの成果物・端末に複製されます。秘密もそこへ一緒に広がり、変えるたびにデプロイが要ります。「パスワードや API キーをなぜコードに書かないのか」を読み直してください。

Secrets Manager と Parameter Store とは(何を置く場所か)

AWS Secrets Manager

Secrets Manager は、データベースの認証情報・API キー・OAuth のトークンのような秘密の値を保管するためのサービスです。1つの秘密をシークレットと呼び、ユーザー名とパスワードのように複数の項目を JSON でまとめて持てます。値は KMS で暗号化して保存されます。

秘密の値のために作られているので、Parameter Store にない機能を持っています。

  • 自動のローテーション(Lambda 関数による作り直し、または対応するサービスが受け持つ管理型のローテーション)
  • シークレットごとのリソースポリシー(別のアカウントに読ませるときに使う)
  • 別のリージョンへのレプリケーション(災害対策の側でも同じ名前で最新の値を読める)

Systems Manager Parameter Store

Parameter Store は、AWS Systems Manager の機能の1つで、設定値を /myapp/prod/db/host のような階層の名前で一元管理する置き場です。値の型は3つあります。

  • String(ふつうの文字列)
  • StringList(カンマ区切りの並び)
  • SecureString(KMS で暗号化して保存する文字列。パスワードなどの秘密に使う)

パラメータには標準とアドバンストの2つの階層があります。公式ドキュメントでは、標準は1つの値が 4 KB まで、アカウントとリージョンごとに 10,000 個まで、追加の料金なし。アドバンストは 8 KB まで、100,000 個まで、有効期限などのパラメータポリシーが使え、料金がかかります。Parameter Store には自動のローテーションの機能はありません。

観点 Secrets Manager Parameter Store
主な用途 秘密の値(DB の認証情報・API キー) 設定値全般と、秘密の値(SecureString)
暗号化 常に KMS で暗号化 SecureString のときに KMS で暗号化
自動のローテーション あり(Lambda 関数か管理型) なし
アカウントをまたぐ共有 リソースポリシーとカスタマー管理キーで可能 アドバンストパラメータを AWS RAM で共有(読み取りだけ)
別リージョンへの複製 あり リージョンごとに置く
料金 シークレットの数と API の呼び出しに応じて 標準パラメータは追加料金なし。アドバンストは有料

TWO PLACES2つの置き場

作り直しまで任せるならSecrets Manager、設定をまとめるならParameter Store

Secrets Manager

秘密の値のための保管庫

  • 常に KMS で暗号化
  • 自動のローテーション
  • リソースポリシーで別アカウントへ
  • 別リージョンへ複製

Parameter Store

設定値を階層の名前で一元管理

  • SecureString で KMS 暗号化
  • ローテーションの機能は無い
  • /myapp/prod/ のような階層
  • 標準パラメータは追加料金なし
出典: AWS Secrets Manager ユーザーガイド、AWS Systems Manager ユーザーガイド(Parameter Store)

なお、Parameter Store の /aws/reference/secretsmanager/ から始まる名前で取り出すと、Secrets Manager のシークレットを Parameter Store の API で読めます。設定値の読み込みを Parameter Store にそろえたまま、秘密だけ Secrets Manager に置く、という組み方ができます。

ローテーションはどう動くのか

ローテーションは、秘密の値を定期的に新しいものに作り直し、データベースなどの側の値も同時に変えることです。漏れていたとしても、その値が使える期間を短くできます。

Secrets Manager では、ローテーションを Lambda 関数(ローテーション関数)が4つの段階で進めます。シークレットには版(バージョン)があり、どの版が今使うものかをステージングラベルという印で区別します。

ROTATIONローテーションの4段階

新しい値を作って・変えて・試してから印を移す

  1. createSecret

    新しい値を AWSPENDING の版で保存

  2. setSecret

    DB の側のパスワードを新しい値に

  3. testSecret

    新しい値で接続できるか試す

  4. finishSecret

    AWSCURRENT を新しい版へ。古い版は AWSPREVIOUS

出典: AWS Secrets Manager ユーザーガイド(Lambda rotation functions)
  1. createSecret — 新しい値を作り、AWSPENDING の印を付けた版として保存する
  2. setSecret — データベースやサービスの側の認証情報を、新しい値に変える
  3. testSecret — 新しい値で実際に接続できるかを試す
  4. finishSecret — AWSCURRENT の印を新しい版へ移す。古い版には AWSPREVIOUS が付く

アプリは「AWSCURRENT の版をください」と取り出すので、ローテーションが終わった瞬間から新しい値を受け取ります。

単一ユーザーと交代ユーザー

データベースのローテーションには、2つのやり方があります。単一ユーザー方式は、1人のユーザーのパスワードを変えます。いちばん単純ですが、パスワードを変えてからシークレットが更新されるまでの短い間に、古い値での接続が断られることがあります。交代ユーザー方式は、同じ権限のユーザーを2人用意し、ローテーションのたびに交互にパスワードを変えます。切り替えの最中も、どちらかの有効な値をアプリが受け取れるので、接続が断られにくくなります。その代わり、ユーザーを複製するための権限の強いユーザーの認証情報を、別のシークレットとして用意します。

RDS などの一部のサービスは、サービスの側がローテーションを受け持つ管理型のローテーションに対応していて、その場合は Lambda 関数を自分で用意しません。

CHECK 2ここまでの確認

Secrets Manager のローテーションで、新しい値を試している途中のバージョンに付くラベルはどれですか?

答えと解説

答え: 2. AWSPENDING

新しい値は AWSPENDING の印で作られ、試し終えてから AWSCURRENT に移ります。古い値には AWSPREVIOUS が付きます。「ローテーションはどう動くのか」を読み直してください。

暗号化とアクセス制御はどこで効くのか

秘密を読めるかどうかは、2つの門で決まります。1つ目は IAM のポリシーで、シークレットやパラメータを読む操作(secretsmanager:GetSecretValue や ssm:GetParameter)が許されているか。2つ目は KMS で、値を暗号化したキーを使って復号する操作(kms:Decrypt)が許されているかです。どちらかが閉じていれば、値は取り出せません。

TWO LOCKS読み取りの門

読む許可と復号の許可がそろったときだけ値が出てくる

IAM(GetSecretValue)と KMS(Decrypt)

  • 同読み取り+復号を許可 値を受け取る同じアカウントの実行ロール
  • 同読み取りだけ許可 復号できないKMS の許可が無い
  • 別別アカウントのロール 許した分だけリソースポリシー+自分のキー
  • 別別アカウントのロール 読めないAWS マネージドキーのまま
出典: AWS Secrets Manager ユーザーガイド(Access secrets from a different account)

KMS による暗号化

Secrets Manager のシークレットは、何も指定しなければ aws/secretsmanager という AWS マネージドキーで暗号化されます。公式ドキュメントは多くの場合このキーで足りるとしていますが、別のアカウントに読ませたいときや、キーポリシーで使える人を絞りたいときは、自分で作るカスタマー管理キーが要ります。AWS マネージドキーで暗号化したシークレットは、別のアカウントからは読めません。Parameter Store の SecureString も、同じように KMS キーで暗号化されます。KMS のキーポリシーや鍵の作り直しの仕組みは、この記事では深入りせず別の記事で扱います。

IAM でのアクセス制御

読み取りの許可は、使う側の IAM ロールに付けます。Lambda 関数なら実行ロール、ECS のタスクならタスク実行ロールかタスクロールに、必要なシークレットやパラメータだけを読む許可を付けます。Parameter Store は名前が階層になっているので、/myapp/prod/ の下だけを読ませる、という絞り方がしやすくなっています。別のアカウントのロールに読ませるときは、シークレットのリソースポリシー、カスタマー管理キーのキーポリシー、読む側の IAM のポリシーの3つで許可を揃えます。

READ ALSO — 未経験向け・段1 入口 IAM ポリシーの評価の仕組み|許可と拒否はどの順で決まるか

CHECK 3ここまでの確認

別のアカウントのアプリにシークレットを読ませたいとき、IAM のポリシーのほかに何が要りますか?

答えと解説

答え: 1. シークレットのリソースポリシーと、カスタマー管理キーのキーポリシーでの許可

アカウントをまたぐ読み取りには、読む側の IAM のポリシーに加えて、シークレットのリソースポリシーと、暗号化に使った KMS キーの許可が要ります。AWS マネージドキーではアカウントをまたげません。「暗号化とアクセス制御はどこで効くのか」を読み直してください。

アプリはどう取り出すのか

取り出す時点を決める

アプリが値を取り出す時点は、大きく2つあります。

  • 起動するときに1回だけ取り出す。ECS のタスク定義で、シークレットやパラメータを環境変数として渡す形がこれです。公式ドキュメントのとおり、あとで値がローテーションされても、動いているコンテナには届きません。新しいタスクを起動し直すまで古い値のままです。
  • 使うときに取り出す。アプリが SDK で Secrets Manager や Parameter Store を呼びます。ローテーションに追随できますが、呼び出しのたびに API の呼び出し回数と待ち時間が増えます。

キャッシュで呼び出しを減らす

使うときに取り出す形では、取り出した値を一定時間だけ手元に置いておくキャッシュを挟むのが基本です。Lambda には、Secrets Manager と Parameter Store の値をキャッシュする AWS Parameters and Secrets Lambda Extension があり、関数からはローカルの HTTP で値を受け取れます。EC2・ECS・EKS・Lambda で同じ形を使いたいなら、AWS Workload Credentials Provider(旧称 Secrets Manager Agent)があります。

キャッシュの保持時間は、ローテーションの頻度と合わせて決めます。保持時間が長いと API の呼び出しは減りますが、ローテーションの直後に古い値を使い続ける時間が長くなります。交代ユーザー方式のように、切り替えの直後も古い値がしばらく有効なやり方と組み合わせると、この時間のずれで接続が断られにくくなります。

取り出し方 ローテーションへの追随 向いている場面
起動時に環境変数で渡す 起動し直すまで古い値 ローテーションしない設定値、再起動を伴う更新
使うたびに SDK で取り出す すぐに追随 呼び出しが少ない処理
キャッシュを挟んで取り出す 保持時間のぶん遅れる 呼び出しが多い処理、Lambda・コンテナ

Secrets Manager と Parameter Store はどちらを選ぶのか

迷ったときは、次の順に問いを当てると決めやすくなります。

  1. 自動のローテーションが要るか。データベースの認証情報を定期的に作り直したいなら Secrets Manager です。
  2. 別のアカウントや別のリージョンから同じ秘密を読ませたいか。そうなら Secrets Manager のリソースポリシーやレプリケーションが使えます(Parameter Store もアドバンストパラメータなら AWS RAM で別のアカウントに読み取りだけ共有できます)。
  3. どちらでもなく、設定値(接続先の名前・機能の切り替え・AMI の ID など)か、ローテーションの要らない秘密を低い費用で置きたいなら、Parameter Store の String や SecureString で足ります。

実際の構成では両方を使うのがふつうです。接続先やタイムアウトのような設定値は Parameter Store の階層に置き、データベースのパスワードは Secrets Manager に置いて自動でローテーションする。アプリからは Parameter Store の参照の名前でまとめて取り出す、という分け方です。

秘密の扱いでやってはいけない3つ

  • パスワードや API キーをソースコード・設定ファイル・ログに平文で残す
  • すべてのシークレットを読める広い許可を、アプリのロールにまとめて付ける
  • ローテーションを有効にしたのに、アプリが起動時に読んだ値を使い続ける作りのままにする

Cloudory 執筆者(AWS 認定 全冠)

構成図で Secrets Manager の箱を見たら、「誰が読めるか(IAM)」「何で暗号化しているか(KMS)」「いつ取り出すか(起動時かキャッシュか)」の3つを確かめると、その構成の秘密の扱いが読めます。箱があるだけで安全になるわけではありません。

参照ソース

SCOREこの記事の確認テスト

0/3問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

合鍵を机の引き出しに入れておくのをやめ、鍵の保管庫に預ける仕組みです。誰が出してよいかは名簿で決め、鍵は定期的に作り直し、使う人は必要なときに保管庫から借ります。

FAQよくある質問

環境変数にパスワードを入れるのは、コードに書くのと何が違いますか?

コードからは外れますが、関数やタスクの設定に平文で残り、設定を見られる人には値が見えます。値を変えるときも設定の更新が要ります。Secrets Manager や Parameter Store に置き、実行ロールに読み取りだけを許して実行時に取り出す形にすると、見える人と変える手間を減らせます。

Secrets Manager と Parameter Store の料金はどう違いますか?

Parameter Store の標準パラメータは追加の料金がかからず、アドバンストパラメータと高いスループットの設定には料金がかかります。Secrets Manager はシークレットの数と API の呼び出し回数に応じて料金がかかります。金額は改定されることがあるので、それぞれの公式の料金ページで確認してください。

この記事のあとに何を学ぶとよいですか?

シークレットを読める権限を、アカウントや役割ごとにどう絞るかに進むのが自然です。複数のアカウントで権限を組む考え方は、マルチアカウントの権限設計の記事で扱っています。暗号化の鍵そのものの仕組み(KMS のキーポリシーや鍵のローテーション)は、別の記事で扱います。

SAME TRACK同じ領域の記事

AWS Security Hub が SBOM インベントリを提供|組織横断で「どのパッケージがどこに」が分かる
AWS Security Hub が SBOM インベントリを提供|組織横断で「どのパッケージがどこに」が分かる NEWS段2 構成とは
Codex を Bedrock 経由で使う|LiteLLM ゲートウェイで予算とレート制限を握る
Codex を Bedrock 経由で使う|LiteLLM ゲートウェイで予算とレート制限を握る NEWS段2 構成とは
請求が急に増えたときの調べ方|Cost Explorer で絞り、Budgets と異常検出で早く気づく運用
請求が急に増えたときの調べ方|Cost Explorer で絞り、Budgets と異常検出で早く気づく運用 段2 構成運用