NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

歴史・年表でみるAWSサービス(AWS Key Management Service編) -機能一覧・概要・アップデートのまとめ・AWS KMS入門-

小西秀和です。
歴史・年表でみるAWS全サービス一覧 -アナウンス日、General Availability(GA)、AWSサービス概要のまとめ-」から始まったAWSサービスを歴史・年表から機能を洗い出してまとめるシリーズの第6弾です(過去、Amazon S3AWS Systems ManagerAmazon Route 53Amazon EventBridgeについて書きました)。

今回はAWS全体で高度な暗号化機能を提供するAWS Key Management Service(AWS KMS)について歴史年表を作成してみました。
今回もAWS KMSの誕生から機能追加やアップデートを追いながら主要機能を現在のAWS KMSの機能一覧と概要としてまとめています。
これらが、各AWSサービスの機能概要に加えてコンセプトや変わらないもの、変わってきたものを知る手がかりとなればと考えています。
今回の記事の内容は次のような構成になっています。

AWS KMS歴史年表の作成経緯と方法

今回、AWS KMSの歴史年表を作成した経緯は、AWS KMSが2014年に登場して以降、セキュリティの中核となる暗号化機能をAWSサービス全体で幅広く提供してきたため、次のアプローチでAWS KMSの情報を整理したいと考えたためです。

  • AWS KMSの歴史を追いながら、アップデートの変遷を整理する
  • AWS KMSの機能一覧と特徴をまとめる

この年表は主に次のブログやドキュメント履歴のAWS KMSに関する内容を参考にしています。

年表の日付は参考にした資料によってアナウンスや記事投稿のタイミングが違う場合もあったため若干のブレがあります。
掲載している内容は現在のAWS KMSと関係している主要な機能と概要説明に必要なものに限定しています。
つまり、ここの年表にあるものがAWS KMSの機能のアップデートの全てではなく、あくまで私がピックアップした代表的なアップデートであることにご注意ください

AWS KMS歴史年表(2014年11月12日~2022年08月25日までのアップデート)

さて、ここからがAWS KMSの機能に関する年表です。AWS KMSの歴史は本記事執筆時点で7年程度になります。

※テーブルは項目名クリックでソートできます。

