AWS KMS (Key Management Service)まとめ

# KMSの概要
*AWS KMS (Key Management Service)*
データ暗号化に利用するキーを作成・管理を行うためのマネージドサービス。
CMK（マスターキー）と呼ばれる鍵が存在する。
この（CMK）の可用性は99.999999999％（イレブンナイン）
# KMSの仕組み
## エンベロープ暗号化
データを暗号化する鍵（データキー）とデータを暗号化する鍵を暗号化する鍵（マスターキー）を利用する方式。

データ暗号化用の鍵をさらに暗号化するので、セキュリティが強化される。

KMS で使用される鍵
- CMK（Customer Master Key）
	- データキーを暗号化するマスターキー
	- AWSが管理する[HSM](https://e-words.jp/w/HSM.html)内でマスターキーも暗号化される
- 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日の待機時間が用意されており、キャンセルすることが可能。

## 鍵使用の流れ
1. KMS からCMK を取り出す
2. CMK を使用して CDK を複合化
3. CDK を使用して 暗号化されたデータを複合化

## キーローテーション
- カスタマー管理の CMK は1年ごとの自動ローテーションが可能
- AWS管理の CMK は自動ローテーション可能だが、期間は1年固定
- 一年より短い周期で暗号化キーローテーションしたい場合は手動でキーを生成する
### バッキングキー
KMS はローテーションされて現在は使用されていない過去のキーをすべて記録している。
このため古いキーで暗号化したデータも複合することが可能。
これを**バッキングキーと呼ぶ**。

## キーのエイリアス
**CMK にはエイリアス（別名）を付けることが可能**、これは**同一アカウント、同一リージョン内で一意である必要がある**。

エイリアスは付け替えが可能なので、キー更新時に旧キーから新キーへとエイリアスを付け替えることでアプリケーション側の変更が不要となる。
1つのキーに複数のエイリアスを付けることも可能。

## キーマテリアルのインポート
### キーマテリアルとは
CMK のメタデータを除く暗号・複合に利用する部分。
インポートすることをBYOKと呼ぶ。
インポートするキーは256bitの対象キーのみ利用可能。

# KMSのアクセスコントロール
- IAMによるユーザーベースコントロール
- キーポリシーによるリソースベースコントロール
- 許可によるリソースベースコントロール
が可能。

## キーポリシー
リソースベースのポリシーが定義可能。
[条件キー](https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/policy-conditions.html)を用いて設定が可能。

### デフォルトのキーポリシー
```
{
    "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）の作成方法は[こちら](https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/create-grant-overview.html)

# KMS の制約事項
- リージョン間で鍵の共有は不可
	- リージョン間で鍵を共有したい場合は CMK 作成時にマルチリージョンキーを選択する