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はマスターキーを利用してデータキーを復号し、クライアントに返す
    • クライアントがデータキーを用いてデータを復号する

参考になるページ

aws.amazon.com

www.slideshare.net