年月日 概要
2014/11/12 AWS Key Management Service(AWS KMS)がGeneral Availability(GA)としてアナウンスされる。
Amazon S3、Amazon EBS、Amazon RedshiftがAWS KMSによる暗号化をサポート。
2014/11/24 Amazon Elastic TranscoderがAWS KMSによる暗号化をサポート。
2015/01/06 Amazon Relational Database Service(Amazon RDS)がAWS KMSによる暗号化をサポート。
2015/01/28 Amazon WorkMailがAWS KMSによる暗号化をサポート。
2015/10/01 Amazon Simple Email Service(Amazon SES)がAWS KMSによる暗号化をサポート。
2015/10/01 AWS CloudTrailがAWS KMSによる暗号化をサポート。
2015/10/02 Amazon WorkSpacesがAWS KMSによる暗号化をサポート。
2015/10/15 AWS KMSのキーを7~30日間の待機期間でスケジュールして削除できるようになる。
2015/12/07 Amazon AuroraがAWS KMSによる暗号化をサポート。
2015/12/15 Amazon EC2のEBSブートボリュームでAWS KMSによる暗号化をサポート。
2016/08/11 対称KMSキーに独自のキーマテリアルをインポートできるようになる。
2016/08/31 AWS KMSに関するメトリクスがAmazon CloudWatchに追加される。
2016/12/01 EC2 Systems Manager(後のAWS Systems Manager)のParameter StoreがSecureStringでAWS KMSによる暗号化をサポート。
2017/02/15 KMSキーのタグ付けをサポート。
2017/04/28 Amazon Simple Queue Service(SQS)がAWS KMSによる暗号化をサポート。
2017/07/06 Amazon Kinesis Data StreamsがAWS KMSによる暗号化をサポート。
2017/08/14 Amazon Elastic File System(EFS)がAWS KMSによる暗号化をサポート。
2017/12/07 Amazon Elasticsearch Service(後のAmazon OpenSearch Service)がAWS KMSによる暗号化をサポート。
2017/12/08 Amazon CloudWatch LogsがAWS KMSによる暗号化をサポート。
2018/01/17 トレーニングとホスティングのAmazon SageMakerストレージボリュームがAWS KMSによる暗号化をサポート。
2018/01/22 AWS KMSにAWS PrivateLinkを使用した Amazon VPCインターフェイスエンドポイント経由でプライベートアクセスできるようになる。
2018/02/08 Amazon DynamoDBがAWSマネージドキーによる暗号化をサポート。
2018/04/05 AWS Secrets ManagerがAWS KMSによる暗号化をサポート。
2018/04/25 AWS X-RayがAWS KMSによる暗号化をサポート。
2018/08/01 AWS Storage GatewayがAWS KMSによる暗号化をサポート。
2018/08/09 Amazon DynamoDB Accelerator(DAX)がAWSマネージドキーによる暗号化をサポート。
2018/09/04 AWS Glue ETLジョブと開発エンドポイントがAWS KMSによる暗号化をサポート。
2018/11/07 Amazon SageMaker Batch TransformがAWS KMSによる暗号化をサポート。
2018/11/15 Amazon SNSがAWS KMSによる暗号化をサポート。
2018/11/15 Amazon DynamoDBがAWS所有のキーによるすべての既存テーブルの暗号化を実施。
2018/11/19 AWS Server Migration ServiceでオンプレミスサーバーボリュームAMIのAWS KMSによる暗号化をサポート。
2018/11/26 AWS KMSでAWS CloudHSMクラスターを使用したカスタムキーストアでKMSキーを生成、保存、使用できるようになる。
2019/03/28 Amazon ComprehendがAWS KMSによる暗号化をサポート。
2019/04/04 AWS Systems Manager Session ManagerがAWS KMSによる暗号化をサポート。
2019/07/22 Amazon MQがAWS KMSによる暗号化をサポート。
2019/08/29 Amazon ElastiCache for RedisがAWS KMSによる暗号化をサポート。
2019/09/24 Amazon TranscribeがAWS KMSによる暗号化をサポート。
2019/11/04 AWS KMS APIエンドポイントへの接続時に使用されるTransport Layer Security(TLS)ネットワーク暗号化プロトコルのハイブリッドポスト量子キー交換オプションとしてハイブリッドポスト量子TLS(hybrid post-quantum TLS)をサポート。
2019/11/15 AWS KMSコンソールでAWSマネージドキーのキーポリシーが表示できるようになる。
2019/11/25 AWS KMSでRSA 、楕円曲線(ECC)の非対称キーと非対称データキーペアをサポート。
2019/11/26 Amazon Kinesis Data FirehoseがAWS KMSによる暗号化をサポート。
2019/11/26 Amazon DynamoDBがカスタマーマネージドキーによる暗号化をサポート。
2020/02/24 Amazon FSx for LustreがAWS KMSによる暗号化をサポート。
2020/03/05 Amazon Elastic Kubernetes Service(EKS)がAWS KMSによるKubernetesシークレットのエンベロープ暗号化をサポート。
2020/07/07 Amazon EMRがAWS KMSによるログファイルの暗号化をサポート。
2020/07/14 AWS KMSでVPCエンドポイントポリシーをサポート。
2020/07/29 Amazon Elastic Container Registry(ECR)がAWS KMSによる暗号化をサポート。
2020/11/06 Amazon DynamoDB Global Tablesがカスタマーマネージドキーによる暗号化をサポート。
2020/11/17 Amazon SageMaker StudioがAWS KMSによる暗号化をサポート。
2020/11/19 Amazon TextractがAWS KMSによる暗号化をサポート。
2020/12/17 AWS KMSの非対称カスタマーマネージドキーによって署名するAmazon Route 53のDomain Name System Security Extensions(DNSSEC)がアナウンスされる。
2020/12/17 AWS KMSのキーポリシーで属性ベースのアクセス制御(ABAC)をサポート。
2021/01/27 Amazon Elasticsearch Service(後のAmazon OpenSearch Service)でAWS KMSによる暗号化を既存のドメインに適用できるようになる。
2021/03/01 Amazon Elastic Kubernetes Service(EKS)でAWS KMSによるKubernetesシークレットのエンベロープ暗号化を既存のクラスターに適用できるようになる。
2021/04/02 Amazon ComprehendがAWS KMSによる暗号化をサポート。
2021/05/05 Amazon CodeGuru Reviewerがカスタマーマネージドキーによる暗号化をサポート。
2021/06/01 Amazon Keyspacesがカスタマーマネージドキーによる暗号化をサポート。
2021/06/10 Amazon Managed Blockchainがカスタマーマネージドキーによる暗号化をサポート。
2021/06/16 KMSキーであるリージョンで作成したKMSキーを別のリージョンにレプリケートして暗号化オペレーションを実行できるマルチリージョンキーをサポート。
2021/06/25 Amazon Rekognition Custom LabelsでAWS KMSによる暗号化をサポート。
2021/07/23 Amazon QLDBがカスタマーマネージドキーによる暗号化をサポート。
2021/07/28 AWS Control TowerがデプロイするAWSサービスとAmazon S3データのAWS KMSによる暗号化をサポート。
2021/08/30 従来使用していた「カスタマーマスターキー(Customer Master Key, CMK)」という用語が「AWS KMSキー」および「KMSキー」の名称に置き換えられる。※機能は同じ。
2021/10/24 Amazon SageMaker Data WranglerがAWS KMSによる暗号化をサポート。
2021/11/05 Amazon TranslateがAWS KMSによる暗号化をサポート。
2022/01/31 Amazon SageMaker JumpStartがAWS KMSによる暗号化をサポート。
2022/03/16 AWS KMSで最新のハイブリッドポスト量子TLS(hybrid post-quantum TLS)をサポート。
2022/04/19 AWS KMSでハッシュベースのメッセージ認証コード (HMAC)の生成と検証ができるHMAC KMS キーをサポート。
2022/07/28 Amazon SageMaker Canvasがカスタマーマネージドキーによる暗号化をサポート。
2022/08/25 Amazon CloudFrontのOrigin Access Control(OAC)によりAmazon S3オリジンでSSE-KMSで暗号化されたデータを使用できるようになる。
2022/11/29 AWS KMSでAWS外部の外部キーストアを使用したカスタムキーストアでKMSキーを生成、保存、使用できるようになる。

