シークレットの暗号化と復号 - AWS Secrets Manager

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

Secrets Manager はエンベロープ暗号化をAWS KMS カスタマーマスターキー(CMK) およびデータキー各シークレット値を保護するために。シークレット内のシークレット値が変更されるたびに、シークレットマネージャーはそれを保護するための新しいデータキーを生成します。データキーは、AWS KMSCMK を使用しており、シークレットのメタデータに保存されます。シークレットを復号するために、シークレットSecrets Manager は、最初にAWS KMS。

シークレットマネージャーは、CMK を使用してシークレット値を直接暗号化しません。代わりに、CMK を使用して、256 ビット Advanced Encryption Standard (AES) 対称のデータキーまた、データキーを使用してシークレット値を暗号化することもできます。Secrets Manager は、プレーンテキストのデータキーを使用して、AWS KMSし、メモリから削除します。また、データキーの暗号化されたコピーを、シークレットのメタデータに保存します。

シークレットを作成するときは、対称カスタマー管理の CMK を AWS アカウント とリージョン、またはAWSSecrets Manager 用の管理対象 CMKaws/secretsmanager。CMK を指定しない場合、またはコンソールのデフォルト値DefaultEncryptionKey、Secrets Manager は、aws/secretsmanagerCMK が存在しない場合、およびシークレットに関連付けられます。アカウントのシークレットごとに、同じ CMK または異なる CMK を使用できます。シークレットマネージャーは、 対称型 CMKのみをサポートします。CMK が対称か非対称かを判断する方法については、」対称 CMK と非対称 CMK の識別

シークレットの CMK は、いつでもコンソールで、またはAWS CLIまたはAWSSDK とUpdateSecret。CMK を変更しても、Secrets Manager は新しい CMK の下にあるステージングラベルの AWSCURRENT、AWSPREVIOUS を持つシークレットのバージョンを再暗号化します。シークレット値が変更されると、Secrets Manager は新しい CMK でも暗号化します。古い CMK または新しい CMK を使用して、シークレットを取得するときにシークレットを復号化できます。

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

暗号化と復号プロセス

シークレットのシークレット値を暗号化するには、シークレットマネージャーは次のプロセスを使用します。

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

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

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

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

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

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

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

AWS KMS CMK の使用

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

次のSecrets Manager 操作は、AWS KMSCMK.

GenerateDataKey

Secrets Manager は、AWS KMS GenerateDataKeyオペレーションは、次の Secrets Manager 操作に応答します。

  • CreateSecret — 新しいシークレットにシークレット値が含まれている場合、シークレットマネージャーは、それを暗号化するための新しいデータキーを要求します。

  • PutSecretValue— シークレットマネージャーは、指定されたシークレット値を暗号化する新しいデータキーを要求します。

  • UpdateSecret — 更新によってシークレット値が変更された場合、シークレットマネージャーは新しいシークレット値を暗号化するための新しいデータキーを要求します。

注記

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

復号化

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

シークレットマネージャーは、次のシークレットマネージャー操作に応答して、 復号化 操作を呼び出します。

  • GetSecretValue — シークレットマネージャーは、呼び出し元に返す前にシークレット値を復号化します。

  • PutSecretValue および UpdateSecret — ほとんどの PutSecretValue および UpdateSecret 要求は Decrypt 操作をトリガーしません。ただし、 PutSecretValue または UpdateSecret 要求がシークレットの既存のバージョンでシークレット値を変更しようとすると、Secret Manager は既存のシークレット値を復号化し、リクエスト内のシークレット値と比較して、それらが同じであることを確認します。このアクションは、シークレットマネージャーの操作が冪等であることを保証します。

CMK へのアクセスの検証

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

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

注記

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

CMK の使用の許可

シークレットマネージャーが暗号化操作で 顧客マスターキー (CMK) を使用する場合、シークレットのシークレット値を作成または変更しているユーザーの代わりに動作します。

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

  • kms:GenerateDataKey

  • kms:Decrypt

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

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

AWS 管理 CMK のキーポリシー

キーポリシーAWSSecrets Manager の管理 CMK は、シークレットマネージャーがユーザーの代わりにリクエストを行う場合にのみ、指定された操作に CMK を使用するアクセス許可をユーザーに付与します。このキーポリシーでは、ユーザーが CMK を直接使用することは許可されません。

このキーポリシーは、すべての AWS 管理キーと同様に、サービスによって確立されます。キーポリシーは変更できませんが、いつでも表示できます。詳細については、「」を参照してください。キーポリシーの表示

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

  • アカウントのユーザーが暗号化操作に CMK を使用できるようにするのは、リクエストがシークレットマネージャーから送信される場合のみです。kms:ViaService 条件キーで、この制限を適用します。

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

  • シークレットマネージャーは CMK へのアクセスを取得するために許可を使用しませんが、ポリシーでは、シークレットマネージャーがユーザーに代わって CMK の 許可を作成 することを許可し、シークレットマネージャーが CMK の使用を許可する 許可を取り消すことを 許可します。これらは、AWS 管理の CMK のポリシードキュメントの標準の要素です。

以下に示すのは、例のキーポリシー例です。AWSSecrets Manager 用の管理対象 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" : "*" } ] }

シークレットマネージャーの暗号化コンテキスト

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

その中GenerateDataKeyおよびDecryptリクエストはAWS KMSSecret Manager は、次の例に示すようにシークレットとそのバージョンを識別する 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 と、ポリシーと権限付与の認証用の条件として使用できます。

シークレットマネージャーの暗号化コンテキストは、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" }
注記

以前は、シークレットマネージャーの検証要求に暗号化コンテキストが含まれていませんでした。古い AWS CloudTrail ログには、暗号化コンテキストのない呼び出しが含まれている可能性があります。

Secrets Manager ととの対話のモニタリングAWS KMS

次を使用できます。AWS CloudTrailおよび Amazon CloudWatch Logs を使用して、Secrets Manager が送信するリクエストを追跡します。AWS KMSはユーザーに代わって行います。シークレットの使用を監視する方法については、」使用を監視するAWS Secrets Managerシークレット

GenerateDataKey

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

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" }
復号化

Wheneven取得または変更シークレットのシークレット値、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" }