+ 作るログイン
1 / 20
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 20:秘密の管理 ― Secrets Manager と KMS

発行
アニメモ公式
版
第2版
改訂
コマ
全20

DB のパスワードや API キーをコードに書くと、Git の履歴やログに残り続けます。秘密を AWS の金庫(Parameter Store・Secrets Manager)に置いて IAM ロールで取り出す方法、自動のローテーション、通信時と保存時の暗号化、鍵を守る KMS とエンベロープ暗号化の考え方を、フォトログを例に説明します。

DB のパスワードは、今どこに書いてある?

第19章で、デプロイのための AWS の鍵は、どこにも置かなくなりました。OIDC で、そのとき限りの鍵をもらう形にしたからです。

でも、フォトログにはまだ書いてある秘密があります。アプリが RDS(第13章)に接続するためのパスワードです。図のように、アプリの設定ファイルに DB_PASS = "..." と書いてあり、アプリはそれを使って RDS に入っています。

このパスワードが書かれがちな場所を並べてみます。

場所誰が読めるか
アプリの設定ファイル(Git に入っている)リポジトリを見られる全員。過去の版も含めて
CDK のコード(第18章)同上。さらに、生成されたテンプレートとスタックの画面にも出る
ユーザーデータ(第9章)EC2 の設定を見られる人。サーバーの中からも読める
焼いた AMI(第10章)その AMI から起動できる人全員
環境変数やログサーバーに入れる人、ログを読める人(第17章)

どの場所も、「読める人」が思っているよりずっと多いのです。

この章では、パスワードや API キー(外部サービスを使うための合言葉)のような秘密を安全にしまう方法と、データそのものを守る暗号化の仕組みを学びます。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 1 / 20
  • DB のパスワードは、今どこに書いてある?
  • VPC(フォトログ)
  • # config.js
  • DB_HOST = photolog-db…
  • DB_PASS = "Ph0t0log!2026"
  • サーバー
  • データベース
  • EC2(アプリ)
  • パスワードで接続
  • RDS
  • RDS に入りたい
  • パスワードで守られた DB
  • 書いてある場所の例:設定ファイル・CDK のコード(第18章)・ユーザーデータ(第9章)・焼いた AMI(第10章)
  • どれも Git の履歴・ログ・画面に残り、「読める人」が思っているよりずっと多い
  • ひらめき
  • 第19章で鍵は置かなくなった。でも DB のパスワードは、まだ設定ファイルの中にある。

コードに書いた秘密は、消しても消えない

「後で気づいたら、コードから消せばいい」と思うかもしれません。ところが、そうはいきません。

Git は、過去のすべての版を残す道具です(第18章)。図のように、2つ目の版で秘密を書き、4つ目の版で消したとしても、2つ目の版にさかのぼれば、秘密はそのまま読めます。

起きることなぜ困るか
リポジトリを見られる人は全員読める退職した人、外注先、うっかり共有した相手も
間違えて公開すると、数分で見つかる公開リポジトリから鍵やパスワードを探し回る機械(ボット)が常に動いている
漏れると DB の中身を丸ごと読まれる利用者の個人情報が流出する
変えたいとき、全部の置き場所を書き換える設定ファイル・AMI・スクリプト……1か所でも忘れると止まる
誰が見たかわからない漏れたかどうかすら判断できない

GitHub などには、秘密らしい文字列が入るのを見つけて止める機能(シークレットスキャン)もあります。便利な安全網ですが、根本の解決はそもそもコードに秘密を書かないことです。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 2 / 20
  • コードに書いた秘密は、消しても消えない
  • 漏れると
  • DB の中身を丸ごと読まれる
  • 最初
  • 秘密を追加
  • 修正
  • 秘密を削除
  • 変えたいとき
  • 全部の置き場所を書き換える
  • Git の履歴:どの版にもさかのぼれる
  • 誰が見たか
  • わからない
  • NG
  • リポジトリを見られる人は全員読める
  • NG
  • 公開すると、数分で機械に見つかる
  • ひらめき
  • Git は過去の版をすべて残す。一度入れたパスワードは、後の版で消しても履歴から読める。

秘密は金庫にしまい、コードには「金庫の名前」だけ書く

解決の考え方はシンプルです。パスワードそのものは AWS の金庫にしまい、コードには「金庫のどの引き出しか」という名前だけを書く。

図では、EC2 と RDS の間に Secrets Manager(シークレッツマネージャー)という金庫が置かれています。設定ファイルに書いてあるのは photolog/prod/db という名前だけです。

設定ファイルに書く金庫に置く
中身秘密の名前(photolog/prod/db)パスワードそのもの
漏れたら名前だけでは何もできない―
読める人リポジトリを見られる人金庫が許した IAM ロール(第3章)を持つものだけ

