AWS KMS（その１）について

##はじめに
　こんにちは。本日はセキュリティスペシャリティを学習している中で自分が弱いなと思ったAWS KMSについて纏めてみようと思います。
　
　よろしくお願いします(｡･ω･)ﾉﾞ
##AWS KMSの概要
　**AWS Key Management Service**（KMS）はデータ暗号化に使用される暗号化キーの作成と管理を行うAWSのマネージド型サービス。AWSのサービスで暗号化処理が行われる場合ほとんど使用されることが多い。
　キーの管理や可用性、物理的セキュリティ、ハードウェア管理はAWS側の責任範囲になっており、KMSの暗号化キーの操作履歴は**CloudTrail**に保存される。

##エンベロープ暗号化とは
　一般的な暗号化方式では、平文のデータを何らかの鍵を使って暗号化することで保護します。このとき、この鍵がデータとセットで盗まれてしまうと、暗号を解かれてしまい、生のデータを見られてしまいます。そこで、**データを暗号化した鍵**を、**別の鍵でさらに暗号化する**ことでデータをより強固に保護しよう、というのがエンベロープ暗号化の考え方です。
　
　・**Customer Master Key（CMK）**：CDKを暗号化するためのキー
　・**Customer Data Key（CDK）**　：データを暗号化するためのキー

##KMS API
　KMSを利用する際の主なAPIの説明

**◆GenerateDataKey**
　　CMKにより暗号化されたCDKとプレーンなCDKの二種類のキーが返される
**◆GenerateDataKeyWithoutPlaintext**
　　CMKにより暗号化されたCDKのみ返される。暗号化されたデータキーを暗号化用とで取り出したい場合は、不用意にプレーンなＣＤＫを取り出さないためにこのＡＰＩを使用します。

**◆Decrypt**
　　暗号化されたCDKをCMKで複合することができます。

**◆Encrypt**
　　CMKは生成されたリージョン内でしか利用できないため、別リージョンでは新たに生成する必要があり、CDKを別リージョンでEncryptを使用してCDKを別リージョンのCMKを暗号化する。

**◆CreateKey**
　　新規CMKを作成。

**◆CreateAlias**
　　CMKを別名として呼び出し管理できるエイリアスを生成します。エイリアスを指定してEncryptやGenerateDataKeyを実行することができる。

**◆DisableKey**
　　CMKの無効化に使用する。

**◆EnableKeyRotation**
　　CMKのローテーションを有効にする。

**◆DescribeKey**
　　指定したSMKの詳細を表示する。

##CMKのタイプ

　**◆カスタマー管理CMK**
　・AWS利用者が作成・管理・所有するCMK
　・開発したアプリケーションでデータを暗号化する際に使用する
　・キーポリシーの表示やエイリアス作成などの各操作（※詳細後述）が実行できる
　・１年ごとの自動ローテーションの有効/無効を設定できる

　**◆AWS管理CMK**
　・アカウント内にあるAWSサービスが利用者に代わって作成・管理・使用するCMK
　・KMSのマネコン上に**aws/[サービス名]**で表示される
　・キーポリシーの表示は可能だが変更はできず管理操作も実行できない
　・３年ごとにAWS側で自動ローテーションされる

　**◆AWS所有CMK**
　・アカウントに関係なくAWSが所有し管理しているCMK
　・こちら側からは見えない仕様のためあまり意識する必要がなく、AWSサービスが裏側で暗号化のために使用するものと思えばよし

| CMKのタイプ | CMK管理 | AWSアカウント内 | メタデータ表示 | ローテーション |
|:-:|:-:|:-:|:-:|:-:|
| カスタマー管理CMK  | 〇 | 〇  | 〇  | １年間  |
| AWS管理CMK  | ✕  |  〇 |  〇 | ３年間  |
| AWS所有CMK  | ✕  |  ✕ |  ✕ |  ✕ |

##CMKの有効化と無効化
　カスタマー管理のCMKは無効化、無効化後の再有効化ができます。AWS管理のCMKは永続的に有効化されており、無効化できなく無効にしたCMKは再度有効化するまで使用することができません。
　
　**APIによるCMKの有効化と無効化**
　　**EnableKey**または**DisableKey**を呼び出すことで有効化または無効化ができます。

　**・有効化キー（CLI）**

```
aws kms enable-key --key-id ~~
```

　**・無効化キー（CLI）**

```
aws kms disable-key --key-id ~~
```
##CMKの削除
　利用者が作成したCMKは、削除することができます。ただCMKを削除した場合、元に戻すことはできない。
　CMKの削除は非常にリスクが高いため、即時実行はできない。7～30日間の待機期間が設けられており、この期間はCMKが削除されない。デフォルトは30日間です。この待期期間はCMKの状態が削除保留中となり、待機期間中CMKは利用することができません。削除日時（待機期間の終了日時）は、マネコン、CLI、APIからそれぞれ確認できる。

##CMKのローテーション
　**自動キーローテーション**
KMSには自動キーローテーションという機能があり、ローテーションとは新しいCMKを作成し、それ以降の暗号化処理は新しいCMKを使用することとなり、ローテーションを行ってもCMKを一意に指定するkey-idは同じままになる。自動キーローテーションを有効にすると、1年ごとにキーが自動ローテーションされる。

　**手動キーローテーション**
　セキュリティ要件などで、キーのローテーション機関が1年では長すぎる場合、短い期間で手動ローテーションを行う必要がある。手動ローテーションとは単純に新しいCMKを作成することです。key-idも新しくなるため、アプリケーション側でkey-idを指定して呼び出している場合は、アプリケーションに設定しているkey-idを合わせて更新する必要があります。
　
##キーマテリアルのインポート
　**・キーマテリアル**：CMKには暗号や複合に使用されるキーデータだけではなく、作成日、説明などのメタデータも含まれ暗号や覆道に使用されるキーデータのこと。

　**・Bring Your Own Key（BYOK）**：キーマテリアルがユーザー独自に作成したものをインポートすること
　
##BYOKの制約
　インポートしたキーマテリアルを使用する場合、通常のAWSが生成するCMKと比べ以下のような制約や違いがあります。

　**・インポートするキーは256bitの対称キーのみ**
　**・手動ローテーションする必要がありキーの自動ローテーションができない。1つのCMKに対し1つのインポートしたキーマテリアルしか設定できないという制約があるため**
　**・リージョン障害などでCMKに障害があった場合、自動復旧されないためユーザー側でバックアップをしておく必要がある**
　**キーマテリアルに有効期限が設定可能で期限が切れると即時削除される。**
##おわりに

　1つの記事にまとめようと思いましたがもう少し続きます。

　(｡･ω･)ﾉﾞバイバイ