KMSの概要
AWS KMS (Key Management Service)
データ暗号化に利用するキーを作成・管理を行うためのマネージドサービス。
CMK(マスターキー)と呼ばれる鍵が存在する。
この(CMK)の可用性は99.999999999%(イレブンナイン)
KMSの仕組み
エンベロープ暗号化
データを暗号化する鍵(データキー)とデータを暗号化する鍵を暗号化する鍵(マスターキー)を利用する方式。
データ暗号化用の鍵をさらに暗号化するので、セキュリティが強化される。
KMS で使用される鍵
- CMK(Customer Master Key)
- データキーを暗号化するマスターキー
- AWSが管理するHSM内でマスターキーも暗号化される
- CDK(Customer Data Key)
- データを暗号化するキー
- ユーザーが都度生成する
CMK の種類
- カスタマー管理CMK
- AWSユーザー側で作成、管理している
- アプリ内で使用するデータなどの暗号化に使用するCMK
- 1年更新(変更可能)
- AWS管理CMK
- AWS側で作成、管理している
- S3,RDSなどのAWSサービスの暗号化に使用される
- 鍵は3年更新(変更不可)
- AWS所有CMK
- AWSが所有しているCMK、ユーザーが触れることはない
CMK の削除
CMKを削除することは可能だが一度削除したCMKは二度と復元できないので暗号化したデータを複合できなくなることがあるので要注意。
削除アクション実行後にも7-30日の待機時間が用意されており、キャンセルすることが可能。
鍵使用の流れ
- KMS からCMK を取り出す
- CMK を使用して CDK を複合化
- CDK を使用して 暗号化されたデータを複合化
キーローテーション
- カスタマー管理の CMK は1年ごとの自動ローテーションが可能
- AWS管理の CMK は自動ローテーション可能だが、期間は1年固定
- 一年より短い周期で暗号化キーローテーションしたい場合は手動でキーを生成する
バッキングキー
KMS はローテーションされて現在は使用されていない過去のキーをすべて記録している。
このため古いキーで暗号化したデータも複合することが可能。
これをバッキングキーと呼ぶ。
キーのエイリアス
CMK にはエイリアス(別名)を付けることが可能、これは同一アカウント、同一リージョン内で一意である必要がある。
エイリアスは付け替えが可能なので、キー更新時に旧キーから新キーへとエイリアスを付け替えることでアプリケーション側の変更が不要となる。
1つのキーに複数のエイリアスを付けることも可能。
キーマテリアルのインポート
キーマテリアルとは
CMK のメタデータを除く暗号・複合に利用する部分。
インポートすることをBYOKと呼ぶ。
インポートするキーは256bitの対象キーのみ利用可能。
KMSのアクセスコントロール
- IAMによるユーザーベースコントロール
- キーポリシーによるリソースベースコントロール
- 許可によるリソースベースコントロール
が可能。
キーポリシー
リソースベースのポリシーが定義可能。
条件キーを用いて設定が可能。
デフォルトのキーポリシー
{
"Id": "key-consolepolicy-3",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/adminA"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/userA"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:DescribeKey",
"kms:GetPublicKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/userA"
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
許可
特定のIAMユーザーやIAMロールなどにCMKの利用を許可することができる機能。
セキュリティグループと同じホワイトリスト方式
AWS CLI や AWS SDK を使用して許可を作成できる
許可(Grant)の作成方法はこちら
KMS の制約事項
- リージョン間で鍵の共有は不可
- リージョン間で鍵を共有したい場合は CMK 作成時にマルチリージョンキーを選択する