

本指南记录了 2025 年 3 月 13 日发布的全新 AWS Wickr 管理控制台。有关经典版 AWS Wickr 管理控制台的文档，请参阅[经典管理指南](https://docs.aws.amazon.com/wickr/latest/adminguide-classic/what-is-wickr.html)。

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

# 静态加密
<a name="encryption-rest"></a>

默认情况下，AWS Wickr 数据保留服务会透明地加密所有保留的邮件和静态文件附件。您无需执行任何其他配置即可确保您的数据处于静态加密状态。数据保留服务在服务器端对存储在 Amazon S3 中的所有客户数据进行加密。

数据保留服务使用客户托管的 KMS 密钥 (CMK) 对静态客户数据进行加密。通过部署数据保留服务时 AWS Service Catalog，将在您的账户中自动创建对称 CMK，并将其配置为所有保留数据的默认加密密钥。您可以完全控制此密钥，包括审计使用情况、轮换密钥和撤消访问权限。

## 使用客户托管的 KMS 密钥加密静态数据以保留数据
<a name="encryption-rest-cmk"></a>

### 数据保留服务如何使用客户托管的 KMS 密钥
<a name="encryption-rest-how-it-works"></a>

部署数据保留服务后，将在您的 AWS 账户中创建一个对称的客户托管 KMS 密钥 (RetentionKey)。此密钥用于加密以下资源：
+ **保留的消息** — 数据保留机器人捕获的所有 Wickr 消息（文本、反应等）在存储到您的 S3 存储桶之前都使用 CMK 进行加密。使用加密 SDK 在 Nitro Enclave 内对消息进行 AWS 加密，然后使用相同的 CMK 上传到 Amazon S3。 SSE-KMS 
+ **保留的文件附件** — 与邮件关联的文件附件在 Nitro Enclave 内从 Wickr 的端到端加密中解密，使用 CMK 重新加密，然后存储在 Amazon S3 中。 SSE-KMS
+ **加密账户状态** — 数据保留机器人的加密私钥和账户状态使用 CMK 加密并存储在 DynamoDB 中。此状态的解密需要 Nitro Enclave 认证。
+ **S3 存储桶默认加密**-保留 S3 存储桶配置为 SSE-KMS 使用 CMK 作为默认加密密钥。存储桶策略强制要求所有对象都必须使用`aws:kms`服务器端加密进行上传。
+ **解密的输出存储桶** — 当客户触发按需解密（通过 Step Functions 状态机）时，解密后的输出也会存储在使用相同 CMK 加密的单独的 S3 存储桶中。

**Cross-account 角色架构**  
数据保留服务在账户中运行，并通过跨 Wickr-managed AWS 账户 IAM 角色 () `DRSCustomerCrossAccountRole-{networkId}-{region}` 访问客户资源。Wickr DRS Enclave 角色使用 AWS STS 带有外部 ID (`wickr-drs-{networkId}`) 的客户端角色来执行 KMS 和 S3 操作。

**Nitro Enclave 认证**  
直接`kms:Decrypt`呼叫（S3 以外 SSE-KMS）需要 Nitro Enclave 认证。KMS 密钥策略强制要求必须存在`kms:RecipientAttestation:PCR0``kms:RecipientAttestation:PCR1`、和`kms:RecipientAttestation:PCR2`条件，从而确保敏感数据（账户状态、消息内容）的解密只能在经过验证的飞地内进行。这可以防止任何操作员（包括Wickr）在安全区之外解密客户数据。

AWS Nitro Enclaves 使用您的 KMS 密钥处理消息，以解密数据保留模块的私钥，解密 Wickr-encrypted消息内容，并使用每条消息的唯一数据密钥对其进行重新加密，然后再将其存储在 S3 存储桶中。

### 在数据保留服务中配置客户托管的 KMS 密钥
<a name="encryption-rest-configuring"></a>

数据保留服务支持带有密钥用法`ENCRYPT_DECRYPT`和密钥规格的`SYMMETRIC_DEFAULT`对称 KMS 密钥。通过 Service Catalog 创建密钥时，默认启用自动密钥轮换。

此外，还会为密码恢复工作流程创建第二个非对称 KMS 密钥（ECC\_NIST\_P384，KEY\_AGREEMENT）。此密钥用于 ECDH 密钥协议，不能用于一般 encryption/decryption协议。从基于 Data Retention Bot docker 的架构迁移的客户可以选择使用此密钥。

**注意**  
Multi-region 目前不支持密钥。KMS 密钥必须与 S3 存储桶和数据保留服务部署位于同一区域。

#### 配置使用客户托管 KMS 密钥的权限
<a name="encryption-rest-permissions"></a>

通过 Service Catalog 部署时，会自动配置以下密钥策略。如果您需要手动配置密钥，请使用以下最低权限策略：

```
{
  "Version": "2012-10-17", 		 	 	 
  "Statement": [
    {
      "Sid": "YourExistingStatements",
      "Effect": "...",
      "...": "..."
    },
    {
      "Sid": "EnclaveGenerateDataKey",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{{customer-account-id}}}:role/DRSCustomerCrossAccountRole-{{{networkId}}}-{{{region}}}"
      },
      "Action": "kms:GenerateDataKey",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:RecipientAttestation:PCR0": "*",
          "kms:RecipientAttestation:PCR1": "*",
          "kms:RecipientAttestation:PCR2": "*"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": [
            "aws:wickr:network:id",
            "aws:wickr:app:id"
          ]
        }
      }
    },
    {
      "Sid": "EnclaveDescribeKey",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{{customer-account-id}}}:role/DRSCustomerCrossAccountRole-{{{networkId}}}-{{{region}}}"
      },
      "Action": "kms:DescribeKey",
      "Resource": "*"
    },
    {
      "Sid": "EnclaveDecryptWithAttestation",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{{customer-account-id}}}:role/DRSCustomerCrossAccountRole-{{{networkId}}}-{{{region}}}"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:RecipientAttestation:PCR0": "*",
          "kms:RecipientAttestation:PCR1": "*",
          "kms:RecipientAttestation:PCR2": "*"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:wickr:app:id"
        }
      }
  },
    {
      "Sid": "DRSDecryptionLambda",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{{customer-account-id}}}:role/{DecryptionLambdaRoleName}"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:wickr:network:id"
        }
      }
    }
  ]
}
```

每份陈述的目的：

启用 IAM 政策  
允许您的账户 root 管理密钥。这是标准的密钥管理员声明。

EnclaveGenerateDataKey  
`kms:GenerateDataKey`— 由 Nitro Enclave 调用，生成数据加密密钥，用于在存储到 S3 之前加密消息内容和账户状态。只有当安全区提供有效的 Nitro Enclave 认证文档（PCR0/1/2条件）并且存在 aws: wickr: network: id 或 aws: wickr: app: id 或 aws: wickr: app: id 的加密上下文密钥时，才允许使用。

EnclaveDescribeKey  
`kms:DescribeKey`— 允许安全区检索密钥元数据（密钥规范、用法、状态），以便在初始化期间进行验证。

EnclaveDecryptWithAttestation  
`kms:Decrypt`— 由 Nitro Enclave 调用以解密 Wickr 消息解密所需的账户状态（私钥）。只有当安全区提供有效的 Nitro Enclave 认证文档（PCR0/1/2 条件）并且存在加密上下文密钥 aws: wickr: app: id 时，才允许这样做，从而确保安全区之外无法进行解密。

DRSDecryptionLambda  
`kms:Decrypt`— 当您触发解密状态机时，由按需解密 Lambda 调用以解密保留的消息。Wickr 服务无法访问此角色，其存在仅供您从加密的 S3 存储桶中解密您自己的消息。

如果需要从以前的数据保留安装进行迁移，则必须先向服务提供 Docker-bot 模块密码，然后才能启用无服务器数据保留。有关更多信息，请参阅[密码恢复指令](password-recovery-instruction.md)。有关密码恢复密钥所需策略的详细信息，请参阅[数据保留服务的自定义 KMS 密钥设置](custom-kms-key.md)。

如果您需要手动配置 KMS 密钥，[数据保留服务的自定义 KMS 密钥设置](custom-kms-key.md)请参阅，了解密钥的最低许可策略。

#### 使用客户托管的 KMS 密钥创建新的数据保留部署
<a name="encryption-rest-creating"></a>

数据保留服务通过部署 AWS Service Catalog。当您启动`WickrDataRetentionProduct`产品时， CloudFormation 模板会自动：

1. 使用别名创建对称 CMK `wickr-drs-{{{networkId}}}-{{{region}}}-{{{suffix}}}-key`

1. 使用别名创建用于恢复密码的非对称 CMK (ECC P-384) `wickr-drs-{{{networkId}}}-{{{region}}}-{{{suffix}}}-password-recovery-key`

1. 使用对称 CMK 创建具有 SSE-KMS 默认加密功能的 S3 存储桶

1. `DRSCustomerCrossAccountRole`使用适当的 KMS 权限创建

1. 通过自定义资源 Lambda 向 Wickr 管理员 API 注册 KMS 密钥 ARN 和 S3 存储桶

KMS 密钥 ARN 也可以通过 Wickr Admin SDK 端点进行注册：

```
PUT /networks/{{{networkId}}}/serverless-resources
{
  "s3BucketName": "wickr-drs-{{{networkId}}}-{{{region}}}-{{{suffix}}}",
  "kmsKeyArn": "arn:aws:kms:{{{region}}}:{{{accountId}}}:key/{{{keyId}}}",
  "passwordRecoveryKmsKeyArn": "arn:aws:kms:{{{region}}}:{{{accountId}}}:key/{{{keyId}}}"
}
```

该`kmsKeyArn`参数必须是有效的 KMS 密钥 ARN。API 会在存储 ARN 格式之前对其进行验证。

#### 更改现有部署的加密配置
<a name="encryption-rest-changing"></a>

数据保留服务目前不支持在部署后更改 CMK。KMS 密钥紧密耦合到：
+ S3 存储桶的默认加密配置
+ 存储在 DynamoDB 中的加密账户状态
+ 具有 Nitro Enclave 认证条件的关键政策

要更改加密密钥，您必须：

1. 使用新的 KMS 密钥部署新的数据保留服务实例。

1. 以前保留的使用旧密钥加密的消息只能使用原始密钥进行访问。

**重要**  
当保留存储桶中存在加密消息时，请勿禁用或删除原始 KMS 密钥。这样做会使这些邮件永久无法恢复。

#### 缩小对客户管理的 KMS 密钥的访问权限
<a name="encryption-rest-scoping-access"></a>

**Nitro Enclave 认证（主访问控制）**  
界定 CMK 访问权限范围的主要机制是 Nitro Enclave 认证。关键政策要求`kms:RecipientAttestation:PCR0``PCR1`、和直接`kms:Decrypt`通话的`PCR2`条件。这可确保：
+ 只有经过验证的 Wickr DRS 安全区二进制文件才能解密敏感数据。
+ 即使是跨账户角色也无法解密安全区之外的数据。
+ CloudTrail 日志包括用于审计的实际 PCR 值。

**混淆代理保护**  
跨账户角色在 STS `AssumeRole` 调用中使用外部 ID (`wickr-drs-{networkId}`)。这样可以防止其他服务可能试图使用 Wickr DRS 安全区角色访问您的资源的混乱副手攻击。

**kms: ViaService 状况**  
S3 SSE-KMS 解密操作的范围使用条件。`kms:ViaService`这样可以确保只有当请求通过 S3 服务发出时才允许 S3-mediated解密。

**加密上下文**  
S3 SSE-KMS 会自动将 S3 对象 ARN 作为加密上下文包括在内。密钥策略使用此加密上下文将 S3 解密权限限定为特定前缀（例如，密码工具前缀）。

## 监控数据保留服务与 AWS KMS
<a name="encryption-rest-monitoring"></a>

您可以使用监控数据保留服务发出的所有 KMS API 调用 CloudTrail。要搜索 CloudTrail 日志条目，请使用 CloudTrail 控制台或 CloudTrail `LookupEvents`操作。

以下 CloudTrail 事件字段可用于审核数据保留服务的 KMS 使用情况：


| 字段 | 预期值 | 
| --- | --- | 
| eventName | Encrypt, Decrypt, GenerateDataKey | 
| userIdentity.arn | arn:aws:sts::{{{customerAccountId}}}:assumed-role/DRSCustomerCrossAccountRole-{{{networkId}}}-{{{region}}}、drs-create-account 或 drs-password-recovery | 
| requestParameters.keyId | 您的 CMK ARN（例如，）arn:aws:kms:{{{region}}}:{{{accountId}}}:key/{{{keyId}}} | 
| additionalEventData.recipient.attestationDocument | 适用于经过安全区验证的解密调用（包含 PCR 值） | 
| requestParameters.encryptionContext | 对于 S3 SSE-KMS：{"aws:s3:arn": "arn:aws:s3:::{{{bucketName}}}/{{{objectKey}}}"} | 

要监控的关键事件：
+ Enc@@ **rypt** — 当安全区在存储邮件内容或账户状态之前加密邮件内容或账户状态时发生。 S3/DynamoDB
+ **GenerateDataKey**— 当 S3 在对象上传期间生成用于 SSE-KMS 信封加密的数据密钥时发生。
+ **解密** — 在安全区解密账户状态（使用认证）或 S3 在读取时自动解密对象时发生。
+ **DeriveSharedSecret**— 当安全区在密码恢复流程中执行 ECDH 密钥协议时，会出现在密码恢复密钥上。
+ **GetPublicKey**— 当您的`collect.py`脚本检索本地 ECDH 加密的公钥时，会出现在密码恢复密钥上。

此外，Service Catalog 产品还会创建一个 CloudWatch 控制面板 (`WickrDataRetentionService-{{{networkId}}}`)，其中包括 KMS 关键成功指标（加密、 GenerateDataKey、解密操作）的微件和检测到解密失败时触发的解密错误警报。