AWS Key Management Service
開発者ガイド

AWS Key Management Service の概念

AWS Key Management Service (AWS KMS) の基本的な用語および概念についてと、それらがデータの保護にどのように役立つかについて説明します。

カスタマーマスターキー (CMK)

カスタマーマスターキーは、AWS KMS のプライマリリソースです。

カスタマーマスターキー (CMK) は、マスターキーの論理的な表現です。CMK には、キー ID、作成日、説明、キーステータスなどのメタデータが含まれます。CMK には、データの暗号化と復号に使用されるキーマテリアルも含まれています。

CMK を使用してデータを最大 4 KB (4096 バイト) まで暗号化したり復号することができます。データを暗号化するために AWS KMS の外で使用するデータキーの生成、暗号化、復号には、通常 CMK を使用します。この戦略は、エンベロープ暗号化と呼ばれています。

CMK は AWS KMS で作成され、AWS KMS が暗号化されないままになることはありません。CMK を管理するには、AWS マネジメントコンソール または AWS KMS API を使用できます。暗号化オペレーションで CMK を使用するには、 AWS KMS API を使用する必要があります。この戦略はデータキーとは異なります。AWS KMS ではデータキーは保存、管理、追跡されません。AWS KMS の外部で使用する必要があります。

デフォルトでは、AWS KMS は CMK のキーマテリアルを作成します。このキーマテリアルを抽出、エクスポート、表示、管理することはできません。また、このキーマテリアルは削除できません。 CMK を削除する必要があります。ただし、独自のキーマテリアルを CMK にインポートしたりAWS KMS カスタムキーストアに関連付けられた AWS CloudHSM クラスターで CMK のキーマテリアルを作成したりできます。

CMK の作成および管理については、「ご利用開始にあたって」を参照してください。CMK の使用については、「AWS Key Management Service API Reference」を参照してください。

AWS アカウントの CMK には 3 つのタイプがあります。カスタマー管理 CMK、AWS 管理 CMK、AWS 所有 CMK です。

CMK のタイプ CMK メタデータを表示できる CMK を管理できる 自分の AWS アカウントでのみ使用
カスタマー管理 CMK はい はい はい
AWS 管理 CMK はい いいえ はい
AWS 所有 CMK いいえ いいえ いいえ

カスタマー管理の CMK と AWS 管理の CMK を区別するには、DescribeKey API オペレーションのレスポンスで受け取る KeyManager フィールドを使用します。カスタマー管理の CMK の場合、KeyManager 値は Customer です。AWS 管理の CMK の場合、KeyManager 値は AWS です。

AWS KMS と統合された AWS サービスでは、CMK のサポートが異なります。一部の AWS サービスでは、デフォルトで AWS 所有の CMK または AWS が管理する CMK を使用してデータが暗号化されます。他の AWS サービスでは、選択したカスタマー管理の CMK でデータを暗号化できます。また、他のAWS は、AWS 所有 CMK の容易性、AWS 管理 CMK の可視性、カスタマー管理 CMK の管理を行えるよう CMK のすべてのタイプをサポートしています。

カスタマー管理の CMK

カスタマー管理 CMK は、お客様が作成、所有、管理している AWS アカウントの CMK です。お客様はこれらの CMK のすべてを管理できます。キーポリシーの確立と管理、IAM ポリシー、付与有効化と無効化暗号化マテリアルのローテーションタグの追加、CMK を参照するエイリアスの作成CMK の削除のスケジューリングを行うことができます。

カスタマー管理の CMK は、AWS KMS の AWS マネジメントコンソール の [Customer managed keys (カスタマー管理のキー)] ページに表示されます。カスタマー管理の CMK を明確に識別するには、DescribeKey API オペレーションを使用します。カスタマー管理の CMK の場合、DescribeKey レスポンスで受け取る KeyManager フィールドの値は CUSTOMER です。

暗号化オペレーションでカスタマー管理 CMK を使用し、AWS CloudTrail ログでその使用を監査できます。さらに、多くの AWS KMS と統合されている AWS サービスを使用すると、カスタマー管理 CMK を指定して、保管および管理しているデータを保護できます。

カスタマー管理 CMK の使用には、月額料金と、無料利用枠を超えた使用量に対する料金がかかります。これらは、お客様のアカウントの AWS KMS 制限に対して影響があります。詳細については、「AWS Key Management Service 料金表」および 制限 を参照してください。

