AWS Key Management Service
開発者ガイド

AWS Secrets Manager で AWS KMS を使用する方法

AWS Secrets Manager は、シークレットを暗号化して保存し、それらを透過的に復号してプレーンテキストで返す、AWS のサービスです。これは定期的に変更され、ハードコードしたり、アプリケーションにプレーンテキストで保存したりするべきではないアプリケーションシークレット (ログイン認証情報など) を保存するために専用に設計されています。アプリケーションは、ハードコードされた認証情報またはテーブルを参照する代わりに、Secrets Manager を呼び出します。

Secrets Manager は、一般的に使用されるデータベースに関連付けられたシークレットを定期的に更新する機能もサポートしています。常に、保存する前に新しく更新されたシークレットを暗号化します。

Secrets Manager は AWS Key Management Service (AWS KMS) と統合されて、AWS KMS カスタマーマスターキー (CMK) によって保護された一意のデータ暗号化キーを使用して、すべてのシークレットの全バージョンを暗号化します。この統合により、AWS KMS を暗号化されないままにしない暗号化キーにより、シークレットが保護されます。また、マスターキーでカスタムアクセス権限を設定し、シークレットを保護するデータキーを生成、暗号化、復号するオペレーションを監査することができます。

シークレット値の保護

シークレットを保護するため、Secrets Manager はシークレットのシークレット値を暗号化します。

Secrets Manager では、シークレットは、シークレット値 (保護されたシークレットテキストまたは暗号化されたシークレットデータとも呼ばれます) および関連するメタデータとバージョン情報で構成されます。シークレット値は、最大 10,240 バイトまでの任意の文字列またはバイナリデータとすることができますが、通常はサーバーまたはデータベースのログイン情報を構成する名前と値のペアのコレクションです。

Secrets Manager は、シークレットを保存する前に常にシークレット値全体を暗号化します。また、シークレット値を取得または変更するたびに、透過的に復号します。暗号化を有効または無効にするオプションはありません。Secrets Manager では、シークレット値を暗号化および復号するために、AWS KMS を使用します。

シークレットの暗号化と復号

Secrets Manager は、シークレットを保護するために、AWS KMS カスタマーマスターキー (CMK) およびデータキーとともにエンベロープ暗号化を使用します。

Secrets Manager は、各シークレット値を保護するために一意のデータキーを使用します。シークレットのシークレット値が変わるたびに、Secrets Manager は新しいデータキーを生成してそれを保護します。次の図に示すように、データキーは AWS KMS CMK で暗号化され、シークレットのメタデータに保存されます。Secrets Manager は、シークレットを復号するためには、最初に AWS KMS で CMK を使用して暗号化されたデータキーを復号する必要があります。


        シークレットのバージョンでシークレット値を暗号化します

各シークレットの AWS KMS CMK

各シークレットは、AWS 管理またはカスタマー管理のカスタマーマスターキー (CMK) に関連付けられます。カスタマー管理の CMK により、承認されたユーザーはポリシーと許可を通じた CMK へのアクセスの制御自動更新の管理、およびインポートされたキーマテリアルの使用が可能です。

違反に、アカウントとリージョンでカスタマー管理の CMK を指定するか、Secrets Manager、aws/secretsmanager 用の AWS 管理の CMK を指定できます。CMK を指定しない場合、またはコンソールのデフォルト値 DefaultEncryptionKey を選択する場合、Secrets Manager によって aws/secretsmanager CMK が作成され (存在しない場合)、シークレットに関連付けられます。アカウントのシークレットごとに、同じ CMK または異なる CMK を使用できます。

シークレットの CMK は、いつでも Secrets Manager コンソールで、または UpdateSecret オペレーションを使用して変更できます。CMK を変更した場合、Secrets Manager は新しい CMK で既存のシークレット値を再暗号化しません。ただし、次回にシークレット値が変更されると、Secrets Manager は新しい CMK でその値を暗号化します。

シークレットに関連付けられている CMK を見つけるには、ListSecrets または DescribeSecret オペレーションを使用します。シークレットが Secrets Manager 用の AWS 管理の CMK (aws/secretsmanager) に関連付けられている場合、これらのオペレーションでは CMK ID は返されません。

Secrets Manager は CMK を使用してシークレット値を直接暗号化しません。代わりに、CMK を使用して一意のデータキーを生成して暗号化し、データキーを使用してシークレット値を暗号化します。