AWS KMSはGAでアナウンスされた初期の段階で中核となる内部の仕組みや暗号化オペレーションに関するインタフェースが確立されていたため、AWS KMSそのもののアップデートは扱えるKMSキーの仕様の追加やアクセス権限に関するものなど少ない傾向です。その一方でAWS KMSを他のAWSサービスで使えるように統合するアップデートは現在に至るまで継続的に実施されています。
上記に記載したAWS KMSとAWSサービスの統合に関するアップデートは一部であり、新しいAWSサービスでは最初からAWS KMSによる暗号化に対応しているものが多いです。

現在のAWS KMSの機能一覧と概要

ここからは現在のAWS KMSの機能一覧と概要を紹介します。
AWS Key Management Service(AWS KMS)は連邦情報処理標準であるFIPS140-2検証済みのハードウェアセキュリティモジュール(HSM)を使用して暗号化オペレーション(暗号化操作)で使うキーを生成、保管、監査、一元管理するためのソリューションを提供し、AWSサービス全体における統合されたデータの暗号化および復号、独自のアプリケーションにおけるデータの暗号化やデジタル署名といった暗号化オペレーションができるフルマネージドサービスです。

本記事執筆時点で使用されているAWS KMSの用語はAWS KMSが登場した初期の頃とは異なる名称で呼ばれています。
具体的には「カスタマーマスターキー(Customer Master Key, CMK)」という名称を「KMSキー(AWS KMS keys)」に置き換えて呼ぶようになっています

そのため、本記事では従来使用していた名称を旧称と呼ぶことにして現在使用されている名称との対応についても記載します。

キーマテリアル(Key Material)

キーマテリアルは後述のKMSキーで参照し、実際にデータを暗号化・復号するために暗号化アルゴリズムで使用されるビット単位の文字列です。
キーマテリアルのオリジン(キーマテリアルの生成方法を識別するソース)は複数あり、対称暗号化KMSキーの場合はAWS KMSで生成したキーマテリアル(AWS_KMS)、独自にインポートしたキーマテリアル(EXTERNAL)、カスタムキーストアのAWS CloudHSMクラスターによるキーマテリアル生成(AWS_CLOUDHSM)があります。対称暗号化KMSキーにAWS KMSキーマテリアルを使用する場合にはキーマテリアルの自動ローテーションを設定できます。
また、各KMSキーにはデフォルトで一意のキーマテリアルがありますが、同じキーマテリアルでマルチリージョンキーを作成できます。

キーマテリアルのインポート

キーマテリアルのインポートはAWSの外部で独自にキーマテリアルを生成するというセキュリティに関する要件がある場合に活用できますが、キーマテリアルの可用性と耐久性に対する責任はユーザーがもつ必要があります。
後述する対称KMSキー(マルチリージョンキーを含む)である場合のみ独自のキーマテリアルをインポートして使用することができます。
独自にインポートしたキーマテリアルのオリジンはEXTERNALとなり、キーローテーションはユーザーが手動で実行する必要があります。

カスタムキーストア(Custom Key Stores)

カスタムキーストアはKMSキーのオリジンに関連づいたAWS CloudHSMクラスターでキーマテリアルを生成する方法です。
カスタムキーストアをオリジンに設定したKMSキーを使用するとAWS CloudHSMクラスター内のHSMでキーマテリアルの生成および暗号化オペレーションが実行されることになります
カスタムキーストアは共有環境にキーマテリアルを格納せず、AWS CloudHSMクラスター内で抽出不可能なキーマテリアルの生成および暗号化オペレーションの実行が必要というセキュリティに関する要件がある場合に活用できます。

KMSキー(AWS KMS keys)|旧称:カスタマーマスターキー(Customer Master Key, CMK)

KMSキーはAWS KMSで暗号化、復号をする暗号化キーの論理表現AWSAccountId、KeyId、Arn、CreationDate、Enabled、Description、KeyUsage、KeySpec、CustomerMasterKeySpec、KeyState、Origin、KeyManager、EncryptionAlgorithms、MultiRegionといったメタデータをもっています。
KMSキーは前述したキーマテリアル(デフォルトではAWS KMSが生成するキーマテリアル)を参照して暗号化、復号のオペレーションを実行します。

KMSキーが後述する対称KMSキーの場合はAWS KMSの外部でEncryptDecryptといったAPIオペレーションを使用しない汎用的なデータの暗号化、復号に使用するデータキーを生成できます(※1)。
(※1)AWS KMSではEncryptDecryptといったAPIオペレーションを使用するか、KMSキーから生成したデータキーを使用して実際のデータを暗号化・復号します。ただ、フルマネージドなAWSサービス内部で暗号化オペレーションが実行されているような場合には、実行文章上の表現として「カスタマーマネージドキー(ユーザーが作成したKMSキー)を使用して暗号化する」のようにデータキーによる暗号化・復号フローは省略される場合もあります。

KMSキーは管理形態によって「カスタマーマネージドキー(Customer Managed Keys, カスタマー管理型のキー)」、「AWSマネージドキー(AWS Managed Keys, AWSマネージド型キー)」、「AWS所有のキー(AWS Owned Keys)」の種類に分類できます。詳細については後述します。

