🔐

AWS Key Management Service(KMS)

2023/07/02に公開

はじめに:AWS KMSの概要

  • CMK(Customer Master Key、カスタマーマスターキー)を管理して、データキーを生成・暗号化・復号するなど、暗号化に必要なキー管理、キーオペレーションを提供するマネージドサービス
  • KMS SDKを使って独自のコードでファイルデータを暗号化することも可能
  • 使用できるユーザー、アプリケーションをリソースベースのポリシー、キーポリシーで制御

KMSキーの種類

  • カスタマー管理キー
    • AWSユーザーが作成・管理・完全に制御するキー
    • 課金:キーストレージ料金、リクエスト量
    • キーポリシー
      • 編集可能
      • 他のアカウントへ共有可能
      • 無効化、削除可能
  • AWS管理キー
    • AWSが管理・管理するキー
    • 課金:リクエスト量のみ
    • キーポリシー
      • デフォルトから変更、削除、無効化ができない

エンベロープ暗号化

対称暗号化

1つのデータキーを使って暗号化・復号

暗号化

  1. KMSキーを指定し、GenerateDataKeyアクションを実行してデータキーを生成する
  2. 生成したデータキーを使用してデータファイルを暗号化する、GenerateDataKeyアクションで暗号化されたデータキーも生成される
  3. 暗号化されていないデータキーはデータファイルの暗号化が終わると削除される

復号

  1. キーを指定し、KMSのDecryptアクションで暗号化されたデータキーを復号
  2. 復号されたデータキーで暗号化されたデータファイルを復号

非対称暗号化

パブリックとプライベートのキーペアを使って暗号化・復号

  • ケース:暗号化する側と復号する側で別々にキー管理

キーのローテーション

  • 自動ローテーション
    • カスタマー管理キー:オプションで有効
    • AWS管理キー:強制
  • 有効
    • KMSは毎年新しいキーマテリアル(暗号化キーの本体である複雑な文字列)を生成
    • 古いキーマテリアルは全て保存され、古いキーマテリアルで暗号化されたデータを復号する場合は古いキーマテリアルを使用

キーのエイリアス(別名)

  • カスタマー管理キー:設定可能
  • エイリアスを使用した手動ローテーション:1年以内の期間でのローテーションや、キーバージョンの独自管理が必要な場合

エイリアス指定のアクション

アプリケーションからは、キーIDの代わりにエイリアスを指定してキーへのアクションを実行できる

例 : 256 ビットの対称データキーを生成 & アウトプット
エイリアス名 (alias/ExampleAlias) を使用して KMS キーを識別

aws kms generate-data-key \
    --key-id alias/ExampleAlias \
    --key-spec AES_256
{
    "Plaintext": "VdzKNHGzUAzJeRBVY+uUmofUGGiDzyB3+i9fVkh3piw=",
    "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "CiphertextBlob": "AQEDAHjRYf5WytIc0C857tFSnBaPn2F8DgfmThbJlGfR8P3WlwAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDEFogLqPWZconQhwHAIBEIA7d9AC7GeJJM34njQvg4Wf1d5sw0NIo1MrBqZa+YdhV8MrkBQPeac0ReRVNDt9qleAt+SHgIRF8P0H+7U="
}

https://docs.aws.amazon.com/cli/latest/reference/kms/generate-data-key.html

  • 復号方法
    • キーIDを指定
    • キーIDは指定せず、CiphertextBlobのメタデータに含まれてるキー情報

キーのインポート

  • オンプレミスで生成したキーマテリアルをアップロードしてカスタマー管理キーとして使用
  • インポートしたキーマテリアルはオンプレミスなど外部で保存できるので、保存する際は保護が必要
  • 使用ケース
    • キーマテリアルの生成手段が特定のソフトウェアなどに限定されている場合
    • KMSから削除した後に同じマテリアルを再利用したい場合

KMSをサポートするサービス

AWS Systems Manager Parameter Store

SecureStringを選択して、KMSキーを指定して暗号化

SecureString

  • スタンダード(標準)
    • 無料
    • KMSキーを使用して直接パラメータ値を暗号化
  • アドバンスト(詳細)
    • 有料
    • エンベロープ暗号化で暗号化

AWS Secrets Manager

パスワードやトークンなどのシークレット情報をKMSキーによって暗号化される

Amazon DynamoDB

  • 保管時のサーバーサイド暗号化をサポート
  • 指定されたKMSキーを使用してテーブルごとのテーブルキーを生成
    • テーブルキー:データ暗号化キーの暗号化に使用
  • デフォルト
    • DynamoDBサービスが所有・管理しているキーを使用して暗号化
    • 無料
  • KMSのAWS管理キー(aws/dynamodb
    • KMSのリクエスト料金が発生
    • IAMポリシーでキーへのアクセスを許可:アプリケーション、テーブル管理者
  • KMSのカスタマー管理キー
    • KMSのリクエスト料金とキー保存料金が発生
    • 可能な動作
      • IAMポリシーでのキーへのアクセス許可
      • キーポリシーでのさらなる制御
      • キーの削除、無効化

Amazon EBS

  • 対象
    • ボリュームに保存されたデータ
    • ボリュームから作成されたスナップショット
    • スナップショットから作成されたボリューム
  • 暗号化処理
    • EC2インスタンスをホストするサーバーで処理
    • ボリュームの暗号化は作成時に決定
    • 既存のボリュームの暗号化の有効・無効は変更できません

Amazon RDS

  • RDSインスタンスのストレージ暗号化は作成時に決定
    • スナップショットリードレプリカも暗号化される
    • そのリージョンのKMSキーを使用して暗号化
      • 他のリージョンにスナップショットをコピー
      • クロスリージョンリードレプリカ
    • 暗号化せずに作成したRDSインスタンスを暗号化
      • 暗号化されていないスナップショットをコピーする際にKMSキーを指定して暗号化

Amazon WorkSpaces

EBSボリュームのアンオグかと同様

Amazon EMR

  • ストレージ:S3、EBS
  • KMSキーによる暗号化を設定

Amazon Redshift

4階層のキーで暗号化

KMSキー:クラスタキーを暗号化

クラスタキー:データベースキーを暗号化

データベースキー:データ暗号化キーを暗号化

データ暗号化キー:クラスタ内のデータブロックを暗号化

Amazon S3

クライアントサイド暗号化(CSE)

  • キー:KMS、独自のキー
  • 要件:アップロードする前に暗号化しなければならない要件に対応
  • 方法
    • CSE-C:オンプレミスのキー使う
    • CSE-KMS:SDKを用いて開発したプログラムでKMSのキーを使用する

サーバーサイド暗号化(SSE)

  • S3に保管されるデータのサービス側での暗号化
    • 暗号化:AWSデータセンターのディスクへ書き込まれる時
    • 復号:オブジェクトデータへアクセスする時
  • 方法
    • SSE-S3(デフォルト)
      • S3が管理するキーによるサーバーサイド暗号化
      • ユーザーがキーの管理をする必要のないので、キーの個別管理要件、追跡監査要件などがなければ選択
      • アップロードできて暗号化されて保管:s3:PutObjectを許可
      • 復号されてダウンロード:s3:GetObjectを許可
    • SSE-KMS
      • KMSで管理しているキーを使ったサーバーサイド暗号化
      • キーを管理する要件がある場合に選択
      • アップロード:s3:PutObjectとキーへのkms:GenerateDataKeyを許可
      • ダウンロード:s3:GetObjectkms:Decryptを許可
      • カスタマー管理キー、AWS管理キーどちらも選択可能
      • CloudTrailによる追跡監査、自動ローテーションの有効・無効、キーの無効化、削除が可能
    • SSE-C
      • ユーザー指定のキーによるサーバーサイド暗号化
      • オンプレミスキーサーバーなどで作成されたキーを使用できる
      • 暗号化キーをAWS側に保存しない要件で選択
      • アップロード:S3サービスはリクエストに含まれた暗号化キーを使って暗号化
      • ダウンロード:同じ暗号化キーを使用

Discussion