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

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

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

Secrets Manager は、エンベロープ暗号化をAWS KMS キーおよびデータキーとして使用して各シークレット値を保護します。シークレットのシークレット値が変更されるたびに、Secrets Manager はそれを保護するために新しいデータキーを AWS KMS からリクエストします。データキーは、KMS キーの下で暗号化され、シークレットのメタデータに保存されます。シークレットを復号するには、Secrets Manager はまず、AWS KMS の KMS キーを使用して、暗号化されたデータキーを復号します。

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

AWS KMS キーの選択

シークレットを作成するときは、AWS アカウント およびリージョンにある任意の対称型顧客管理キーを選択するか、または Secrets Manager 用の AWS マネージドキー (aws/secretsmanager) を使用します。AWS マネージドキー aws/secretsmanager を選択したが存在しない場合は、Secrets Manager が作成してシークレットに関連付けます。アカウントの各シークレットに、同じ KMS キーまたは異なる KMS キーを使用できます。異なる KMS キーを使用して、シークレットのグループのキーにカスタムアクセス許可を設定したり、それらのキーの特定の操作を監査したりする場合があります。Secrets Manager は、対称型 暗号化KMS キーのみをサポートします。外部キーストアで KMS キーを使用する場合、要求が AWS の外に移動する必要があるため、KMS キーの暗号化操作に時間がかかり、信頼性と耐久性が低下する可能性があります。

シークレットの暗号化キーの変更の詳細については、「AWS Secrets Manager シークレットの暗号化キーを変更する」を参照してください。

暗号化キーを変更すると、Secrets Manager は新しいキーを使用して、AWSCURRENTAWSPENDINGAWSPREVIOUS バージョンを再暗号化します。シークレットからロックアウトされないように、Secrets Manager は既存のすべてのバージョンを以前のキーで暗号化したままの状態にします。つまり、AWSCURRENTAWSPENDINGAWSPREVIOUS のバージョンを以前のキーまたは新しいキーで復号化できます。以前のキーに対する kms:Decrypt アクセス許可がない場合、暗号化キーを変更すると、Secrets Manager はシークレットバージョンを復号して再暗号化することはできません。この場合、既存のバージョンは再暗号化されません。

AWSCURRENT を新しい暗号化キーでのみ復号できるようにするには、新しいキーを使用してシークレットの新しいバージョンを作成します。次に、AWSCURRENT シークレットのバージョンを復号するには、新しいキーに対するアクセス許可が必要です。

AWS マネージドキー aws/secretsmanager へのアクセス許可を拒否し、カスタマーマネージドキーを使用してシークレットを暗号化することを要求できます。詳細については、「例: シークレットを暗号化するための特定の AWS KMS キーを拒否する」を参照してください。

シークレットに関連付けられている KMS キーを検索するには、コンソールにシークレットを表示するか、ListSecrets または DescribeSecret を呼び出します。シークレットが Secrets Manager (aws/secretsmanager) の AWS マネージドキー に関連付けられているとき、これらのオペレーションは KMS キーの ID を返しません。

暗号化されるもの

Secrets Manager ではシークレット値を暗号化しますが、次の値は暗号化しません。

  • シークレットの名前と説明

  • ローテーション設定

  • シークレットに関連付けられた KMS キーの ARN

  • アタッチされた AWS タグ

プロセスの暗号化と復号

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

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

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

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

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

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

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

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

KMS キーのアクセス許可

Secrets Manager が暗号化オペレーションで KMS キーを使用する場合、シークレット値をアクセスまたは更新しているユーザーの代わりに動作します。IAM ポリシーまたはキーポリシーでアクセス許可を付与できます。次の Secrets Manager オペレーションには、AWS KMS アクセス許可が必要です。

Secrets Manager で発生したリクエストにのみ KMS キーを使用するには、アクセス許可ポリシーで kms:ViaService 条件キーsecretsmanager.<Region>.amazonaws.com 値で使用します。

また、暗号化オペレーションに KMS キーを使用する条件として、暗号化コンテキストでキーまたは値を使用することもできます。例えば、IAM またはキーポリシードキュメントで文字列条件演算子を使用したり、制約許可を与えられます。KMS キー付与の伝播には、最大 5 分かかります。詳細については、「CreateGrant」を参照してください。

Secrets Manager による KMS キーの使用方法

Secrets Manager は KMS キーを使用して、以下の AWS KMS オペレーションを呼び出します。

GenerateDataKey

Secrets Manager は、以下のSecrets Manager オペレーションに応答して AWS KMSGenerateDataKey の操作を呼び出します。

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

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

  • ReplicateSecretToRegions – レプリケートされたシークレットを暗号化するために、Secrets Manager がレプリカリージョン内の KMS キーのデータキーをリクエストします。

  • UpdateSecret — シークレット値または KMS キーを変更した場合、Secrets Manager は新しいシークレット値を暗号化するための新しいデータキーを要求します。

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