AWS 管理の CMK

AWS 管理の CMK は、お客様のアカウントにある CMK であり、AWS KMS と統合されている AWS サービスがお客様に代わって作成、管理、使用します。

アカウントで AWS が管理する CMK を表示して、キーポリシーを表示し、AWS CloudTrail ログでその使用を監査できます。ただし、これらの CMK を管理したりアクセス権限を変更したりすることはできません。また、AWS が管理する CMK を暗号化オペレーションで直接使用することはできません。サービスはユーザーに代わってそれらを作成し、使用します。AWS が管理する CMK のキーポリシーを表示するには、GetKeyPolicy オペレーションを使用します。キーポリシーを AWS マネジメントコンソール に表示したり変更することはできません。

AWS 管理の CMK は、AWS KMS の AWS マネジメントコンソール の [AWS managed keys (AWS 管理のキー)] ページに表示されます。ほとんどの AWS 管理の CMK はエイリアスでも識別できます。その形式は aws/service-name で、aws/redshift のようになります。AWS 管理の CMK を明確に識別するには、DescribeKey API オペレーションを使用します。AWS 管理の CMK の場合、DescribeKey レスポンスで受け取る KeyManager フィールドの値は AWS です。

AWS が管理する CMK の月額料金はかかりません。これらは、無料利用枠を超える量を使用した場合は有料になりますが、一部の AWS サービスでこれらのコストがカバーされます。詳細については、サービスドキュメントの暗号化のセクションを参照してください。AWS 管理の CMK は、アカウントの各リージョンの CMK 数の制限にカウントされません。ただし、これらの CMK を使用するのがお客様のアカウントのプリンシパルでない場合、それらの CMK はリクエストレートの制限にカウントされます。詳細については、「AWS Key Management Service 料金表」および 制限 を参照してください。

AWS 所有の CMK

AWS 所有の CMK はお客様の AWS アカウントにはありません。これらは、複数の AWS アカウントで使用できるようにするために AWS が所有し管理している CMK のコレクションの一部です。AWS サービスでは、データの保護に AWS 所有の CMK を使用できます。

AWS 所有 CMK は表示、管理、使用することはできず、その使用を監視することもできません。ただし、データを暗号化するキーを保護するための作業やプログラムを操作したり変更したりする必要はありません。

AWS 所有 CMK のご利用に関しては、月額料金や使用料金は請求されません。また、CMK は、アカウントの AWS KMS 制限には影響しません。

データキー

データキーは、大量のデータや他のデータ暗号化キーといったデータを暗号化するための暗号化キーです。

AWS KMS カスタマーマスターキー (CMK) を使用して、データキーの生成、暗号化、復号化を実行できます。ただし、AWS KMS はデータキーの保存、管理、追跡、またはデータキーの暗号化オペレーションを実行しません。AWS KMS の外部でデータキーを使用して管理する必要があります。

データキーを作成する

データキーを生成するには、GenerateDataKey オペレーションを呼び出します。AWS KMS が指定した CMK を使用してデータキーを生成します。このオペレーションから、データキーのプレーンテキストコピーと CMK で暗号化されたコピーが返されます。以下の図では、このオペレーションを示しています。


          データキーを生成する

AWS KMS は暗号化されたデータキーのみを返す GenerateDataKeyWithoutPlaintext オペレーションもサポートしています。データキーを使用する必要がある場合、AWS KMS にそのデータキーを復号化するように求めます。

データキーでデータを暗号化する

AWS KMS は、データキーを使用してデータを暗号化することはできません。ただし、OpenSSL を利用するか、AWS 暗号化 SDK のような暗号化ライブラリを利用することで、KMS の外部でデータキーを使用できます。

プレーンテキストのデータキーを使用してデータを暗号化したら、できる限り早急にメモリからそれを削除します。暗号化したデータと一緒に暗号化データキーを安全に保存して、データの復号化に利用することができます。


          AWS KMS の外部でユーザーデータを暗号化する

データキーでデータを復号する

データを復号するには、Decrypt オペレーションに暗号化されたデータキーを渡します。AWS KMS は CMK を使ってデータキーを復号し、プレーンテキストのデータキーを返します。プレーンテキストのデータキーを使ってデータを復号し、続いてできる限り早急にメモリからプレーンテキストのデータキーを削除します。