KMSキーのメタデータには主に次のようなものがあります。

KeySpec(キーの仕様、キースペック)、KeyUsage(キーの用途、キーの使用)

AWS KMSで作成できるKMSキーには暗号化アルゴリズムで大別すると、暗号化と復号に同じ鍵を使用する共通鍵暗号方式を使用する対称キー、暗号化と復号に異なる2つの対となる鍵を使用する公開鍵暗号方式を使用する非対称キーがあります
対称キーと非対称キーはAWS KMSのAWSマネジメントコンソール上では「キータイプ」という概念で分類されています(※ただし、KMSキーのメタデータにキータイプというフィールドは存在しない)

この対称キーまたは非対称キーを示すキータイプとKMSキーのメタデータのうちKeySpec(キーの仕様)、KeyUsage(キーの用途)はそれぞれ関係しあってキータイプ、キースペック、キーの用途が決まっており、KeySpecによって次のようなKMSキーの種類に分類できます。

キータイプ KeySpecで分類したKMSキーの種類 KeySpec(キーの仕様) KeyUsage(キーの用途)
対称 対称KMSキー SYMMETRIC_DEFAULT ENCRYPT_DECRYPT(暗号化と復号)
対称 HMAC KMSキー HMAC_224、HMAC_256、HMAC_384、HMAC_512 GENERATE_VERIFY_MAC(HMACを生成して検証する)
非対称 非対称KMSキー(RSAキーペア) RSA_2048、RSA_3072、RSA_4096 ENCRYPT_DECRYPT(暗号化と復号)
SIGN_VERIFY(署名と検証)
非対称 非対称KMSキー(ECCキーペア) ECC_NIST_P256、ECC_NIST_P384、ECC_NIST_P521、ECC_SECG_P256K1 SIGN_VERIFY(署名と検証)
非対称 非対称KMSキー(SM2キーペア)
※中国リージョンのみ
SM2
※中国リージョンのみ
ENCRYPT_DECRYPT(暗号化と復号)
SIGN_VERIFY(署名と検証)

Origin(オリジン)

KMSキーが使用しているキーマテリアルのオリジンを示すフィールドです。フィールドの値は次のようになります。

AWS_KMS:AWS KMSで生成したキーマテリアル  
EXTERNAL:独自にインポートしたキーマテリアル  
AWS_CLOUDHSM:カスタムキーストアのAWS CloudHSMクラスターによるキーマテリアル生成  

AWSマネジメントコンソール上でもフィールドは「オリジン(Origin)」と表記されています。

Enabled(ステータス、Status)

対象のKMSキーが有効かどうかを示すフィールドです。フィールドの値は次のようになります。

True:対象のKMSキーが有効  
False:対象のKMSキーが無効  

AWSマネジメントコンソール上ではフィールドは「ステータス(Status)」、値は「有効(Enabled)」「無効(Disabled)」のように表現されています。

MultiRegion(リージョンごと、Regionality)

マルチリージョンキー(Multi-Region keys)かどうかを示すフィールドです。
マルチリージョンキーはあるリージョンで作成したカスタマーマネージドキーを他のリージョンにレプリケートしてレプリカキーによる暗号化オペレーションを可能にする機能です。
マルチリージョンキーはあくまであるリージョンで作成したKMSキーのリージョン間レプリカ機能であり、グローバルリソースではありません
また、マルチリージョンキーは作成時のみ指定でき、既存の単一リージョンキーをマルチリージョンキーには変更できません
マルチリージョンキーはカスタムキーストア以外の対称KMSキー、HMAC KMSキー、非対称KMSキーで作成できます

フィールドの値は次のようになります。

True:マルチリージョンキー(Multi-Region keys)である  
False:マルチリージョンキー(Multi-Region keys)でない(シングルリージョンキー(Single-Region keys)である)

AWSマネジメントコンソール上ではフィールドは「リージョンごと(Regionality)」、値は「マルチリージョン(Multi-Region)」「単一リージョン(Single-Region)」のように表現されています。

KeyManager(鍵管理者)

KMSキーが後述する「カスタマーマネージドキー(Customer Managed Keys, カスタマー管理型のキー)」か「AWSマネージドキー(AWS Managed Keys, AWSマネージド型キー)」を示すフィールドです。フィールドの値は次のようになります。

CUSTOMER:カスタマーマネージドキー(Customer Managed Keys, カスタマー管理型のキー)  
AWS:AWSマネージドキー(AWS Managed Keys, AWSマネージド型キー)

AWSマネジメントコンソール上ではカスタマーマネージドキー、AWSマネージドキーがそれぞれ別の画面に表示されて区別されています。

EncryptionAlgorithms(暗号化アルゴリズム)

KMSキーでKeyUsageにENCRYPT_DECRYPT(暗号化と復号)を指定した場合にKeySpecで使用される暗号化アルゴリズムが表示されます。
AWSマネジメントコンソール上ではフィールドは「暗号化アルゴリズム」、値はKeySpecで使用される暗号化アルゴリズムが表示されます。

SigningAlgorithms(署名アルゴリズム)

KMSキーでKeyUsageにGENERATE_VERIFY_MAC(HMACを生成して検証する)またはSIGN_VERIFY(署名と検証)を指定した場合にKeySpecで使用される署名アルゴリズムが表示されます。
AWSマネジメントコンソール上ではフィールドは「MACアルゴリズム」または「署名アルゴリズム」、値はKeySpecで使用される署名アルゴリズムが表示されます。

Description(説明)

KMSキーに関する説明を記載できるフィールドです。このフィールドはAWS KMSキーを作成した後でも編集可能です。
AWSマネジメントコンソール上でもフィールドは「説明(Description)」と表記されています。

CreationDate(作成日)

KMSキーを作成した日時が記録されるフィールドです。
AWSマネジメントコンソール上でもフィールドは「作成日(CreationDate)」と表記されています。

KeyId(キーID)

作成されたKMSキーを一意に識別する値のフィールドです。

ARN

作成されたKMSキーをAWSリソースとして一意に識別するARN(Amazon Resource Name)が表示されるフィールドです。
前述のKeyId(キーID)を使用して次のように表現されます。

#フォーマット
arn:aws:kms:<AWSリージョン識別子>:<AWSアカウントID>:key/<KeyId(キーID)>

#例
arn:aws:kms:ap-northeast-1:123456789012:key/a2345678-b234-c234-d234-e234567890fg

CustomerMasterKeySpec ※非推奨フィールド

CustomerMasterKeySpecは本記事執筆時点で非推奨フィールドとされ、代わりにKeySpecフィールドを使用することが推奨されています
本記事執筆時点ではKeySpecと同じ値が入っているようです。

KeyRotationEnabled(キーローテーション有効化) ※KeyIdで参照

KMSキーのKeyIdに関連づいて管理され、キーローテーションの有効、無効を示すフィールドです。
フィールドの値は次のようになります。

True:キーローテーションが有効  
False:キーローテーションが無効  

AliasName(エイリアス名) ※KeyIdで参照

KMSキーのKeyIdに関連づいて管理され、KMSキーの別名を入力するフィールドです。
カスタマーマネージドキーの場合、実際のAliasNameフィールドの値はAWSマネジメントコンソールでユーザーがエイリアスとして入力および表示される文字列にalias/というプレフィックが付くことになります。
また、AWSマネージドキーの場合、実際のAliasNameフィールドの値はAWSサービスごとに指定および表示される文字列にalias/というプレフィックが付くことになります。

#■カスタマーマネージドキーの場合  
#フォーマット  
alias/<ユーザーが入力した文字列>
#例
alias/MyKmsKey

#■AWSマネージドキーの場合  
#フォーマット  
alias/<AWSサービスごとに指定される文字列>
#例
alias/aws/s3
alias/aws/lambda

Policy(キーポリシー) ※KeyIdで参照

KMSキーのKeyIdに関連づいて管理され、KMSキーへのアクセスを制御するポリシーを指定するフィールドです。
キーポリシーではKMSキーを使用できるAWSアカウント、IAMユーザー・IAMロール、AWSリソース、条件などで指定し、KMSキーに対して実行可能なアクションを設定します
KMSのキーポリシーで使用するポリシー構文はIAMと同じJSONポリシードキュメント構造を使用します

次にKMSキーのキーポリシーの例を記載します。

