AWS Key Management Service (KMS) についてのメモ
使う機会があったので。
- データの暗号化には、通信の暗号化(in transit)と保管データの暗号化(at rest)があるが、KMSは保管データの暗号化に使われる
- KMSは、鍵の保管・管理を提供する
- Customer Master Keyは、KMS内部のHSMでのみ平文で存在し、最大4KBのデータを暗号化・復号化できる
- Customer Master Keyは暗号化された状態で可用性の高いストレージに保管される
- マスターキーをデータ暗号化に直接利用するのではなく、マスターキーで暗号化した暗号キーでオブジェクトを暗号化/復号化する(Envelope Encryption)
- 暗号化の基本的な動作は以下の通り
- 1: クライアントが、CMKのIDとともにkms::GenerateDataKeyを呼び出す
- 2: KMSが、ユニークなCustomer Data Keyを作成
- 3: KMSが、暗号化されたCMKをHSM内で復号化
- 4: KMSが、CMKを用いてCDKを暗号化し、平文のCDKと暗号化されたCDKをクライアントに返す
- 5: クライアントが、平文のCDKを用いてデータを暗号化し、データとともに暗号化されたCDKを保存する
- 復号の際は、暗号化されたCDKをKMSに渡す
- キーポリシーの他に、許可(Grants)を用いてアクセスをコントロールすることができる
- Grantsを用いると、CMKの利用を他のAWSプリンシパルに委任することができる
- 暗号化する際にEncryption ContextというKey/ValueペアをKMSにわたすことができ、復号化の際にも同一の値が求められるようになる(CloudTrailのログに平文で出力されるため、機密情報は含めないようにする)
- Encrypt APIによってデータを暗号化することができ、その結果の暗号文にはヘッダが付与される
- 元データ、生成された暗号文はAWS内には保持されない
- 4KBまでの平文データを暗号化できる
- Decrypt APIによってデータを復号化できる(CMKの指定は不要であり、暗号文のヘッダから該当するCMKが特定される)
- Generate Data Keyによってデータの暗号化に利用するCDKを生成することができる(平文のデータキーと、Encrypt APIで暗号化されたデータキーを返す)
- 平文のデータキーは暗号化処理が終了したら即座に削除し、暗号化されたデータキーは暗号化されたデータとともに保存する
- 復号化の基本的な動作は以下の通り
- クライアントが暗号化されたデータキーをKMSに送信
- KMSはマスターキーを利用してデータキーを復号し、クライアントに返す
- クライアントがデータキーを用いてデータを復号する
参考になるページ
www.slideshare.net