以下の図では、Decrypt オペレーションを使用して暗号化されたデータキーを復号する方法を示しています。


          データキーの復号化

エンベロープ暗号化

データを暗号化するとデータは保護されますが、暗号化キーを保護する必要があります。1 つの戦略としては、それを暗号化します。エンベロープ暗号化は、データキーでプレーンテキストデータを暗号化してから、そのデータキーを別のキーで暗号化する手法です。

データ暗号化キーを別の暗号化キーで暗号化し、その暗号化キーを別の暗号化キーで暗号化することもできます。しかし、最終的には、キーとデータを復号化するために、1 つのキーをプレーンテキストで保持する必要があります。この最上位プレーンテキストキー暗号化キーは、マスターキーと呼ばれます。


        エンベロープ暗号化

AWS KMS は、マスターキーを安全に保管して管理することで、マスターキーを保護するために役立ちます。AWS KMS に保管されたマスターキーはカスタマーマスターキー (CMK) と呼ばれ、AWS KMS FIPS で検証されたハードウェアセキュリティモジュールを非暗号化されたまま移動することはありません。AWS KMS CMK を使用するには、AWS KMS を呼び出す必要があります。


        複数キー暗号化キーによるエンベロープ暗号化

エンベロープ暗号化には、いくつかの利点があります。

  • データキーの保護

    データキーを暗号化する場合、暗号化されたデータキーの保存について心配する必要がありません。これは、そのデータキーが暗号化によって本質的に保護されているためです。暗号化されたデータとともに、暗号化されたデータキーを安全に保存できます。

  • 複数のマスターキーでの同じデータの暗号化

    暗号化オペレーションには時間がかかります (特に、暗号化するデータが大きいオブジェクトである場合)。異なるキーで raw データを複数回にわたって再暗号化する代わりに、raw データを保護するデータキーのみを再暗号化できます。

  • 複数のアルゴリズムの強度の結合

    一般に、対称キーアルゴリズムは、パブリックキーアルゴリズムよりも高速で、より小さい暗号化テキストを生成します。しかし、パブリックキーのアルゴリズムはロールを本質的に分離し、キー管理を簡単にします。エンベロープ暗号化により、それぞれの戦略を組み合わせることができます。

暗号化コンテキスト

AWS KMS 暗号化オペレーション (EncryptDecryptReEncryptGenerateDataKeyGenerateDataKeyWithoutPlaintext) は、すべて、オプションで暗号化コンテキストを受け入れます。暗号化コンテキストとは、データのコンテキストに関する情報を含んだキー/値ペアのセットです。AWS KMS は、暗号化テキストを追加の認証データ (AAD) として使用し、認証された暗号化をサポートします。

暗号化リクエストに暗号化コンテキストが含まれている場合、暗号化テキストに暗号化されてバインドされます。このため、データを復号する (または復号して再暗号化する) には、同じ暗号化コンテキストが必要です。復号リクエストで指定された暗号化コンテキストが大文字と小文字を区別して完全に一致しない場合、復号リクエストは失敗します。暗号化コンテキストでのキーと値のペアの順序のみを変更できます。

この暗号化コンテキストはシークレットではありません。これは AWS CloudTrail ログにプレーンテキストで表示されるため、それを使用して暗号化オペレーションを識別して分類できます。

暗号化コンテキストは任意のキーと値で構成できます。ただし、暗号化コンテキストはシークレットではなく暗号化されないため、機密情報を含めないでください。暗号化または復号化されるデータの内容を説明した暗号化テキストの使用をお勧めします。たとえば、ファイルを暗号化するときは、ファイルパスの一部を暗号化コンテキストとして使用することもあります。

暗号化コンテキストペアのキーと値はシンプルなリテラル文字列であることが必要です。整数やオブジェクトなど完全に解決されない型のキーと値は使用できません。整数や浮動小数点数など別の型を使用する場合、AWS KMS では文字列として解釈されます。

"encryptionContext": { "department": "10103.0" }

暗号化コンテキストのキーと値には、アンダースコア (_)、ダッシュ (-)、スラッシュ (/、\)、コロン (:) などの特殊文字を含めることができます。

たとえば、Amazon Simple Storage Service (Amazon S3) では、キーが aws:s3:arn である暗号化コンテキストを使用します。値は、暗号化されるファイルへの S3 バケットパスです。

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::bucket_name/file_name" }

