Amazon SES 的静态数据加密 - Amazon Simple Email Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon SES 的静态数据加密

默认情况下,Amazon SES 会加密所有静态数据。默认加密有助于降低保护数据的操作开销和复杂性。加密还支持创建符合严格加密合规性和法规要求的 Mail Manager 存档。

SES 提供以下加密选项:

  • AWS 拥有的密钥 – SES 默认使用这些密钥。您无法查看、管理或使用 AWS 拥有的密钥,或者审计其使用情况。但是无需执行任何操作或更改任何计划即可保护用于加密数据的密钥。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的 AWS 自有密钥

  • 客户自主管理型密钥 – SES 支持使用由您自己创建、拥有和管理的对称客户自主管理型密钥。由于您可以完全控制此加密,因此可以执行以下任务:

    • 制定和维护关键策略

    • 建立和维护 IAM 策略和授权

    • 启用和禁用密钥策略

    • 轮换加密材料

    • 添加标签

    • 创建密钥别名

    • 安排密钥删除

    要使用您自己的密钥,请在创建 SES 资源时选择客户自主管理型密钥。

    有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的客户托管密钥

注意

SES 会自动使用 AWS 拥有的密钥启用静态加密,且不收取任何费用。

但将 AWS KMS 收取客户托管密钥的使用费。有关定价的更多信息,请参阅 AWS Key Management Service 定价

创建客户托管密钥

您可以使用 AWS Management Console 或 AWS KMS API 创建对称的客户托管密钥。

创建对称的客户托管密钥

请按照《AWS Key Management Service 开发人员指南》创建对称加密 KMS 密钥的步骤操作。

注意

对于存档,您的密钥必须满足以下要求:

  • 密钥必须是对称的。

  • 密钥材料来源必须是 AWS_KMS

  • 密钥的用法必须是 ENCRYPT_DECRYPT

密钥策略

密钥策略控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥政策,其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时,可以指定密钥政策。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的管理对客户托管密钥的访问

要将客户自主管理型密钥与 Mail Manager 存档一起使用,您的密钥策略必须允许以下 API 操作:

  • kms:DescribeKey – 提供客户自主管理型密钥详细信息,允许 SES 验证密钥。

  • kms:GenerateDataKey – 允许 SES 生成用于加密静态数据的数据密钥。

  • kms:Decrypt – 允许 SES 在将存储的数据返回给 API 客户端之前对其进行解密。

以下示例显示了典型的密钥策略:

{ "Sid": "Allow SES to encrypt/decrypt", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt", "kms:DescribeKey" ], "Resource": "*" },

有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的在策略中指定权限

有关问题排查的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的密钥访问问题排查

为 Mail Manager 存档指定客户自主管理型密钥

您可以指定客户自主管理型密钥来替代使用 AWS 拥有的密钥。创建存档时,您可以通过输入 KMS 密钥 ARN 来指定数据密钥,Mail Manager 存档会使用该密钥来加密存档中的所有客户数据。

  • KMS 密钥 ARN:AWS KMS 客户自主管理型密钥的密钥标识符。输入密钥 ID、密钥 ARN、别名名称或别名 ARN。

Amazon SES 加密上下文

加密上下文是一组可选的键值对,包含有关数据的其他上下文信息。

AWS KMS 将加密上下文用作其他经过身份验证的数据,来支持经过身份验证的加密。在请求中包含加密上下文以加密数据时,AWS KMS 将加密上下文绑定到加密的数据。要解密数据,您必须在请求中包含相同的加密上下文。

注意

Amazon SES 不支持用于存档创建的加密上下文。相反,您可以使用 IAM 或 KMS 策略。有关策略示例,请参阅本节后面的存档创建策略

Amazon SES 加密上下文

SES 在所有 AWS KMS 加密操作中使用相同的加密上下文,其中键为 aws:ses:arn,值为资源 Amazon 资源名称(ARN)。

"encryptionContext": { "aws:ses:arn": "arn:aws:ses:us-west-2:111122223333:ExampleResourceName/ExampleResourceID" }

使用加密上下文进行监控

使用对称的客户自主管理型密钥来加密您的 SES 资源时,您还可以使用审计记录和日志中的加密上下文,来识别客户自主管理型密钥的使用情况。加密上下文还会显示在AWS CloudTrail 生成的日志或 Amazon CloudWatch Logs 中

使用加密上下文控制对客户托管式密钥的访问

您可以使用密钥策略和 IAM 策略中的加密上下文作为 conditions 来控制对您的对称客户托管密钥的访问。您还可以在授权中使用加密上下文约束。

SES 在授权中使用加密上下文约束来控制对您账户或区域中客户自主管理型密钥的访问。授权约束要求授权允许的操作使用指定的加密上下文。

以下是密钥策略声明示例,用于授予对特定加密上下文的客户托管密钥的访问权限。此策略语句中的条件要求授权具有指定加密上下文的加密上下文约束。

{ "Sid": "Enable DescribeKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleReadOnlyRole" }, "Action": "kms:DescribeKey", "Resource": "*" }, { "Sid": "Enable CreateGrant", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleReadOnlyRole" }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:ses:arn": "arn:aws:ses:us-west-2:111122223333:ExampleResourceName/ExampleResourceID" } } }

存档创建策略

以下策略示例演示了如何启用存档创建。这些策略适用于所有资产。

IAM policy

{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ses:CreateArchive", "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "ses.us-east-1.amazonaws.com", "kms:CallerAccount": "012345678910" } } }

AWS KMS 策略

{ "Sid": "Allow SES to encrypt/decrypt", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt", "kms:DescribeKey" ], "Resource": "*" },

为 Amazon SES 监控您的加密密钥

当您将 AWS KMS 客户自主管理型密钥与 Amazon SES 资源结合使用时,您可以使用 AWS CloudTrailAmazon CloudWatch Logs来跟踪 SES 发送到 AWS KMS 的请求。

以下示例是 AWS CloudTrail 的 GenerateDataKeyDecryptDescribeKey 事件,用于监控 SES 调用 KMS 操作,以访问由您的客户自主管理型密钥加密的数据:

GenerateDataKey

当您为资源启用 AWS KMS 客户自主管理型密钥时,SES 会创建一个唯一的表密钥。它向 AWS KMS 发送 GenerateDataKey 请求,指定资源的 AWS KMS 客户托管密钥。

当您为 Mail Manager 存档资源启用 AWS KMS 客户自主管理型密钥时,它将在加密静态存档数据时使用 GenerateDataKey

以下示例事件记录了 GenerateDataKey 操作:

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "ses.amazonaws.com" }, "eventTime": "2021-04-22T17:07:02Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-west-2", "sourceIPAddress": "172.12.34.56", "userAgent": "ExampleDesktop/1.0 (V1; OS)", "requestParameters": { "encryptionContext": { "aws:ses:arn": "arn:aws:ses:us-west-2:111122223333:ExampleResourceName/ExampleResourceID" }, "keySpec": "AES_256", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333", "sharedEventID": "57f5dbee-16da-413e-979f-2c4c6663475e" }
Decrypt

当您访问加密的资源时,SES 会调用 Decrypt 操作,以使用存储的加密数据密钥来访问加密数据。

以下示例事件记录了 Decrypt 操作:

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "ses.amazonaws.com" }, "eventTime": "2021-04-22T17:10:51Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "172.12.34.56", "userAgent": "ExampleDesktop/1.0 (V1; OS)", "requestParameters": { "encryptionContext": { "aws:ses:arn": "arn:aws:ses:us-west-2:111122223333:ExampleResourceName/ExampleResourceID" }, "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE", "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333", "sharedEventID": "dc129381-1d94-49bd-b522-f56a3482d088" }
DescribeKey

SES 使用 DescribeKey 操作来验证与您的资源关联的 AWS KMS 客户自主管理型密钥是否存在于账户和区域中。

以下示例事件记录了 DescribeKey 操作:

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE3", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "Admin" }, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-22T17:02:00Z" } }, "invokedBy": "ses.amazonaws.com" }, "eventTime": "2021-04-22T17:07:02Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-west-2", "sourceIPAddress": "172.12.34.56", "userAgent": "ExampleDesktop/1.0 (V1; OS)", "requestParameters": { "keyId": "00dd0db0-0000-0000-ac00-b0c000SAMPLE" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333" }

了解更多

以下资源提供有关静态数据加密的更多信息。