KMS
AWS の暗号鍵管理サービスで、データの暗号化 / 復号に使う鍵を安全に管理する
KMS とは
AWS KMS (Key Management Service) は、データの暗号化・復号に使う暗号鍵を安全に管理するマネージドサービスである。S3、DynamoDB、EBS、Lambda 環境変数など、AWS サービスの暗号化に使われる。
暗号化の仕組み
KMS はエンベロープ暗号化を採用している。まず KMS がデータキー (平文と暗号化済みのペア) を生成し、平文のデータキーでデータを暗号化した後、平文のデータキーを即座に破棄する。保存するのは暗号化済みデータキーと暗号化データのみ。復号時は暗号化済みデータキーを KMS に送り、KMS キーで復号してもらう。
エンベロープ暗号化:
1. KMS がデータキー (平文 + 暗号化済み) を生成
2. 平文のデータキーでデータを暗号化
3. 平文のデータキーを破棄
4. 暗号化済みデータキー + 暗号化データを保存
復号:
1. 暗号化済みデータキーを KMS に送信
2. KMS が KMS キーでデータキーを復号
3. 復号されたデータキーでデータを復号
キーの種類
キーの種類を以下にまとめる。
| 種類 | 置かれる場所 | コスト | 用途 |
|---|---|---|---|
| AWS 所有キー | AWS 側のアカウント | 無料 | 多くのサービスの既定の暗号化 (DynamoDB のテーブルなど) |
| AWS マネージドキー | 自分のアカウント (管理は AWS) | 保管は無料 (使用は課金対象・サービスにより無料) | サービスの暗号化を CloudTrail で追跡したい場合。エイリアスは aws/ebs のようにサービス名が付く |
| カスタマーマネージドキー | 自分のアカウント (管理も自分) | $1/月 + API 呼び出し | キーポリシーを自分で制御したい場合 |
AWS 所有キーは AWS 側のアカウントに置かれるため、キーポリシーを見ることも CloudTrail で使用を追跡することもできない。AWS マネージドキーは自分のアカウントに現れるが、ライフサイクルも権限も変更できず、他アカウントへ共有もできない。しかも 2021 年時点でレガシー扱いとなり、新しい AWS サービス向けには新規作成されなくなった。新旧どちらのサービスも既定では AWS 所有キーで暗号化するため、実務上の選択は「既定のまま (AWS 所有キー) か、制御が必要ならカスタマーマネージドキー」の二択になる。自前で用意した鍵素材をインポートする場合や外部キーストアを使う場合も、カスタマーマネージドキーの一種として扱う。
なお CMK (customer master key) はカスタマーマネージドキーの略語ではなく、KMS キー全般を指した旧称である。現行のドキュメントでは使われないため、設計書やコードのコメントに残っていたら書き換えておく。
Lambda 環境変数の暗号化
Lambda の環境変数はデフォルトで AWS マネージドキーで暗号化される。この既定のキーは Lambda が自分のアカウントに作り、使用料も取らない。機密情報は Secrets Manager で管理し、Lambda から動的に取得する方が安全。
キーのローテーション
カスタマーマネージドキーは自動ローテーションを有効にできる。周期の既定値は 365 日で、90 日から 2560 日 (7 年) の範囲で指定できる。API を呼んで任意のタイミングでローテーションすることも可能だが、こちらは 1 キーあたり生涯 10 回までという上限がある。
自動ローテーションでは、新しいキーマテリアルが生成されるが、古いキーマテリアルも保持されるため、過去に暗号化したデータは引き続き復号できる。キー ID もエイリアスも変わらないので、アプリケーション側の書き換えは不要。料金は 1 回目と 2 回目のローテーションでそれぞれ月額 1 ドルが加算され、3 回目以降は加算されない (つまり月額の上限は 3 ドル)。非対称キー・HMAC キー・CloudHSM のカスタムキーストアで生成したキーは自動ローテーションの対象外。
よくある使い方
よくある使い方を以下にまとめる。
| サービス | 暗号化対象 |
|---|---|
| S3 | オブジェクト (SSE-KMS) |
| DynamoDB | テーブルデータ |
| EBS | ボリューム |
| RDS | データベース |
| Secrets Manager | シークレット |
| Lambda | 環境変数 |
ただし「KMS を使う」がどこまで既定かはサービスによって違う。S3 の既定は S3 管理キーによる SSE-S3 で、KMS を使う SSE-KMS はバケット単位で選ぶ設定である。DynamoDB は既定で暗号化されているが、使われるのは AWS 所有キーなので KMS の料金は発生しない。KMS の請求が立つのはカスタマーマネージドキーを指定したとき、と覚えておくとコストの見積もりを外さない。
KMS の背景や設計思想は関連書籍に詳しい。
この記事は役に立ちましたか?
関連用語
シークレットローテーション
API キーやデータベースパスワードなどの秘密情報を定期的に自動更新するセキュリティプラクティス
IAM
AWS のアクセス管理サービスで、誰が何のリソースにどのような操作を行えるかを制御する
HTTPS / TLS
HTTP 通信を TLS で暗号化し、盗聴 / 改ざん / なりすましを防ぐプロトコル
暗号化
データを第三者が読めない形式に変換し、機密性を保護する技術
Secrets Manager
AWS のシークレット管理サービスで、パスワードや API キーを安全に保存 / 自動ローテーションする
シークレット管理
パスワード、API キー、証明書などの機密情報を安全に保存 / 配布 / ローテーションする手法