また、暗号化コンテキストを使用して、アカウントのカスタマーマスターキー (CMK) を絞り込んだり、アクセスを制限したりできます。暗号化コンテキストは許可の制約として、およびポリシーステートメントの条件として使用できます。

暗号化コンテキストを使用して暗号化されたデータの整合性を保護する方法については、AWS セキュリティブログの How to Protect the Integrity of Your Encrypted Data by Using AWS Key Management Service and EncryptionContext を参照してください。

暗号化コンテキストの詳細。

ポリシーでの暗号化コンテキスト

暗号化コンテキストは主に整合性と信頼性を検証するために使用されます。ただし、キーポリシーおよび IAM ポリシーで、カスタマーマスターキー (CMK) の使用を承認する条件として、暗号化コンテキストを使用することもできます。

kms:EncryptionContext: および kms:EncryptionContextKeys 条件キーは、リクエストに特定の暗号化コンテキストキーまたはキー/値ペアが含まれる場合にのみ、アクセス許可を付与 (または拒否) します。

たとえば、以下のキーポリシーステートメントでは、RoleForExampleApp ロールに Decrypt オペレーションでの CMK の使用を許可します。また、kms:EncryptionContext: 条件キーを使用して、リクエストの暗号化コンテキストに AppName:ExampleApp 暗号化コンテキストペアが含まれる場合にのみ、このアクセス許可を付与します。

{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "kms:EncryptionContext:AppName": "ExampleApp" } } }

これらの暗号化コンテキストの条件キーの詳細については、「AWS KMS でのポリシー条件の使用」を参照してください。

許可での暗号化コンテキスト

許可の作成では、リクエストが特定の暗号化コンテキストまたは暗号化コンテキストキーを含むときにのみアクセスを許可する許可の制約を含めることができます。EncryptionContextEquals および EncryptionContextSubset 許可の制約の詳細については、「制約の付与」を参照してください。

許可で暗号化コンテキストの制約を指定するには、CreateGrant API オペレーションで Constraints パラメータを使用します。この例では AWS Command Line Interface を使用していますが、任意の AWS SDK を使用できます。このコマンドが作成する許可では、exampleUserDecrypt API オペレーションを呼び出すためのアクセス許可を付与します。ただし、そのアクセス許可は、"Department": "IT" 暗号化コンテキストペアが Decrypt リクエストの暗号化コンテキストに含まれる場合にのみ有効です。

$ aws kms create-grant \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:user/exampleUser \ --operations Decrypt \ --retiring-principal arn:aws:iam::111122223333:role/adminRole \ --constraints EncryptionContextSubset={Department=IT}

したがって、許可は以下のようになります。exampleUser に付与されるアクセス許可は、許可の制約で指定された暗号化コンテキストペアが Decrypt リクエストに含まれる場合にのみ有効です。CMK の許可を見つけるには、ListGrants API オペレーションを使用します。