各シークレット値の一意のデータキー

シークレットのシークレット値を作成または変更するたびに、Secrets Manager はシークレットに関連付けられている CMK を使用して、一意の 256 ビット Advanced Encryption Standard (AES) 対称データキーを生成し、暗号化します。Secrets Manager はプレーンテキストデータキーを使用して AWS KMS の外部でシークレット値を暗号化し、次にメモリから削除します。また、データキーの暗号化されたコピーを、シークレットのメタデータに保存します。

シークレット値は、最終的に CMK によって保護され、AWS KMS が暗号化されないままの状態になることはありません。Secrets Manager は、シークレットを復号する前に、暗号化されたデータキーの復号を AWS KMS に指示する必要があります。

シークレット値の暗号化

Secrets Manager では、シークレットでシークレット値を暗号化するために、次のプロセスが使用されます。

  1. Secrets Manager はシークレットの CMK の ID と、256 ビット AES 対称キーのリクエストを使用して、AWS KMS の GenerateDataKey オペレーションを呼び出します。AWS KMS は、プレーンテキストのデータキーと CMK で暗号化されたデータキーのコピーを返します。

  2. Secrets Manager では、プレーンテキストのデータキーと Advanced Encryption Standard (AES) アルゴリズムを使用して、AWS KMS の外部でシークレット値を暗号化します。次に、使用後可能な限り早く、メモリからプレーンテキストキーが削除されます。

  3. Secrets Manager は暗号化されたデータキーをシークレットのメタデータに保存し、シークレット値の復号に利用できるようにします。ただし、いずれの Secrets Manager API も、暗号化されたシークレットまたは暗号化されたデータキーを返しません。

シークレット値の復号

Secrets Manager は、暗号化されたシークレット値を復号するためには、暗号化されたデータキーを最初に復号する必要があります。データキーは AWS KMS のシークレットに対して CMK で暗号化されるため、Secrets Manager は AWS KMS にリクエストを行う必要があります。

暗号化されたシークレット値を復号するには:

  1. Secrets Manager は AWS KMS の Decrypt オペレーションを呼び出し、暗号化されたデータキーを渡します。

  2. AWS KMS はシークレットの CMK を使ってデータキーを復号します。次に、プレーンテキストのデータキーを返します。

  3. Secrets Manager がプレーンテキストのデータキーを使ってシークレット値を復号します。次に、可能な限り早く、メモリからデータキーが削除されます。

AWS KMSCMK の使用

Secrets Manager は、シークレットに関連付けられたカスタマーマスターキー (CMK) を使用して、各シークレット値のデータキーを生成します。また、CMK を使用して、暗号化されたシークレット値を復号する必要があるときに、そのデータキーを復号します。AWS CloudTrail イベント、Amazon CloudWatch Logs、および監査証跡のリクエストとレスポンスを追跡できます。

次の Secrets Manager オペレーションでは、AWS KMS CMK を使用するためのリクエストをトリガーします。

GenerateDataKey

Secrets Manager は、次の Secrets Manager オペレーションに応じて、AWS KMS の GenerateDataKey オペレーションを呼び出します。

  • CreateSecret – 新しいシークレットにシークレット値が含まれる場合、Secrets Manager はその値を暗号化するために新しいデータキーをリクエストします。

  • PutSecretValue – Secrets Manager は指定されたシークレット値を暗号化するために新しいデータキーをリクエストします。

  • UpdateSecret – 更新でシークレット値が変更される場合、Secrets Manager は新しいシークレット値を暗号化するために新しいデータキーをリクエストします。

注記

RotateSecret オペレーションでは、シークレット値を変更しないため、GenerateDataKey を呼び出しません。ただし、RotateSecret が呼び出す Lambda 関数がシークレット値を変更する場合、PutSecretValue オペレーションの呼び出しにより、GenerateDataKey リクエストがトリガーされます。

Decrypt

Secrets Manager は、暗号化されたシークレット値を復号するため、AWS KMS の Decrypt オペレーションを呼び出して、シークレットの暗号化されたデータキーを復号します。次に、プレーンテキストのデータキーを使って、暗号化されたシークレット値を復号します。