EC2 には、第9章から IAM ロールを付けてきました。このロールに「photolog/prod/db を読んでよい」という許可を1つ足します。すると、そのロールを持つ EC2 だけが金庫から秘密を取り出せます。人がパスワードを知る必要はありません。

さらに、金庫から秘密を取り出すたびに、誰がいつ読んだかが記録されます(第27章で扱う CloudTrail)。「漏れたかどうかわからない」がなくなります。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 3 / 20
  • 秘密は金庫にしまい、コードには「金庫の名前」だけ書く
  • VPC(フォトログ)
  • 錠
  • Secrets Manager
  • 秘密の金庫
  • サーバー
  • # config.js
  • データベース
  • DB_SECRET = "photolog/prod/db"
  • EC2(アプリ)
  • RDS
  • RDS に入りたい
  • パスワードで守られた DB
  • IAM ロール:読み取りだけ
  • コードや Git に残るのは「photolog/prod/db」という名前だけ。名前が漏れても、中身は読めない
  • 中身を読めるのは、金庫が許した IAM ロールを持つものだけ。誰がいつ読んだかも記録される(第27章の CloudTrail)
  • ひらめき
  • パスワードは AWS の金庫に置き、アプリは動くときに IAM ロールで取り出す。

取り出しの流れ:ロールで金庫を開けて、DB に入る

アプリが DB に接続するまでの流れを、図の番号の順に追います。

番号何が起きるか
①アプリは、EC2 のロールの一時的な鍵(第3章。自動で入れ替わる)を使って、Secrets Manager に「photolog/prod/db を読ませて」と頼む
②Secrets Manager は、ロールに読む許可があるかを確かめ、パスワードを渡す(通信は暗号化されている)
③アプリはそのパスワードで RDS に接続する

この流れで大事なのは、パスワードがどこのファイルにも書かれていないことです。パスワードはアプリのメモリの中にだけ、少しのあいだ存在します。

第19章の OIDC と同じ考え方であることに気づいたでしょうか。「長く生きる秘密をあちこちに置く」のではなく、「身元(ロール)を確かめて、そのとき必要なものを渡す」。AWS で安全に作るときの、何度も出てくる型です。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 4 / 20
  • 取り出しの流れ:ロールで金庫を開けて、DB に入る
  • VPC(フォトログ)
  • 錠
  • ① ロールで「読ませて」
  • Secrets Manager
  • 秘密の金庫
  • サーバー
  • ② パスワードを渡す
  • データベース
  • EC2(アプリ)
  • ③ 接続
  • RDS
  • RDS に入りたい
  • パスワード
  • パスワードで守られた DB
  • IAM ロール:読み取りだけ
  • ひらめき
  • EC2 はロールで金庫に頼み、受け取ったパスワードで接続する。どこにも書かない。

金庫は2つ:Parameter Store と Secrets Manager

AWS には、値をしまっておく場所が主に2つあります。

Parameter StoreSecrets Manager
正式な位置づけAWS Systems Manager の機能の1つ秘密のための専用サービス
向いているもの設定値(接続先・機能の切り替えなど)と、小さな秘密DB のパスワード、API キー
暗号化SecureString を選ぶと KMS で暗号化常に KMS で暗号化
入れ替え(ローテーション)自分で仕組みを作る自動のローテーションを持つ
RDS などとの連携―RDS がパスワードを作って置き、入れ替えまで行える
お金標準のパラメータは追加料金なし秘密1つごとの月額と、呼び出しの回数

使い分けの目安はこうです。

迷ったら選ぶもの
秘密ではない設定値Parameter Store(String)
入れ替える予定の無い、小さな秘密Parameter Store(SecureString)でもよい
DB のパスワードなど、定期的に入れ替えたい秘密Secrets Manager
  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 5 / 20
  • 金庫は2つ:Parameter Store と Secrets Manager
  • 設定
  • 錠
  • Parameter Store
  • Secrets Manager
  • Systems Manager の一部。設定値の置き場
  • 秘密のための専用の金庫
  • 置けるもの
  • 設定値・暗号化した値
  • 置けるもの
  • パスワード・API キー
  • 入れ替え
  • 自分で作る
  • 入れ替え
  • 自動のローテーション
  • お金
  • 標準は追加料金なし
  • お金
  • 秘密の数と呼び出し回数
  • ひらめき
  • 設定値や小さな秘密は Parameter Store、入れ替えたい秘密は Secrets Manager。

Parameter Store:名前を階層にして値を置く

Parameter Store では、値に /photolog/prod/db/host のような、フォルダのように区切った名前を付けられます。

部分意味
/photologサービスの名前
/prod環境(第18章の dev・stg・prod)
/db/host何の値か

こうしておくと、IAM の許可を「/photolog/prod/* だけ読んでよい」と書けます。本番の EC2 は本番の値だけ、試験環境の EC2 は試験の値だけを読めるようになり、取り違えや読みすぎを防げます。

値の種類は3つです。

種類使いどころ
Stringふつうの設定値。秘密ではないもの
StringListカンマ区切りの並び
SecureStringKMS(この章の後半)で暗号化して置く。秘密はこれを使う

図の下のコマンドは、SecureString の値を取り出す例です。--with-decryption を付けると、暗号化を解いた値が返ります(解く権限が必要です)。

アプリから読む場合も、コマンドと同じ操作を SDK(プログラムから AWS を使うための部品)で行います。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 6 / 20
  • Parameter Store:名前を階層にして値を置く
  • /photolog/prod/db/host String
  • String
  • ふつうの値(秘密でない)
  • /photolog/prod/feature/like String
  • /photolog/prod/api/mapkey SecureString
  • StringList
  • カンマ区切りの並び
  • /photolog/stg/db/host String
  • SecureString
  • KMS で暗号化して置く
  • IAM の許可を「/photolog/prod/*」に絞れば、本番のアプリは本番の値だけ読める
  • aws ssm get-parameter --name /photolog/prod/api/mapkey --with-decryption
  • ひらめき
  • 名前を階層にすると、環境ごとに読める範囲を IAM で絞れる。秘密は SecureString で。

Secrets Manager:秘密を JSON で置き、RDS と組む

Secrets Manager では、1つの秘密の中に、ユーザー名・パスワード・接続先などを JSON(第3章)でまとめて置くのが一般的です。図の左が、フォトログの DB の秘密の例です。

Secrets Manager のいちばんの強みは、RDS との連携です。RDS を作るときに「管理者のパスワードを Secrets Manager で管理する」を選ぶと、次のことを RDS がやってくれます。

RDS がやること意味
パスワードを生成する人が考えた弱いパスワードにならない
Secrets Manager に置く人が一度も見ずに済む
定期的に入れ替える既定では7日ごと。間隔は変えられる

つまり、誰もパスワードを知らない状態を作れます。知らないものは、漏らしようがありません。

アプリ用のユーザー(図の photolog_app)のように、管理者以外の DB ユーザーの秘密も、Secrets Manager に置いてローテーションを設定できます。アプリは管理者ではなく、必要な権限だけを持つアプリ用のユーザーで接続するのが基本です(最小権限、第3章)。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 7 / 20
  • Secrets Manager:秘密を JSON で置き、RDS と組む
  • 秘密:photolog/prod/db
  • {
  • データベース
  • RDS が管理するパスワード
  • "username": "photolog_app",
  • 作成時に選ぶと、人はパスワードを一度も見ない
  • "password": "(自動で作られた長い文字列)",
  • "host": "photolog-db.xxxx.rds.amazonaws.com",
  • "port": 5432
  • 作る
  • RDS が生成して金庫に置く
  • }
  • 入れ替える
  • 既定で7日ごと
  • 人が知る必要
  • 無い
  • ひらめき
  • RDS は管理者のパスワードを自分で作って金庫に置き、既定で7日ごとに入れ替える。

ローテーション:パスワードを定期的に入れ替える

ローテーションは、パスワードを定期的に新しいものへ入れ替えることです。

なぜ入れ替えるのでしょうか。どれだけ気をつけても、秘密が漏れる可能性はゼロになりません。しかし定期的に入れ替えていれば、漏れた値は、次の入れ替えで使えなくなります。漏れたことに気づかなくても、被害の期間を区切れます。

Secrets Manager のローテーションは、図の4段で進みます。

番号段何をするか
1作る新しいパスワードを作り、「準備中(AWSPENDING)」の印を付けて置く
2設定するDB 側のパスワードも新しい値に変える
3試す新しい値で本当に DB に入れるかを確かめる
4切り替える新しい値に「現在(AWSCURRENT)」の印を移す

この4段を実際に行うのは Lambda(第22章で詳しく扱う、小さなプログラムを動かすサービス)の関数です。RDS などの代表的な DB 向けには、AWS が用意した関数を使えます。RDS が管理するパスワードなら、この仕組みごと AWS が面倒を見ます。

入れ替えの瞬間に接続が切れないように、古い値も「前の値(AWSPREVIOUS)」として少しのあいだ残ります。また、DB のユーザーを2人用意して交互に入れ替える方式もあります。

アプリ側で気をつけるのは、起動時に1回だけ読んで、ずっと持ち続けないことです。次のページで読み方を見ます。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 8 / 20
  • ローテーション:パスワードを定期的に入れ替える
  • 鍵
  • データベース
  • OK
  • 更新
  • 新しい値を作る
  • DB に設定する
  • 試す
  • 切り替える
  • AWSPENDING
  • DB 側も変える
  • 新しい値で入れるか
  • AWSCURRENT に
  • 入れ替える仕組み
  • Lambda(第22章)の関数が4段を行う。RDS などは AWS が用意したものを使える
  • 入れ替え中の接続
  • 古い値(AWSPREVIOUS)も少しのあいだ残る。2人の利用者を交互に使う方式もある
  • アプリの注意
  • 起動時に1回だけ読んで持ち続けない。接続に失敗したら読み直す
  • ひらめき
  • 漏れても、次の入れ替えで使えなくなる。自動にしておけば、人が入れ替え忘れることもない。

アプリから読む:毎回ではなく、少しのあいだ覚えておく

図は、フォトログのアプリ(Node.js)が Secrets Manager から DB の秘密を読むコードです。

行意味
new SecretsManagerClient({})鍵は書かない。EC2 のロールが自動で使われる
if (cached && … < 5 * 60_000)5分以内に読んだ値があれば、それを使う
GetSecretValueCommand金庫から秘密を読む
JSON.parse(r.SecretString)JSON を読み、ユーザー名やパスワードを取り出す

なぜ「5分覚えておく」のでしょうか。

読み方問題
リクエストのたびに金庫を呼ぶ遅くなる。呼び出しの回数ぶん料金がかかる。呼び出しの上限に当たることもある
起動時に1回だけ読むローテーションで値が変わると、接続できなくなる
少しのあいだ覚え、期限が来たら読み直す速さと、入れ替えへの追従を両立できる

さらに、「DB への接続がパスワードの誤りで失敗したら、覚えている値を捨てて読み直す」ようにしておくと、ローテーションの直後でも自然に新しい値へ移れます。

AWS は、このキャッシュを自分で書かずに済むように、キャッシュ付きの読み取りライブラリや、サーバーの中で動かす Secrets Manager Agent も用意しています。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 9 / 20
  • アプリから読む:毎回ではなく、少しのあいだ覚えておく
  • import { SecretsManagerClient, GetSecretValueCommand } from "@aws-sdk/client-secrets-manager";
  • const sm = new SecretsManagerClient({}); // 鍵は書かない。EC2 のロールが使われる
  • let cached, at = 0;
  • async function dbSecret() {
  • if (cached && Date.now() - at < 5 * 60_000) return cached; // 5分は覚えておく
  • const r = await sm.send(new GetSecretValueCommand({ SecretId: "photolog/prod/db" }));
  • cached = JSON.parse(r.SecretString); at = Date.now();
  • return cached;
  • }
  • AWS はキャッシュ付きの読み取りの部品(ライブラリや Secrets Manager Agent)も用意している
  • ひらめき
  • 毎回金庫を呼ぶと遅く高い。数分覚えておき(キャッシュ)、失敗したら読み直す。

もう1つの守り:暗号化(保存時と通信時)

ここからは、秘密の置き場所から少し視野を広げて、データそのものを守る暗号化の話をします。

暗号化は、データを、鍵が無いと読めない形に変えることです。鍵を持つ人だけが元の形に戻せます(復号)。暗号化には、守る場面によって2種類あります。

種類守るものたとえ図では
通信時の暗号化運んでいる途中のデータ中身の見えない封筒に入れて郵送する青い鍵の印。利用者 → ALB → EC2 → RDS の各区間
保存時の暗号化置いてあるデータ金庫にしまっておく緑の印。ディスク・S3・DB の中身

通信時の暗号化が無いと、途中の回線でデータを覗かれるおそれがあります。保存時の暗号化が無いと、ディスクやバックアップのファイルが何らかの形で持ち出されたときに、中身をそのまま読まれます。

どちらも「設定したつもり」になりやすいので、次の2ページで、どの区間・どの部品で何をするかを1つずつ確かめます。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 10 / 20
  • もう1つの守り:暗号化(保存時と通信時)
  • 通信時:TLS(HTTPS)で包んで運ぶ
  • 人々
  • 利用者
  • ネットワーク
  • サーバー
  • データベース
  • ディスク
  • 錠
  • ALB
  • 錠
  • EC2
  • 錠
  • RDS
  • 保存時:ディスク・S3・DB の中身を暗号化
  • 暗号化=鍵が無いと読めない形に変えること。鍵を持つ人だけが元に戻せる(復号)
  • どちらも「設定したつもり」になりやすい。次の2つで、どこで何をするかを見る
  • ひらめき
  • 通信時は「運ぶ途中で覗かれない」、保存時は「盗まれても読めない」ようにする。

通信時の暗号化:どの区間も TLS で包む

通信時の暗号化には TLS を使います。TLS は、第14章の HTTPS の「S」の部分、つまり通信を暗号化する仕組みです。フォトログの通信を区間ごとに見ます。

区間どうするか
利用者 → ALB・CloudFrontHTTPS。ACM の証明書(第14章)を使い、HTTP で来たら HTTPS へ転送する
ALB → EC2VPC の中の区間。社内の決まりや業界の基準で求められるなら、ここも HTTPS にする
EC2 → RDSDB への接続を TLS にする。RDS の設定で、TLS 以外の接続を断れる
EC2 → S3・Secrets ManagerAWS の API は HTTPS。S3 のバケットポリシーで「TLS 以外は断る」とも書ける

図の下は、RDS for PostgreSQL で TLS 以外の接続を断る設定です。パラメータグループ(DB の設定をまとめたもの、第13章)で rds.force_ssl を 1 にします。MySQL など他の DB エンジンにも、同じ目的の設定があります。

「VPC の中だから安全」と考えて、中の区間を暗号化しないこともよくあります。それが許されるかは、扱うデータと、守るべき決まり(個人情報の扱い、業界の基準など)で決まります。迷ったら暗号化しておくのが安全です。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 11 / 20
  • 通信時の暗号化:どの区間も TLS で包む
  • 利用者 → ALB・CloudFront
  • HTTPS(ACM の証明書・第14章)。HTTP は HTTPS へ転送
  • ALB → EC2
  • VPC の中。決まりや要件によっては、ここも HTTPS にする
  • EC2 → RDS
  • DB の接続を TLS に。RDS の設定で TLS 以外を断れる
  • EC2 → S3・金庫
  • AWS の API は HTTPS。TLS 以外を断るポリシーも書ける
  • # RDS for PostgreSQL のパラメータグループ
  • rds.force_ssl = 1 # TLS 以外の接続を断る
  • ひらめき
  • 利用者と ALB の間は第14章の証明書で HTTPS。VPC の中の区間も、DB への接続は TLS を求めておく。

保存時の暗号化:S3・EBS・RDS それぞれの決まり

保存時の暗号化は、部品ごとに「既定でどうなっているか」「いつ設定できるか」が違います。ここを知らないと事故になります。

部品既定の状態何をするか
S3(第15章)新しく置くオブジェクトは既定で暗号化されるより細かく管理したいなら、KMS の鍵を指定する
EBS(第10章)アカウントの設定しだいリージョンごとに「既定で暗号化」を有効にする。以後に作るディスクがすべて暗号化される
RDS(第13章)作るときに選ぶ作成時にしか選べない。後から暗号化に切り替えることはできない

図の下の3つの印のとおり、暗号化は利用者から見るとほぼ透明です。

印内容
○アプリの読み書きの手間は変わらない。暗号化と復号は AWS が裏で行う
○スナップショットやバックアップも同じ鍵で暗号化される
×暗号化していない RDS を暗号化するには、スナップショットを暗号化してコピーし、そこから作り直すしかない

特に RDS は、最初に暗号化を選び忘れると、後で直すのに作り直しが必要です。第18章の IaC のコードで、暗号化を最初から書いておくのが確実です。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 12 / 20
  • 保存時の暗号化:S3・EBS・RDS それぞれの決まり
  • フォルダ
  • ディスク
  • データベース
  • S3(第15章)
  • EBS(第10章)
  • RDS(第13章)
  • 新しいオブジェクトは既定で暗号化
  • リージョンごとに「既定で暗号化」を入れる
  • 作成時に選ぶ。後から付けられない
  • OK
  • 暗号化しても、アプリからの読み書きの手間は変わらない(AWS が裏で行う)
  • OK
  • スナップショットやバックアップも同じ鍵で暗号化される
  • NG
  • 暗号化していない RDS を暗号化するには、スナップショットを暗号化してコピーし、作り直す
  • ひらめき
  • S3 は既定で暗号化される。EBS は「既定で暗号化」の設定を入れる。RDS は作るときにしか選べない。

KMS:鍵の金庫。鍵は金庫の外に出ない

暗号化には鍵が必要です。では、その鍵はどこに置けばよいのでしょうか。鍵をパスワードのようにファイルに書いたら、元の問題に戻ってしまいます。

そこで使うのが AWS KMS(Key Management Service)です。KMS は、暗号化の鍵を作り、専用の頑丈な機械の中で守るサービスです。

KMS のいちばんの特徴は、鍵(KMS キー)そのものは KMS の外に取り出せないことです。鍵を使いたいときは、「このデータを暗号化して」「これを元に戻して」と KMS に頼む形になります。図では、EBS・S3・Parameter Store が、それぞれ KMS に頼んでいます。

特徴意味
鍵は外に出ない鍵そのものが盗まれる心配が小さい
誰が使えるかを決められるキーポリシー(鍵ごとの利用許可)と IAM で、使える人・サービスを絞る
使うたびに記録されるCloudTrail(第27章)に「誰がいつどの鍵を使ったか」が残る
鍵の入れ替え自動の入れ替え(既定は1年ごと。期間は変えられる)を設定できる。古い鍵で暗号化したデータも読める

つまり、「データを読めるかどうか」を、鍵を使う権限で管理できるようになります。S3 のバケットを誤って読める設定にしてしまっても、鍵を使う権限が無ければ中身は読めません。守りが二重になります。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 13 / 20
  • KMS:鍵の金庫。鍵は金庫の外に出ない
  • AWS KMS
  • ディスク
  • EBS
  • 誰が使えるか
  • キーポリシーと IAM
  • 「暗号化して」
  • 鍵
  • 記録
  • 使うたびに CloudTrail へ
  • フォルダ
  • S3
  • 「元に戻して」
  • 入れ替え
  • 自動の入れ替えができる
  • KMS キー
  • 外に取り出せない
  • 設定
  • Parameter Store
  • SecureString
  • ひらめき
  • KMS は暗号化の鍵を作って守るサービス。鍵そのものは取り出せず、「これを暗号化して」と頼んで使う。

鍵の種類:AWS に任せるか、自分で管理するか

KMS の鍵には、管理のしかたで3つの種類があります。

種類誰が管理するかできることお金
AWS 所有のキーAWS。アカウントからは見えない何もしなくても暗号化される追加料金なし
AWS マネージドキーAWS がサービスごとに作る(aws/ebs、aws/rds など)使うのは簡単。ポリシーは変えられない鍵の月額はかからない
カスタマーマネージドキー自分で作る誰が使えるかを決める、止める、消す、入れ替えの間隔を決める鍵1つごとの月額

何も指定しなければ、AWS 所有のキーか AWS マネージドキーが使われます。それでもデータは暗号化されています。

では、いつ自分の鍵(カスタマーマネージドキー)を作るのでしょうか。

理由例
鍵を使える人を細かく絞りたい「本番の EC2 のロールと DB 管理者だけ」
鍵の使用を見張りたい普段と違う人が鍵を使ったら気づきたい
他のアカウントと共有したいバックアップ用のアカウントで復元したい(第29章)
いざというとき止めたい鍵を無効にすれば、そのデータは誰も読めなくなる

フォトログでは、本番の RDS と S3 を自分の鍵で暗号化することにします。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 14 / 20
  • 鍵の種類:AWS に任せるか、自分で管理するか
  • 鍵の種類
  • 誰が管理する・何ができる
  • AWS 所有のキー
  • AWS が管理。アカウントからは見えない。追加料金なし
  • AWS マネージドキー
  • サービスごとに AWS が作る(aws/ebs など)。使うのは無料、ポリシーは変えられない
  • カスタマーマネージドキー
  • 自分で作る。誰が使えるかを決め、止めたり消したりできる。月額がかかる
  • ひらめき
  • フォトログ:本番の RDS と S3 はカスタマーマネージドキーで
  • 鍵を使える人を絞り、使われた記録を見張れるようにする
  • ひらめき
  • 何もしなければ AWS の鍵が使われる。使える人を自分で決めたいなら自分の鍵を作る。

エンベロープ暗号化:データの鍵を、KMS の鍵で包む

KMS には、1回に送って暗号化できるデータの大きさに上限があります(小さなものに限られます)。10MB の写真や、何百 GB のディスクを、まるごと KMS に送って暗号化するわけにはいきません。

そこで使われるのが エンベロープ暗号化(封筒の暗号化)です。図の番号の順に見ます。

番号何が起きるか
1暗号化したいデータ(写真)がある
2KMS に頼んで、その場限りのデータキーをもらう。手元で、データキーを使って写真を速く暗号化する
3データキーそのものを、KMS キーで暗号化して包む(封筒に入れる)
4「包んだデータキー」と「暗号化した写真」を一緒に置く。包まれていない生のデータキーは捨てる

読むときは逆です。包んだデータキーだけを KMS に送って開けてもらい(小さいので送れる)、手元でそのデータキーを使って写真を戻します。

利点理由
大きなデータも速い重い暗号化は手元で行い、KMS には小さな鍵だけを送る
守りは KMS の鍵に集まるKMS の鍵を使う権限が無ければ、封筒が開かず、写真も読めない

S3・EBS・RDS の暗号化は、裏でこの仕組みを使っています。自分で意識することは少ないですが、「KMS の鍵を使えない人は、データを読めない」理由がここにあります。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 15 / 20
  • エンベロープ暗号化:データの鍵を、KMS の鍵で包む
  • メール
  • 写真
  • 写真(10MB)
  • 鍵
  • データキー
  • 錠
  • KMS キー
  • 写真を暗号化
  • データキーを包む
  • 包んだ鍵+
  • 暗号化した写真
  • なぜ包むのか
  • KMS に送れるデータは小さい。大きなデータは手元で速く暗号化したい
  • 読むとき
  • 包んだデータキーだけを KMS に送って開けてもらい、手元で写真を戻す
  • 守られること
  • KMS の鍵を使う権限が無ければ、包みが開かず、写真も読めない
  • ひらめき
  • 大きなデータは手元の「データキー」で暗号化し、そのデータキーを KMS の鍵で暗号化して一緒に置く。

フォトログの秘密と暗号化

この章の内容を、フォトログに当てはめて決めます。

対象どうするか
DB のパスワードRDS が管理する形にし、Secrets Manager で7日ごとに入れ替える
地図サービスの API キーSecrets Manager に置く。外部サービス側の入れ替えもあるので、手順を決めて入れ替える
機能の切り替え・接続先Parameter Store(String)。/photolog/prod/… の階層で
読む権限本番の EC2 のロールに、本番の秘密の読み取りだけを許す。書き換えの権限は与えない
RDS・S3・EBSカスタマーマネージドキーで暗号化。鍵を使えるのは本番のロールと管理者だけ
通信利用者との間は HTTPS(第14章)。DB への接続も TLS 以外は断る

CDK(第18章)を使っていれば、これらはほとんどコードに書けます。たとえば RDS を作るときに「パスワードは Secrets Manager で管理」「暗号化はこの鍵で」と書き、アプリのロールに secret.grantRead(role) のように読み取りだけを許す、といった形です。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 16 / 20
  • フォトログの秘密と暗号化
  • DB のパスワード
  • RDS が管理(Secrets Manager・7日ごとに入れ替え)
  • 地図サービスの API キー
  • Secrets Manager。入れ替えは手順を決めて手で
  • 機能の切り替え・接続先
  • Parameter Store(String)
  • 読む権限
  • 本番の EC2 のロールに、本番の秘密の読み取りだけ
  • RDS・S3・EBS
  • カスタマーマネージドキーで暗号化
  • 通信
  • HTTPS(第14章)・DB も TLS のみ
  • ひらめき
  • 秘密は金庫、読む権限はロールで最小に、置いてあるものは全部暗号化、運ぶ途中も TLS。

お金:秘密の数・呼び出しの回数・鍵の数

この章の道具の料金は、次の単位で決まります。

道具何に課金されるか
Parameter Store(標準)追加料金なし。高度なパラメータは、数と呼び出しで課金
Secrets Manager秘密1つごとの月額 + 呼び出しの回数
KMS(カスタマーマネージドキー)鍵1つごとの月額 + 暗号化・復号などの呼び出しの回数
KMS(AWS の鍵)鍵の月額はかからない。呼び出しは課金の対象になることがある
暗号化そのものEBS・S3・RDS を暗号化しても、保存料は変わらない

単価と無料枠は、それぞれの料金ページで確認してください。

いちばん効く節約は、呼び出しを減らすことです。この章で見たキャッシュ(数分覚えておく)はその代表です。S3 でも、バケット単位のデータキーを使う設定(S3 バケットキー)で、KMS への呼び出しを大きく減らせます。

暗号化は保存料を増やさないので、「お金がかかるから暗号化しない」という理由はほとんどありません。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 17 / 20
  • お金:秘密の数・呼び出しの回数・鍵の数
  • Parameter Store(標準)
  • 追加料金なし。高度なパラメータは数と呼び出しで課金
  • Secrets Manager
  • 秘密1つごとの月額 + 呼び出しの回数
  • KMS(自分の鍵)
  • 鍵1つごとの月額 + 暗号化・復号の呼び出し回数
  • KMS(AWS の鍵)
  • 鍵の月額はかからない。呼び出しは課金されることがある
  • 暗号化そのもの
  • EBS・S3・RDS の暗号化で、保存料は変わらない
  • キャッシュで呼び出しを減らすのが、いちばん効く節約。単価と無料枠は料金ページで確認する
  • ひらめき
  • Secrets Manager は秘密1つごとの月額と呼び出し回数。KMS は自分の鍵1つごとの月額と呼び出し回数。

よくある落とし穴

秘密と暗号化でよくある事故を並べます。

落とし穴何が起きるか対策
Git に入れたパスワードを消して安心履歴から読めるすぐに入れ替える。消すより先に、漏れた値を使えなくする
取り出したパスワードをログに出すログを読める人全員に漏れる(第17章)ログに書く前に取り除く
読み取りの権限を「全部の秘密」に1台乗っ取られると全部の秘密が漏れる名前の階層で絞る
起動時に1回だけ読むローテーションの後、接続できなくなるキャッシュの期限と、失敗時の読み直し
KMS の鍵を消すその鍵で暗号化したデータは永久に読めないまず「無効」にして様子を見る。消すのは最後
RDS を暗号化せずに作る後から暗号化できないIaC のコードで最初から暗号化を書く

特に怖いのが、KMS の鍵の削除です。鍵を消すと、その鍵で包んだデータキーが開けられなくなり、データは AWS にも戻せません。そのため KMS は、削除の操作の後に待ち期間を設けています(次のページ)。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 18 / 20
  • よくある落とし穴
  • NG
  • Git に入れたパスワードを消して安心 → 履歴に残る。すぐに入れ替える
  • NG
  • 取り出したパスワードをログに出す → ログを読める人全員に漏れる(第17章)
  • NG
  • 読み取りの権限を「全部の秘密」に → 1台乗っ取られると全部漏れる
  • NG
  • 起動時に1回だけ読む → ローテーションの後、接続できなくなる
  • NG
  • KMS の鍵を消す → その鍵で暗号化したデータは永久に読めない
  • OK
  • 秘密は金庫・権限は最小・読むのはキャッシュ付き・鍵は止めてから考える
  • ひらめき
  • Git に入れた秘密は「入れ替える」。KMS の鍵を消すと、データは二度と読めない。

片付け:秘密と鍵は、すぐには消えない

この章で作ったものを消すときは、順番と待ち期間に気をつけます。

番号消すものどう消えるか
1Secrets Manager の秘密削除を予約すると、7〜30日(既定は30日)の待ち期間の後に消える。期間中は取り消せる
2KMS のカスタマーマネージドキーまず「無効」にする。削除を予約すると、7〜30日の待ち期間の後に消える
3Parameter Store の値すぐに消える
4RDS・スナップショット鍵より先に消す

待ち期間は、間違って消したときに取り消すための猶予です。待ち期間中の鍵は使えませんが、取り消せば元に戻ります。

順番は、データ → 秘密 → 鍵です。鍵を先に消してしまうと、残ったスナップショットやバックアップが、二度と読めなくなります。「もう要らないはず」のデータでも、読めなくなってから必要になることがあるので、この順番を守ってください。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 19 / 20
  • 片付け:秘密と鍵は、すぐには消えない
  • 錠
  • 鍵
  • Secrets Manager の秘密
  • KMS のカスタマーマネージドキー
  • 削除を予約 → 7〜30日後に消える(取り消せる)
  • まず「無効」→ 削除を予約(7〜30日)
  • 設定
  • データベース
  • Parameter Store の値
  • RDS・スナップショット
  • すぐに消える
  • 鍵より先に消す(鍵が無いと戻せない)
  • 順番が大事:データ → 秘密 → 鍵。鍵を先に消すと、残ったスナップショットが読めなくなる
  • ひらめき
  • 秘密と KMS の鍵は、消す操作の後に7〜30日の待ち期間がある。取り消すための猶予。

まとめ:秘密は金庫へ、データは鍵で包む

この章では、秘密をコードから追い出し、データを暗号化で守りました。

項目内容
コードの秘密Git の履歴に永久に残る。コードには金庫の名前だけ書く
Parameter Store設定値と小さな秘密。名前の階層で権限を絞る。標準は追加料金なし
Secrets Managerパスワード・API キーの金庫。自動のローテーション。RDS が管理する形にもできる
読み方EC2 のロールで読む。少しのあいだキャッシュし、失敗したら読み直す
暗号化通信時は TLS、保存時は S3・EBS・RDS それぞれの決まりに合わせて設定する
KMS鍵の金庫。鍵は外に出ず、使える人を決め、使われた記録が残る
エンベロープ暗号化データキーでデータを、KMS の鍵でデータキーを包む

これで、第16章で組んだフォトログの構成は、監視され(第17章)、コードで作られ(第18章)、自動で届けられ(第19章)、秘密と暗号化で守られた(第20章)ものになりました。

ところで、第19章のフォトログでは、新しい版を出すたびに AMI を焼いていました。1回のビルドに時間がかかり、AMI はサイズも大きく、たまっていきます。しかも「自分のパソコンでは動くのに、サーバーでは動かない」という食い違いも、まだ起こりえます。アプリを動く環境ごと、軽く運ぶ方法はないでしょうか。次の第21章では、その答えであるコンテナを学びます。

  • AWS でサービスを作る 20 ― 秘密の管理:Secrets Manager と KMS
  • 20 / 20
  • まとめ:秘密は金庫へ、データは鍵で包む
  • コードの秘密
  • Git の履歴に永久に残る。コードには金庫の名前だけ書く
  • Parameter Store
  • 設定値と小さな秘密。名前の階層で権限を絞る。標準は無料
  • Secrets Manager
  • パスワード・API キー。自動のローテーション。RDS と組める
  • 読み方
  • ロールで読む。キャッシュし、失敗したら読み直す
  • 暗号化
  • 通信時は TLS、保存時は S3・EBS・RDS それぞれ設定する
  • KMS
  • 鍵の金庫。鍵は外に出ず、使える人と記録を管理できる
  • エンベロープ
  • データキーでデータを、KMS の鍵でデータキーを包む
  • ひらめき
  • 次の第21章:AMI を焼いて届けるのは遅く重い。アプリを「動く環境ごと」軽く運ぶ方法はないか?

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]