$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "Grants": [ { "Name": "", "IssuingAccount": "arn:aws:iam::111122223333:root", "GrantId": "8c94d1f12f5e69f440bae30eaec9570bb1fb7358824f9ddfa1aa5a0dab1a59b2", "Operations": [ "Decrypt" ], "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser", "Constraints": { "EncryptionContextSubset": { "Department": "IT" } }, "CreationDate": 1568565290.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole" } ] }

AWS サービスは、多くの場合、AWS アカウントで CMK を使用するためのアクセス許可を付与する許可で、暗号化コンテキストの制約を使用します。たとえば、Amazon DynamoDB は以下のような許可を使用して、お客様のアカウントの DynamoDB に対して AWS 管理の CMK を使用するためのアクセス許可を取得します。この許可での EncryptionContextSubset 許可の制約では、リクエストの暗号化コンテキストに "subscriberID": "111122223333""tableName": "Services" のペアが含まれる場合にのみ、この許可でのアクセス許可を有効にします。この許可の制約では、AWS アカウントの特定のテーブルに対してのみ、指定された CMK を使用することを、DynamoDB に許可します。

この出力を取得するには、お客様のアカウントの DynamoDB に使用する AWS 管理の CMK に対して ListGrants API オペレーションを実行します。

$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321 { "Grants": [ { "Operations": [ "Decrypt", "Encrypt", "GenerateDataKey", "ReEncryptFrom", "ReEncryptTo", "RetireGrant", "DescribeKey" ], "IssuingAccount": "arn:aws:iam::111122223333:root", "Constraints": { "EncryptionContextSubset": { "aws:dynamodb:tableName": "Services", "aws:dynamodb:subscriberId": "111122223333" } }, "CreationDate": 1518567315.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com", "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com", "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a", "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59" } ] }
暗号化コンテキストのログ記録

AWS KMS は AWS CloudTrail を使用して暗号化コンテキストを記録するため、アクセスされた CMK やデータを判断することができます。ログエントリには、ログエントリ内の暗号化コンテキストによって参照されている特定のデータの暗号化または復号にどの CMK が使用されたかが正確に示されます。

重要

暗号化コンテキストは記録されるため、機密情報が含まれていてはなりません。

暗号化コンテキストの保存

Decrypt (または ReEncrypt) API を呼び出すときに暗号化コンテキストの使用を簡略化するには、暗号化データと共に暗号化コンテキストを保存できます。暗号化や復号で必要になったときに完全な暗号化コンテキストを作成できる十分な暗号化コンテキストのみを保存することをお勧めします。

たとえば、暗号化コンテキストがファイルへの完全修飾パスである場合、そのパスの一部のみを、暗号化されたファイルの内容とともに保存します。次に、完全な暗号化コンテキストが必要になったら、保存されたフラグメントからコンテキストを再構築します。誰かがファイルを改ざんした場合 (名前の変更、別の場所への移動など)、暗号化コンテキスト値が変更され、復号リクエストは失敗します。

キーポリシー

CMK を作成するとき、その CMK を使用して管理できるユーザーを決定します。これらのアクセス権限は、キーポリシーと呼ばれるドキュメントに含まれます。キーポリシーを使用して、カスタマー管理の CMK に対するアクセス許可をいつでも追加、削除、または変更できます。ただし、AWS 管理の CMK のキーポリシーは編集できません。詳細については、「AWS KMS に対する認証とアクセスコントロール」を参照してください。

許可

許可は、アクセス許可を付与するための別のメカニズムです。キーポリシーに代わるものです。許可は限定的であり、作成と取り消しが容易であるため、一時的なアクセス許可やよりきめ細かなアクセス許可を付与するためによく使用されます。詳細については、「許可の使用」を参照してください。

許可トークン

許可を作成する場合、許可で指定されたアクセス権限は、結果整合性により、即時に反映されない場合があります。潜在的な遅延を軽減する必要がある場合は、CreateGrant API リクエストへのレスポンスで受け取る許可トークンを使用します。いくつかの AWS KMS API リクエストとともに許可トークンを渡し、許可のアクセス権限を即時有効にすることができます。次の AWS KMS API オペレーションでは許可トークンを使用できます。

許可トークンはシークレットではありません。許可トークンには、その対象としているユーザーに関する情報が含まれるため、これを使用してより迅速に許可のアクセス権限を有効にできるユーザーに関する情報が含まれます。

CMK の使用の監査

キーの利用を監査するには AWS CloudTrail を使用します。CloudTrail は、AWS API 呼び出しとアカウントの関連イベントの履歴を含むログファイルを作成します。これらのログファイルには、AWS マネジメントコンソール、AWS SDK、コマンドラインツールで行ったすべての AWS KMS API リクエストが含まれます。また、AWS サービスによってお客様に代わって行われた AWS KMS へのリクエストも含まれます。これらのログファイルを使用して、CMK が使用された時間、リクエストされたオペレーション、リクエスタの ID、ソースの IP アドレスなどの重要な情報を見つけることができます。詳細については、「AWS CloudTrail を使用した AWS KMS API コールのログ記録」と『AWS CloudTrail User Guide』を参照してください。

キー管理のインフラストラクチャ

暗号化の一般的な手法では、AES (Advanced Encryption Standard) など一般に利用でき専門家によって検証されたアルゴリズムとシークレットキーを使用して暗号化し、復号する必要があります。暗号化での主な問題の 1 つは、キーを秘密にしておくのが非常に困難なことです。これは通常、キー管理インフラストラクチャ (KMI) のジョブです。AWS KMS はお客様に代わって KMI を運用します。AWS KMS は CMK と呼ばれるマスターキーを作成し、安全に保存します。AWS KMS の動作の詳細については、「AWS Key Management Service 暗号化の詳細」ホワイトペーパーを参照してください。