Secrets Manager は、次の Secrets Manager オペレーションに応じて、レスポンスの Decrypt オペレーションを呼び出します。

  • GetSecretValue – Secrets Manager は、呼び出し元に返す前にシークレット値を復号します。

  • PutSecretValue および UpdateSecret – ほとんどの PutSecretValue および UpdateSecret リクエストは、Decrypt オペレーションをトリガーしません。ただし、PutSecretValue または UpdateSecret リクエストが、既存のバージョンのシークレットでシークレット値を変更しようとすると、Secrets Manager は既存のシークレット値を復号し、リクエストのシークレット値と比較して、それらが同じであることを確認します。このアクションにより、その Secrets Manager オペレーションがべき等になります。

 

CMK へのアクセスの検証

シークレットに関連付けられている CMK を作成または変更する場合、Secrets Manager は指定された CMK で GenerateDataKey および Decrypt オペレーションを呼び出します。これらの呼び出しでは、呼び出し元に、これらのオペレーションに対して CMK を使用するアクセス許可があることが確認されます。Secrets Manager はこれらのオペレーションの結果を破棄します。いずれの暗号化オペレーションでも、これらの結果が使用されることはありません。

これらのリクエストの SecretVersionId キーの暗号化コンテキストの値は RequestToValidateKeyAccess であるため、この検証呼び出しを識別できます。

注記

以前は、Secrets Manager 検証呼び出しには、暗号化コンテキストが含まれていませんでした。古い AWS CloudTrail ログには、暗号化コンテキストのない呼び出しが含まれている可能性があります。

CMK の使用の許可

Secrets Manager は、暗号化オペレーションでカスタマーマスターキー (CMK) を使用する場合、シークレットのシークレット値を作成または変更するユーザーに代わって操作を実行します。

ユーザーに代わって AWS KMS カスタマーマスターキー (CMK) を使用するには、ユーザーには次のアクセス権限が必要になります。IAM ポリシーまたはキーポリシーで、これらの必要なアクセス権限を指定できます。

  • kms:GenerateDataKey

  • kms:Decrypt

Secrets Manager から実行されるリクエストにのみ CMK が使用されるようにするには、値 secretsmanager.<region>.amazonaws.comkms:ViaService 条件キーを使用できます。

また、暗号化オペレーションに CMK を使用する条件として、暗号化コンテキストでキーまたは値を使用することもできます。たとえば、IAM またはキーポリシードキュメントで文字列条件演算子を使用するか、許可で許可の制約を使用できます。

AWS 管理の CMK のキーポリシー

Secrets Manager 用の AWS 管理 CMK のキーポリシーにより、Secrets Manager がユーザーに代わってリクエストを行うときにのみ、指定されたオペレーションに CMK を使用するためのアクセス許可がユーザーに付与されます。このキーポリシーでは、ユーザーが CMK を直接使用することは許可されません。

このキーポリシーは、すべての AWS 管理型キーと同様に、サービスによって確立されます。このポリシーを変更することはできませんが、いつでも表示できます。アカウントの Secrets Manager CMK のキーポリシーを取得するには、GetKeyPolicy オペレーションを使用します。

このキーポリシーのポリシーステートメントには次の効果があります。

  • アカウントのユーザーに、その名で Secrets Manager からリクエストを受信したときのみに、CMK を使用して暗号化オペレーションを行うことができるようにします。kms:ViaService 条件キーで、この制限を適用します。

  • AWS アカウントが、CMK プロパティを表示し、許可を取り消すことをユーザーに許可する IAM ポリシーを作成できるようにします。

  • Secrets Manager は許可を使用して CMK へのアクセスを取得しませんが、ポリシーでは、Secrets Manager がユーザーに代わって CMK の許可を作成し、アカウントで CMK を使用できるようにする許可の取り消しを Secrets Manager に許可します。これらは、AWS 管理の CMK のポリシードキュメントの標準の要素です。

以下に示すのは、Secrets Manager 用の AWS 管理 CMK のキーポリシー例です。