Decrypt

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

  • GetSecretValueBatchGetSecretValue — Secrets Manager は、呼び出し元に返す前にシークレット値を復号化します。暗号化されたシークレット値を復号するとき、Secrets Manager は、AWS KMS Decrypt オペレーションを呼び出してシークレット内の暗号化されたデータキーを復号します。次に、プレーンテキストのデータキーを使って、暗号化されたシークレット値を復号します。バッチコマンドの場合、Secrets Manager は復号化されたキーを再利用できるため、すべての呼び出しが Decrypt リクエストにつながるわけではありません。

  • PutSecretValue および UpdateSecret — ほとんどの PutSecretValue および UpdateSecret 要求は Decrypt 操作をトリガーしません。ただし、PutSecretValue または UpdateSecret 要求がシークレットの既存のバージョンでシークレット値を変更しようとすると、Secrets Manager は既存のシークレット値を復号化し、リクエスト内のシークレット値と比較して、それらが同じであることを確認します。このアクションは、Secrets Manager の操作が冪等であることを保証します。暗号化されたシークレット値を復号するとき、Secrets Manager は、AWS KMS Decrypt オペレーションを呼び出してシークレット内の暗号化されたデータキーを復号します。次に、プレーンテキストのデータキーを使って、暗号化されたシークレット値を復号します。

  • ReplicateSecretToRegions – Secrets Manager は、レプリカリージョンにある新しい KMS キーを使用してシークレット値を再暗号化する前に、まずプライマリリージョンのシークレット値を復号します。

暗号化

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

  • UpdateSecret – KMS キーを変更すると、Secrets Manager は AWSCURRENTAWSPREVIOUSAWSPENDING およびシークレットバージョンを保護するデータキーを新しいキーで再暗号化します。

  • ReplicateSecretToRegions – Secrets Manager は、レプリカ リージョン内の KMS キーを使用して、レプリケーション中にデータキーを再暗号化します。

DescribeKey

Secrets Manager は、DescribeKey オペレーションを呼び出して、Secrets Manager コンソールでシークレットを作成または編集するときに KMS キーを一覧表示するかどうかを決定します。

KMS キーへのアクセスの検証

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

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

注記

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

キーポリシー AWS マネージドキー (aws/secretsmanager)

Secrets Manager (aws/secretsmanager) の AWS マネージドキー のキーポリシーは、Secrets Manager がユーザーの代わりにリクエストを行う場合にのみ、指定された操作に KMS キーを使用するアクセス許可を、ユーザーに付与します。このキーポリシーでは、ユーザーが KMS キーを直接使用することは許可されません。

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

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

  • アカウントのユーザーが暗号化オペレーションに KMS キーを使用できるようにするのは、リクエストがSecrets Manager から送信される場合のみです。kms:ViaService 条件キーで、この制限を適用します。

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

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

以下に示すのは、Secrets Manager 用の AWS マネージドキー のキーポリシー例です。

{ "Id": "auto-secretsmanager-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333", "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": "kms:GenerateDataKey*", "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "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 は暗号化コンテキストを暗号化されたデータに暗号化してバインドします。データを復号するには、同じ暗号化コンテキストに渡す必要があります。

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

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-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-east-2:111122223333:secret:test-secret-a1b2c3 である場合 、暗号化コンテキストには次のペアが含まれます。

    "SecretARN": "arn:aws:secretsmanager:us-east-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"

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

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

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

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

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

AWS CloudTrail および Amazon CloudWatch Logs を使用して、Secrets Manager がお客様に代わって AWS KMS に送信するリクエストを追跡できます。シークレットの使用のモニタリングについては、「AWS Secrets Manager シークレットを監視する」を参照してください。

GenerateDataKey

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

GenerateDataKey 演算を記録するイベントは、次のようなサンプルイベントになります。リクエストは secretsmanager.amazonaws.com によって起動されます。このパラメータには、シークレットの KMS キーの 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-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "keySpec": "AES_256", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-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-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
Decrypt

シークレットのシークレット値を取得または変更すると、Secrets Manager は Decrypt リクエストを AWS KMS に送信し、暗号化されたデータキーを復号化します。バッチコマンドの場合、Secrets Manager は復号化されたキーを再利用できるため、すべての呼び出しが Decrypt リクエストにつながるわけではありません。

Decrypt 演算を記録するイベントは、次のようなサンプルイベントになります。このユーザーは、テーブルにアクセスしている AWS アカウントのプリンシパルです。パラメータには、暗号化されたテーブルのキー (暗号化テキストの blob として)、およびテーブルと AWS アカウントを識別する暗号化コンテキストが含まれます。AWS KMS は、暗号化テキストから KMS キーの 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-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-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-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
暗号化

シークレットに関連付けられた KMS キーを変更すると、Secrets Manager は Encrypt リクエストを AWS KMS に送信して AWSCURRENTAWSPREVIOUSAWSPENDING およびシークレットバージョンを新しいキーで再暗号化します。シークレットを別のリージョンにレプリケートすると、Secrets Manager は Encrypt リクエストも AWS KMS に送信します。

Encrypt 演算を記録するイベントは、次のようなサンプルイベントになります。このユーザーは、テーブルにアクセスしている AWS アカウントのプリンシパルです。

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "creationDate": "2023-06-09T18:11:34Z", "mfaAuthenticated": "false" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2023-06-09T18:11:34Z", "eventSource": "kms.amazonaws.com", "eventName": "Encrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc", "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:ChangeKeyTest-5yKnKS", "SecretVersionId": "EXAMPLE1-5c55-4d7c-9277-1b79a5e8bc50" } }, "responseElements": null, "requestID": "129bd54c-1975-4c00-9b03-f79f90e61d60", "eventID": "f7d9ff39-15ab-47d8-b94c-56586de4ab68", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }