AWS公式資料で挑むSCS認定(9)-KMS

[前回] [AWS公式資料で挑むSCS認定(8)-VPC(続き)](https://qiita.com/mingchun_zhao/items/0513f88627f6c12f53fa)

## はじめに

IAMとVPCについて、なんとか攻略できました(復習・実習はTODO)。
今回のKMS(AWS Key Management Service)は、
AWSサービス全般の認証・認可・データ暗号化などで使用される暗号キーを、
作成のみならず、一元管理・表示および監査機能まで備わっているようです(すごい)。

## 勉強に使用する教材

恒例となりますが、公式資料から3点選びました。

- [AWS KMS の暗号化の詳細](https://docs.aws.amazon.com/ja_jp/kms/latest/cryptographic-details/intro.html)
- [[AWS Black Belt Online Seminar] AWS Key Management Service](https://d1.awsstatic.com/webinars/jp/pdf/services/20181121_AWS-BlackBelt-KMS.pdf)
- [AWS Key Management Service デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/overview.html)

## KMSのアーキテクチャ

KMS は、ウェブとの接点である「KMS host」と、階層化された「HSM」で構成された階層型サービスとなっているとのこと。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/12de94be-fe7e-3a13-49e6-4e0e8282ba05.png)


まず、アーキテクチャの登場人物を見てみましょう。

- KMS interface
    - 暗号化キーを生成および管理するためのウェブインターフェース
    - データを保護するための暗号化サービスプロバイダーとして機能
- KMS host
    - KMS interfaceからの暗号化リクエストを受け取って処理する
- HSM
    - HSMはハードウェアセキュリティモジュール
    - HSM 分散フリート(フリートってなんだ?)に対する暗号化操作は [FIPS 140-2](https://ja.wikipedia.org/wiki/FIPS_140) 規格検証済み(規格要件満たせるので安心して使える)
    - AWS KMS HSMは、KMS のセキュリティおよびスケーラビリティ要件を満たす専用の暗号化機能を提供するように設計されたマルチチップのスタンドアロンハードウェア暗号化アプライアンス
- KMS キー
    - HSM 上でのみ使用でき、暗号化リクエストの処理に必要な時間だけメモリ内に存在(ずっとメモリに存在したら窃取されるリスク)
    - 複数の KMS キーを作成でき、各キーはキー ID で表される
    - ユーザーのAWS IAM ロールとアカウントからのみ、ユーザーのKMS キーを作成、削除でき、データの暗号化、復号化、署名、検証に使用できる
    - ポリシーを作成し KMS キーにアタッチすることで、KMS キーの管理・使用に関するアクセス制御を行う

## KMSの用語と概念

KMSの理解に役立つ、基本的な用語と概念。

- KMS キー
    - キー階層の最上位を表す論理キー
    - KMS キーには、一意のキー ID を含む Amazon リソースネーム (ARN) が与えられる
    - KMS キーの3 つのタイプ
        - カスタマーマネージド型キー
            - ユーザーが、作成、ライフサイクルとキーポリシーの管理を行う(キーへのリクエストは CloudTrail イベントとして記録される)
        - AWS マネージドキー
            - AWS が、作成、ライフサイクルとキーポリシーの管理を行う(ユーザーの AWS アカウント のリソースなので、ユーザーはそのアクセスポリシーと CloudTrail イベントを確認できるが、管理はできない)
        - AWS 所有のキー
            - AWS が、作成、さまざまな AWS サービスで内部の暗号化オペレーションに使用(ユーザーは、キーポリシーや CloudTrail からその使用状況を確認できない)
- エイリアス
    - KMS キーに関連付けられている別名
    - 多くの KMS API 操作でキー ID と同じように使用できる
- アクセス許可(Permission)
    - キーに対するアクセス許可を定義するポリシー
    - KMS キーにアタッチされる
    - デフォルトのポリシー
        - ユーザーが定義するすべてのプリンシパルが許可される
        - AWS アカウントのルートユーザーにより、キーを参照する IAM ポリシーの追加も許可される
- 許可(Grant)
    - KMS キーを使用するため委任されるアクセス許可
    - 初期段階でIAM プリンシパル(KMSキーの使用者)またはキーの使用期間が決まっておらず、IAM ポリシーにアクセス許可を追加できない場合に使用
    - 許可の使用方法
        - AWS サービスにKMS キーを使用する限定されたアクセス許可を与えたい場合(署名されたダイレクト API コールを経由せず、AWS サービスがユーザーに代わり暗号化されたデータに対して非同期作業を行う際)
- データキー
    - HSM で生成され、KMS キーによって保護される暗号化キー
    - 許可されたエンティティは、プレーンテキスト(暗号化されていない)のデータキーと暗号化されたデータキーを取得できる
    - データキーは、対称キーまたは非対称キー
- 暗号文
    - KMS の暗号化された出力、ユーザーの暗号文と呼ばれることもある
    - 暗号文には、復号化プロセスで使用するための KMS キーを識別する追加情報を含む
    - データキーは暗号文の例の1つ
    - サイズが4 KB未満のデータは、KMSキーにより暗号化され暗号文を生成可能
- 暗号化コンテキスト
    - KMS で保護されている情報に関連付けられた、追加情報のキーと値のペアマップ
    - KMS では、データキーの保護に認証済みの暗号化が使用される
    - 暗号化コンテキストは、KMS で暗号化された暗号文で、認証済みの暗号化の AAD に組み込まれる
    - KMSで保護された情報に関連付けられている追加情報で、キーと値のペアマップ
    - KMSは、認証済み暗号を使用してデータキーを保護するが、暗号化コンテキストは、暗号文の認証済み暗号のAAD(認証済み追加データ)に組み込まれている
    - 認証済み追加データ(AAD)は、復号プロセス中に機密性と信頼性が保証される追加データ
    - 暗号化コンテキスト情報はオプショナルで、キー(または暗号化操作)のリクエスト時は返されない。
- 公開キー
    - 非対称暗号 (RSA または楕円曲線) を使用する場合、公開/秘密キーペアにおける公開キー
    - 公開/秘密キーペアの所有者のデータを暗号化する必要のあるエンティティに、公開キーが共有される
    - デジタル署名では、公開キーを使用して署名を検証する
- 秘密キー
    - 非対称暗号 (RSA または楕円曲線) を使用する場合、公開/秘密キーペアにおける秘密キー
    - 秘密キーは、データの復号またはデジタル署名の作成に使用される
    - 秘密キーは HSM で暗号化される(対称 KMS キー同様)

## KMSの設計目標

KMS は下記要件を満たすように設計されているようです。

- 耐久性
    - 暗号化キーの耐久性は、AWS で最高の耐久性を持つサービスと同等に設計されている
    - 1 つの暗号化キーで、長期間にわたって蓄積された大量のデータを暗号化できる

- 信頼性
    - キーの使用は、ユーザーが定義および管理するアクセス制御ポリシーによって保護される
    - プレーンテキストの KMS キーをエクスポートするメカニズムは存在しない(あったら逆に怖い)

- 低レイテンシーと高スループット
    - KMS には、他のAWSサービスからの使用に適した、レイテンシーとスループットを兼ね備えた暗号化オペレーションが用意されている

- リージョンの独立性
    - 異なるリージョンでデータアクセスを制限する必要があるお客様向けに、リージョンの独立性を確保している
    - キーの使用は AWS リージョン 内に限定できる

- 元になる乱数の安全性
    - 強力な暗号は予測不可能な乱数生成に依存する
    - KMS には高品質で検証済みの乱数のソースが用意されている

- 監査
    - 暗号化キーの使用と管理は CloudTrail ログに記録される
    - CloudTrail ログを使用して、AWS のサービスによる暗号化キーの使用状況を調べることができる

これらの目標を達成するため、KMS システムには、「ドメイン」を管理する一連の KMS オペレーターとサービスホストオペレーター (総称して「オペレーター」) が含まれている。

- ドメインとは、リージョンに定義された KMS サーバー、HSM、およびオペレーターのセット
- 各 KMS オペレーターは、アクションの認証に使用される公開キー秘密キーペアを含むハードウェアトークンを持っている
- HSMには、HSM状態の同期を保護する暗号化キーを確立するための、追加の公開/秘密キーペアがある

## 暗号化の基本

KMS の暗号化アルゴリズムのデフォルトセットは、安全性とパフォーマンスのため、連邦情報処理標準(FIPS)のアルゴリズムから選択されている。
なお、暗号化アルゴリズムは設定可能とのこと。

- エンベロープ(Envelope)と乱数生成
    - KMS キー生成は、HSM で実行される
    - HSM では、AES-256 を使った NIST SP800-90A 決定論的ランダムビットジェネレーター (DRBG) CTR_DRBG を使用したハイブリッド乱数生成機能を実装
    - 非決定論的ランダムビットジェネレーターは 384 ビットのエントロピーでシードされ、追加のエントロピーで更新される

- 対称キーのオペレーション(暗号化のみ)
    - HSM 内で使用されるすべての対称キーの暗号化コマンドに、高度暗号化規格 (AES) で 256 ビットキーの Galois Counter Mode (GCM) を使用
    - 復号の際は逆関数を使用
    - AES-GCM は認証済み暗号化スキームで、プレーンテキストの暗号化による暗号文の生成に加え、暗号文と認証が必要な追加データ(AAD)に対する認証タグを計算

- 非対称キーのオペレーション(暗号化、デジタル署名、署名の検証)
    - 暗号化およびデジタル署名のオペレーションの両方で非対称キーオペレーションの使用をサポート
    - 非対称キーのオペレーションは、数学的に関連する公開/秘密キーペアに依存
    - キーペアは、「暗号化および復号化」または「署名およびその検証」に使用できるが、両方には使用できない
    - KMS で秘密キーは必ず暗号化された状態で存在する
    - KMS API を用いて、KMS 内で公開キーを使用することも、公開キーをダウンロードし KMS の外部で使用することもできる
    - KMS では、2 種類の非対称暗号がサポートされる
        - RSA-OAEP(暗号化用) および RSA-PSS/RSA-PKCS-#1-v1_5(署名および検証用)
        - 楕円曲線(ECC): 署名と検証にのみ使用できる
- キー導出関数
    - 最初のシークレットまたはキーから追加のキーを取得するために使用される
    - KMS では、キー導出関数 (KDF) を使用して、KMS キーを使った暗号化コールごとにキーを取得
    - すべての KDF オペレーションでは、SHA256 [FIPS180] で HMAC [FIPS197]を用いたカウンタモードの KDF を使用
    - 256 ビットの導出キーは AES-GCM とともに、暗号化または復号に使用される
- KMS 内部でデジタル署名の使用
    - デジタル署名は、KMS エンティティ間のコマンドや通信を認証するためにも使用される
    - すべてのサービスエンティティには、楕円曲線デジタル署名アルゴリズム (ECDSA) のキーペアがある

- エンベロープ暗号化(Envelope Encryption)
    - 多くの暗号化システムで使用されている基本的な構造
    - 2つ以上の暗号化キーを使用してメッセージを保護
        - 長期的な静的キー
        - メッセージの暗号化のために生成されるメッセージごとのキー
    - エンベロープは、メッセージの暗号化により生成される
    - KMS では、長期的な静的キーを管理し、データをエンベロープ暗号化するプロセスを自動化する機能を提供
    - AWS Encryption SDK では、KMS サービス内で提供される暗号化機能に加え、クライアント側のエンベロープ暗号化ライブラリを提供することで、データとその暗号化に使用している暗号化キーを保護

## KMSのユースケース

KMSを最大限に活用するために役立つユースケースです。
実際の運用に必要な内容ですので、しっかりマスターしたいです。

- Amazon EBS ボリュームの暗号化
    - 各ボリュームは AES-256-XTS を使用して暗号化され、2つの 256 ビットボリュームキーが必要(1 つの 512 ビットボリュームキーと考えられる)
    - ボリュームキーは、アカウントの KMS キーで暗号化される
    - Amazon EBS でボリュームを暗号化するには、アカウントの KMS キーの下にボリュームキー (VK) を生成するためのアクセス権が必要
    - データキーを作成しボリュームキーを暗号化および復号化するため、Amazon EBS に KMS キーへのアクセス権を付与
    - Amazon EBS は、KMS キーを用いて暗号化されたボリュームキーを生成

- クライアント側の暗号化
    - AWS Encryption SDK の API 操作により、KMS キーを使ったエンベロープ暗号化を実行
    - クライアントアプリケーションは、AWS Encryption SDK を使って、KMS を用いたエンベロープ暗号化を実行

## おわりに

今回はKMSのアーキテクチャ、用語、概念を勉強しました。
暗号化の基本やKMSのユースケースも少しかじりました。
次回はKMSのユースケースを軸に、重要事項を深掘りします。
お楽しみに。

[次回] [AWS公式資料で挑むSCS認定(10)-KMS(続き)](https://qiita.com/mingchun_zhao/items/20b47d3ff2a43493aea4)