{
    "Id": "key-consolepolicy-sample",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/admin"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/admin"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:DescribeKey",
                "kms:GetPublicKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/admin"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

カスタマーマネージドキー(Customer Managed Keys, カスタマー管理型のキー)|旧称:カスタマーマネージドCMK(カスタマー管理CMK)

カスタマーマネージドキーはユーザーがAWSアカウント内に作成、所有、管理できるKMSキーの管理形態の一つです。
カスタマーマネージドキーはAWS KMSでユーザーの必要に応じて作成できますが、一部のAWSサービスではAWS KMSを使用する際にカスタマーマネージドキーを使用するか、AWSマネージドキーを使用するか選択でき、カスタマーマネージドキーを選んだ場合にもカスタマーマネージドキーを作成することになります。
カスタマーマネージドキーのキーローテーションは実行しないか、1年ごとに実行するかを選択できます
※ローテーションスケジュールの期間は1年ごと(約365日)でこれを変更することはできません

KMSキーがもつメタデータのうちカスタマーマネージドキーで作成、編集、参照できるフィールドには次のものがあります。

  • カスタマーマネージドキーで作成時に指定できる主なメタデータ
KeyUsage(キーの用途、キーの使用)、KeySpec(キーの仕様、キースペック)、Origin(オリジン)、MultiRegion(リージョンごと、Regionality)、Description(説明)、KeyRotationEnabled(キーローテーション有効化)、AliasName(エイリアス名)、Policy(キーポリシー)
  • カスタマーマネージドキーで作成後に追加・編集できる主なメタデータ
Description(説明)、KeyRotationEnabled(キーローテーション有効化)、AliasName(エイリアス名)、Policy(キーポリシー)
  • カスタマーマネージドキーで参照できる主なメタデータ
KeyUsage(キーの用途、キーの使用)、KeySpec(キーの仕様、キースペック)、Origin(オリジン)、Enabled(ステータス、Status)、MultiRegion(リージョンごと、Regionality)、KeyManager(鍵管理者)、EncryptionAlgorithms(暗号化アルゴリズム)、SigningAlgorithms(署名アルゴリズム)、Description(説明)、CreationDate(作成日)、ARN、KeyId(キーID)、KeyRotationEnabled(キーローテーション有効化)、AliasName(エイリアス名)、Policy(キーポリシー)

AWSマネージドキー(AWS Managed Keys, AWSマネージド型キー)|旧称:AWSマネージドCMK(AWS管理CMK)

AWSマネージドキーはAWS KMSを使用するAWSサービスがユーザーに代わってAWSアカウント内に作成するKMSキーの管理形態の一つです。
AWSサービスが自動的にAWSマネージドキーを作成する場合もありますが、一部のAWSサービスではAWS KMSを使用する際にカスタマーマネージドキーを使用するか、AWSマネージドキーを使用するか選択でき、AWSマネージドキーを選んだ場合にもAWSマネージドキーは作成されます。
AWSマネージドキーのキーローテーションは1年ごとに実行されます
※2022年5月にAWSマネージドキーのキーローテーションスケジュールが3年ごと(約1,095日)から1年ごと(約365日)に変更されました

AWSマネージドキーではKMSキーがもつメタデータを指定や編集することはできませんが、主に次のものを参照することは可能です。

  • AWSマネージドキーで参照できる主なメタデータ(作成時の指定、作成後の編集は不可)
KeyUsage(キーの用途、キーの使用)、KeySpec(キーの仕様、キースペック)、Origin(オリジン)、Enabled(ステータス、Status)、MultiRegion(リージョンごと、Regionality)、Description(説明)、CreationDate(作成日)、ARN、KeyId(キーID)、Policy(キーポリシー)

AWS所有のキー(AWS Owned Keys)|旧称:AWS所有のCMK

AWS所有のキーはAWSが所有および管理し、複数のAWSアカウントにわたって使用するAWSアカウント内には作成されないKMSキーの管理形態です。
AWS所有のキーはAWSアカウント内には作成されないためAWS KMSコンソールには表示されません。一部のAWSサービスでは暗号化を指定する際にカスタマーマネージドキーを使用するか、AWS所有のキーを使用するか選択できる場合があります。
AWS所有のキーのキーローテーションはAWSサービスごとに異なります。

暗号化オペレーション

暗号化オペレーションはAWS CLI、AWS SDKなどのAPIによるAWS KMSの操作です。
主な暗号化オペレーションの概要とKeyUsageとの関係は次のようになります。

オペレーション KeyUsage
(キーの用途、キーの使用)
概要
Decrypt ENCRYPT_DECRYPT 対称キー、非対称キーを使用して復号する
Encrypt ENCRYPT_DECRYPT 対称キー、非対称キーを使用して暗号化する
ReEncrypt ENCRYPT_DECRYPT 対称キー、非対称キーを使用して再暗号化する
GenerateDataKey ENCRYPT_DECRYPT 対称キーでデータキーを作成する
GenerateDataKeyWithoutPlaintext ENCRYPT_DECRYPT 対称キーでデータキーを作成する
※プレーンテキストのデータキーをレスポンスに含まない。
GenerateDataKeyPair ENCRYPT_DECRYPT 対称キー暗号化で保護された非対称キーペアを生成する
GenerateDataKeyPairWithoutPlaintext ENCRYPT_DECRYPT 対称キー暗号化で保護された非対称キーペアを生成する
※プレーンテキストの秘密鍵をレスポンスに含まない。
GenerateMac GENERATE_VERIFY_MAC HMACキーを作成する
VerifyMac GENERATE_VERIFY_MAC HMACキーを検証する
Sign SIGN_VERIFY 非対称キーを使用して署名する
Verify SIGN_VERIFY 非対称キーを使用して署名を検証する
GenerateRandom N/A 暗号的に安全なランダムなバイト文字列を返却する

データキー

データキーはAWS KMSの外部でEncryptDecryptのAPIオペレーションを使用しない汎用的なデータの暗号化、復号に使用するために対称KMSキーから生成する暗号化キーです。
ただし、後述するエンベロープ暗号化によってデータキーそのものはKMSキーを使用したAPIオペレーションで暗号化・復号して保護する使い方をします

データキーはAWS CLIやAWS SDKなどのAPIでGenerateDataKeyまたはGenerateDataKeyWithoutPlaintextオペレーションを呼び出すことで指定した対称KMSキーから生成でき、作成時には次のパラメータが返却されます。

KeyId:データキーの生成に使用した対称KMSキーのKeyId  
Plaintext:データの暗号化に使用するプレーンテキストのデータキー ※GenerateDataKeyWithoutPlaintextでは返却されない。  
CiphertextBlob:暗号化対象のデータと一緒に保管する目的に使用できる暗号化されたデータキー  

GenerateDataKeyオペレーションを用いたデータキーの使用例を挙げると次のようになります。

・データキーを使用した暗号化フロー例

  1. AWS CLIやAWS SDKなどのAPIで対称KMSキーのKeyIdを指定し、GenerateDataKeyオペレーションでデータキーを生成する。
  2. GenerateDataKeyで返却されたレスポンスのPlaintextに指定されたデータキーを使用してEncryptAPIオペレーションを使用せずに暗号化対象のデータを暗号化する。
  3. Plaintextに指定されたデータキーはどこにも保存せずメモリ上から破棄する。
  4. 暗号化したデータをGenerateDataKeyで返却されたレスポンスのCiphertextBlobと共に保存する。

・データキーを使用した復号フロー例

  1. 暗号化データと共に保存していたCiphertextBlobをAWS CLIやAWS SDKなどのAPIで対称KMSキーのKeyIdを指定し、Decryptオペレーションで復号してデータキーを取得する。
  2. 復号したデータキーを使用しDecryptAPIオペレーションを使用せずに暗号化データを復号する。

※AWS KMSではEncryptDecryptといったAPIオペレーションを使用するか、KMSキーから生成したデータキーを使用して実際のデータを暗号化・復号します。ただ、フルマネージドなAWSサービス内部で暗号化オペレーションが実行されているような場合には、実行文章上の表現として「カスタマーマネージドキー(ユーザーが作成したKMSキー)を使用して暗号化する」のようにデータキーによる暗号化・復号フローは省略される場合もあります。

データキーペア

データキーペアはAWS KMSの外部でEncryptDecryptのAPIオペレーションを使用しない汎用的なデータの暗号化、復号に使用するために非対称KMSキーから生成する暗号化キーペアです。

データキーペアはAWS CLIやAWS SDKなどのAPIでGenerateDataKeyPairまたはGenerateDataKeyPairWithoutPlaintextオペレーションを呼び出すことで指定した非対称KMSキーから生成でき、作成時には次のパラメータが返却されます。

KeyId:データキーペアの生成に使用した非対称KMSキーのKeyId  
KeyPairSpec:データキーペアの生成に使用した非対称KMSキーのKeySpec(キーの仕様)  
PrivateKeyCiphertextBlob:保管目的に使用できる暗号化された秘密鍵  
PrivateKeyPlaintext:データの復号に使用するプレーンテキストの秘密鍵 ※GenerateDataKeyPairWithoutPlaintextでは返却されない。  
PublicKey:データの暗号化に使用するプレーンテキストの公開鍵  

GenerateDataKeyPairまたはGenerateDataKeyPairWithoutPlaintextオペレーションを用いたデータキーペアの使用例を挙げると次のようになります。

・秘密鍵と公開鍵の事前準備

  1. AWS CLIやAWS SDKなどのAPIで非対称KMSキーのKeyIdKeySpecを指定し、GenerateDataKeyPairまたはGenerateDataKeyPairWithoutPlaintextオペレーションでデータキーペアを生成する。
  2. GenerateDataKeyPairまたはGenerateDataKeyPairWithoutPlaintextで返却されたレスポンスのPublicKey(公開鍵)をデータを暗号化するエンティティ(機能、ノード、ユーザー等)に渡す。
  3. GenerateDataKeyPairまたはGenerateDataKeyPairWithoutPlaintextで返却されたレスポンスのPrivateKeyCiphertextBlob(秘密鍵)を暗号化データを復号するエンティティ(機能、ノード、ユーザー等)で保管する。

・データキーペアを使用した暗号化フロー例

  1. データを暗号化するエンティティ(機能、ノード、ユーザー等)でPublicKeyに指定された公開鍵を使用し、Encryptオペレーションを使用せずに暗号化対象のデータを暗号化する。
  2. 暗号化データを復号するエンティティ(機能、ノード、ユーザー等)に渡す。

・データキーペアを使用した復号フロー例

  1. 暗号化データを復号するエンティティ(機能、ノード、ユーザー等)で受け取る。
  2. 暗号化データを復号するエンティティ(機能、ノード、ユーザー等)でPrivateKeyCiphertextBlob(秘密鍵)をAWS CLIやAWS SDKなどのAPIで非対称KMSキーのKeyIdを指定し、Decryptオペレーションで復号して秘密鍵を取得する。
  3. 復号した秘密鍵を使用しDecryptAPIオペレーションを使用せずに暗号化データを復号する。

エンベロープ暗号化

エンベロープ暗号化はデータキーでプレーンテキストのデータを暗号化してから、暗号化に使用したデータキーを別のキーで暗号化する手法です。
具体的には前述の「データキー」の項で説明した「データキーを使用した暗号化フロー例」のようにPlaintextのデータキーは暗号化で使用した後にメモリ上から破棄し、KMSキーで暗号化されたデータキーであるCiphertextBlobを暗号化対象のデータと一緒に保管するといった使い方をします。

エンベロープ暗号化の利点には次のことが挙げられます。

  • データキー自体を暗号化で保護し、鍵管理を簡易化できる
  • 高速で暗号化データが小さいが鍵交換のアクセス制御が難しい対称キーと低速で暗号化データが大きいが鍵交換のアクセス制御が容易な非対称キーを組み合わせることで相互の利点を活かした鍵の運用ができる

ハイブリッドポスト量子TLS(hybrid post-quantum TLS)

現在、AWS KMS APIエンドポイントに接続する場合に使う暗号化通信プロトコルであるTransport Layer Security(TLS)ではFinite Field Diffie-Hellman Ephemeral(FFDHE)、Elliptic Curve Diffie-Hellman Ephemeral(ECDHE)といった古典的な鍵交換アルゴリズムが使用されています。

このような従来のアルゴリズムによるTLSの暗号化は将来的に大規模な量子コンピューターによって解読される潜在的なリスクがあるため、そのリスクを回避するための対策としてハイブリッドポスト量子TLS(hybrid post-quantum TLS)があります

ハイブリッドポスト量子TLS(hybrid post-quantum TLS)はKyber、BIKE、SIKEといったNISTが標準化を開始したポスト量子暗号キーカプセル化メカニズム(KEM)と古典的なECDHEを組み合わせたTLSのハイブリッド暗号スイートです。

AWS KMSではオープンソースで開発されているs2n-tlsを用いてECDHE with Kyberのような組み合わせでハイブリッドポスト量子TLS(hybrid post-quantum TLS)を使用できます。

AWS KMS内部におけるKMSキー管理とデータキー生成

AWS KMS内部におけるKMSキー管理とデータキー生成は主に次の要素によって構成されています。

  • Domain Key
    リージョン内にあるKMSキーのバージョン管理や暗号化のためにHSMのメモリ上に保持するキー。
    日次でローテーションする。

  • HSM Backing Key(HBK)
    HSMで生成したキーマテリアルまたはインポートしたキーマテリアルで作成され、HSMのメモリ上に保持されるKMSキーの実体となるキー。(HSMメモリ上に展開したKMSキー)
    HSM Backing Key(HBK)は永続的な保持のためにDomain Keyで暗号化され、AWS KMS内の高耐久ストレージに後述のExported Key Token(EKT)として保存される。
    年次でローテーションする。

  • Exported Key Token(EKT)
    HSMメモリ上に展開したKMSキー AWS KMS内の高耐久ストレージに保存されるDomain Keyで暗号化されたHSM Backing Key(HBK)。(高耐久ストレージに暗号化保存したKMSキー)
    KMSキーを使用する際に復号してHSM上のメモリにHSM Backing Key(HBK)を配置する。
    キーマテリアルの有効期限が切れるとExported Key Token(EKT)は削除される。

  • Customer Data Key(CDK)
    HSM Backing Key(HBK)から生成され、HSMからエクスポートされたAWS KMS外部で使用できる対称キーまたは非対称キー
    上記で「データキー」と呼んでいるもののプレーンテキスト(Plaintext)に相当する。

  • Derived Encryption Key
    データやCustomer Data Keyを暗号化するために使用するHSMのメモリ上にあるキー
    暗号化ごとにHSM Backing Key(HBK)から派生する。
    暗号化ごとに1回使用され、復号時に再生成される。

  • Ciphertext(CT)
    Customer Data Key(CDK)をDerived Encryption Keyで暗号化した暗号文
    上記で「データキー」と呼んでいるものの暗号化したデータキー(CiphertextBlob)に相当する。

AWS KMSのKMSキー管理とデータキー使用の概要図

AWS KMSにおけるKMSキーの管理と対称KMSキーにおけるデータキーの使用に関する概要図を次にまとめます。
AWS KMS内は主に内部におけるKMSキーの管理とデータキー生成の概念を、Client内では対称KMSキーにおけるデータキーを用いた暗号化および復号のフローの概念を図にしています。

AWS KMSのKMSキー管理とデータキー使用の概要図
AWS KMSのKMSキー管理とデータキー使用の概要図

<参考資料>
AWS Documentation(AWS Key Management Service)
AWS Documentation(AWS KMS Cryptographic Details)
Round 2 post-quantum TLS is now supported in AWS KMS
Tech Blog with related articles referenced

まとめ

今回はAWS KMSの歴史年表を作成して、AWS KMSの機能一覧と概要を見てきました。

AWS KMSは現在または将来的にAWSサービス全般で統合されたKMSキーによるデータの暗号化・復号を可能にし、一方でAWS KMSの外部でもデータキーの生成とエンベロープ暗号化によって安全性の高い暗号化・復号のオペレーションを提供しています。
特に近年ではHMAC KMSキーによるHMACの生成と検証、非対称KMSキー(RSA)による暗号化・復号・署名と検証、非対称KMSキー(ECC)による署名と検証など扱えるKMSキーのKeySpec(キーの仕様)やKeyUsage(キーの用途)も増えて来ており、用途も広がってきています。
また、マルチリージョンキーやキーポリシーによるアクセス制御のなどのアップデートもあり、セキュリティを担保しながら、より柔軟な使い方ができるようになってきています。

今後も継続的にAWS KMSがどのような機能を提供していくのかその動向をウォッチしていきたいと思います。

なお、今回の記事の英語版やAWS KMS以外のサービスも含めたAWSサービス全体の歴史年表もありますので、興味がありましたら御覧ください。

Written by Hidekazu Konishi
Hidekazu Konishi (小西秀和), a Japan AWS Top Engineer and a Japan AWS All Certifications Engineer

執筆者小西秀和

Japan AWS Top Engineer, Japan AWS All Certifications Engineer(AWS認定全冠)として、知識と実践的な経験を活かし、AWSの活用に取り組んでいます。
NRIネットコムBlog: 小西 秀和: 記事一覧
Amazon.co.jp: 小西 秀和: books, biography, latest update
Personal Tech Blog