{ "Version" : "2012-10-17", "Id" : "auto-secretsmanager-1", "Statement" : [ { "Sid" : "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS S ecrets Manager", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:Describ eKey" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:ViaService" : "secretsmanager.us-west-2.amazonaws.com", "kms:CallerAccount" : "111122223333" } } },{ "Sid" : "Allow direct access to key metadata to the account", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource" : "*" } ] }

Secrets Manager 暗号化コンテキスト

暗号化コンテキスト は、一連のキーと値のペアを含む任意非シークレットデータです。データを暗号化するリクエストに暗号化コンテキストを組み込むと、AWS KMS は暗号化コンテキストを暗号化されたデータに暗号化してバインドします。データを復号化するには、同じ暗号化コンテキストに渡す必要があります。

Secrets Manager は、AWS KMS に対する GenerateDataKey および Decrypt リクエストで、次の例に示すようにシークレットとそのバージョンを識別する 2 つの名前–値のペアで暗号化コンテキストを使用します。名前は変わりませんが、組み合わされた暗号化コンテキストの値は、シークレット値ごとに異なります。

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }

暗号化コンテキストを使用して、AWS CloudTrail や Amazon CloudWatch Logs などの監査レコードとログ内の暗号化オペレーションを識別できます。また、ポリシーと許可の認可の条件として使用できます。

Secrets Manager 暗号化コンテキストは、2 つの名前と値のペアで構成されます。

  • SecretARN – シークレットを識別する最初の名前 – 値のペア。キーは、SecretARN です。値はシークレットの Amazon リソースネーム (ARN) です。

    "SecretARN": "ARN of an Secrets Manager secret"

    たとえば、シークレットの ARN が arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3 である場合、暗号化コンテキストには次のペアが含まれます。

    "SecretARN": "arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3"
  • SecretVersionId – シークレットのバージョンを識別する、2 番目の名前 – 値のペア。キーは、SecretVersionId です。値は、バージョン ID です。

    "SecretVersionId": "<version-id>"

    たとえば、シークレットのバージョン ID が EXAMPLE1-90ab-cdef-fedc-ba987SECRET1 である場合、暗号化コンテキストには次のペアが含まれます。

    "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"

シークレットの CMK を作成または変更すると、Secrets Manager は GenerateDataKey および Decrypt リクエストを AWS KMS に送信し、これらのオペレーションのために CMK を使用するアクセス許可が呼び出し元にあることを確認します。レスポンスは廃棄され、シークレット値では使用されません。

これらの検証リクエストでは、SecretARN の値がシークレットの実際の ARN となりますが、SecretVersionId 値は、次の暗号化コンテキストの例に示すように RequestToValidateKeyAccess になります。この特殊な値は、ログと監査証跡で検証リクエストを識別するうえで役立ちます。

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }

注記

以前は、Secrets Manager 検証リクエストには、暗号化コンテキストが含まれていませんでした。古い AWS CloudTrail ログには、暗号化コンテキストのない呼び出しが含まれている可能性があります。

AWS KMS を使用した Secrets Manager のモニタリング操作

AWS CloudTrail と Amazon CloudWatch Logs を使用して、Secrets Manager がユーザーに代わって AWS KMS に送信するリクエストを追跡できます。

GenerateDataKey

シークレットのシークレット値を作成または変更する場合、Secrets Manager はシークレットの CMK を指定する GenerateDataKey リクエストを AWS KMS に送信します。

GenerateDataKey オペレーションを記録するイベントは、次のようなサンプルイベントになります。リクエストは secretsmanager.amazonaws.com によって起動されます。このパラメーターには、シークレットの CMK の Amazon リソースネーム (ARN)、256 ビットキーを要求するキー識別子、およびシークレットとバージョンを識別する暗号化コンテキストが含まれます。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:23:41Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:23:41Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-west-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "keySpec": "AES_256", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "a7d4dd6f-6529-11e8-9881-67744a270888", "eventID": "af7476b6-62d7-42c2-bc02-5ce86c21ed36", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
Decrypt

シークレットのシークレット値を取得または変更するたびに、Secrets Manager は Decrypt リクエストを AWS KMS に送信し、暗号化されたデータキーを復号します。

Decrypt オペレーションを記録するイベントは、次のようなサンプルイベントになります。このユーザーは、テーブルにアクセスしている AWS アカウントのプリンシパルです。パラメーターには、暗号化されたテーブルのキー (暗号化テキストの blob として) およびテーブルと AWS アカウントを識別する暗号化コンテキストが含まれます。AWS KMS は暗号化テキストから CMK の ID を取得します。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:36:09Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:36:09Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-west-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "658c6a08-652b-11e8-a6d4-ffee2046048a", "eventID": "f333ec5c-7fc1-46b1-b985-cbda13719611", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }