

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

# 用于多回合强化学习的静态加密
<a name="model-customize-mtrl-encryption-at-rest"></a>

## 静态加密选项
<a name="model-customize-mtrl-encryption-options"></a>

Multi-turn Amazon A SageMaker I 中的强化学习作业会对所有静态数据进行加密。您的训练输入数据、输出数据（包括模型检查点和经过训练的模型工件）以及存储在 Amazon S3 中的中间数据均使用服务器端加密进行加密。您无需执行任何其他配置即可确保您的数据处于静态加密状态。

对于多轮 RL 任务， SageMaker Amazon AI 支持以下加密选项：
+ Server-side 使用@@ ** Amazon 自有的 KMS 密钥加密** — 默认情况下，Amazon SageMaker AI 使用 Amazon 自有的 KMS 密钥加密所有训练输出和中间数据。无需其他配置。
+ **Server-side 使用 Amazon KMS 密钥加密 (SSE-KMS)**-您可以选择指定客户托管的 KMS 密钥来加密 Amazon S3 中的训练输出数据。如果您在 Amazon S3 中的输入数据已使用客户托管密钥加密，则执行角色必须拥有解密该数据的权限。

## 使用客户托管对静态数据进行加密 Amazon KMS 键
<a name="model-customize-mtrl-cmk"></a>

### 多回合 RL 如何使用客户托管的 KMS 密钥
<a name="model-customize-mtrl-cmk-how"></a>

当您在多回合 RL 任务的输出配置中指定客户托管的 KMS 密钥时，Amazon A SageMaker I 会使用该密钥对 Amazon S3 中的以下资源进行加密：
+ 训练输出数据，包括经过训练的模型工件（LoRa 适配器权重）
+ 中间模型 input/output （可恢复模型检查点和轨迹数据）
+ mlFlow 实验数据和轨迹

当您指定客户托管的 KMS 密钥时，Amazon SageMaker AI 使用两种机制来加密您的数据：
+ **授权** — 在创建任务时，Amazon SageMaker AI 使用调用者的凭证在 KMS 密钥上创建一两个授权：
  + **写入授权**-为每个指定客户托管密钥的任务创建。允许服务在训练期间加密和解密当前作业的检查点和存储在平台中的临时数据。
  + **读取授权**-仅为从前一个作业的检查点恢复的迭代作业创建，而前一个作业也使用了客户托管密钥。允许服务解密先前作业的检查点数据。此授权仅允许解密，不允许写入新数据。

  任务完成后，所有授权都会自动停用，从而确保在任务生命周期结束后，服务无法再访问密钥。
+ **执行角色**-将输出数据（模型项目、检查点）保存到 Amazon S3 存储桶时，Amazon SageMaker AI 使用您提供的执行角色。执行角色必须有权使用 KMS 密钥通过 Amazon S3 进行加密和解密。

在训练作业期间，会发生以下 Amazon KMS 操作：
+ `kms:GenerateDataKey`— 写入加密输出数据（模型工件、检查点和日志）时通过 Amazon S3 调用。
+ `kms:Decrypt`— 读取加密的输入数据或之前写入的输出数据时通过 Amazon S3 调用。
+ `kms:DescribeKey`— 在创建任务时由呼叫者身份调用，以验证 KMS 密钥配置和状态。
+ `kms:CreateGrant`— 在创建作业时由调用者身份调用，以允许服务在任务生命周期内在平台内存储临时数据。

该服务不缓存数据密钥。每个 Amazon S3 读取或写入操作都通过 Amazon S3 服务集成 Amazon KMS 独立调用。

### 配置客户托管的 KMS 密钥
<a name="model-customize-mtrl-cmk-configure"></a>

Multi-turn RL 作业仅支持对称 Amazon KMS 密钥。 Multi-region 不支持密钥。

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

要将客户托管的 KMS 密钥用于多轮 RL 任务，您必须同时配置 IAM 执行角色和 KMS 密钥策略的权限。

您传递给 `CreateJob` API 的 IAM 执行角色必须具有以下 Amazon KMS 权限。这些权限允许训练作业通过 Amazon S3 加密输出数据和解密输入数据。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "KMSPermissionsForS3Encryption",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:{{region}}:{{account-id}}:key/{{key-id}}",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.*.amazonaws.com"
                }
            }
        }
    ]
}
```
+ `kms:Decrypt`— 需要从 Amazon S3 读取加密的输入数据和之前写入的输出数据。
+ `kms:GenerateDataKey`— 需要加密写入 Amazon S3 的输出数据（模型工件、检查点）。

该`kms:ViaService`条件将密钥的使用仅限于通过 Amazon S3 发出的请求，从而防止密钥用于其他目的。

默认 KMS 密钥策略已允许同一账户中的 IAM 角色使用该密钥。或者，您可以添加以下语句来进一步缩小访问范围，使其仅允许执行角色通过 Amazon S3 使用密钥：

```
{
    "Sid": "AllowMTRLJobEncryption",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::{{account-id}}:role/{{SageMakerExecutionRole}}"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringLike": {
            "kms:ViaService": "s3.*.amazonaws.com"
        }
    }
}
```

要允许调用者创建授权并描述密钥，请在密钥策略中添加以下语句：

```
{
    "Sid": "AllowCreateGrantForCaller",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::{{account-id}}:role/{{CallerRole}}"
    },
    "Action": [
        "kms:CreateGrant",
        "kms:DescribeKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:CallerAccount": "{{account-id}}"
        },
        "StringLike": {
            "kms:ViaService": "sagemaker.*.amazonaws.com"
        },
        "Bool": {
            "kms:GrantIsForAWSResource": "true"
        }
    }
}
```

#### 使用客户托管的 KMS 密钥创建多轮 RL 作业
<a name="model-customize-mtrl-cmk-create-job"></a>

要使用客户托管的 KMS 密钥加密输出数据，请在请求的`KmsKeyArn`字段中指定密钥 ARN。`OutputDataConfig` `CreateJob`有关更多信息，请参阅 *SageMaker AI API 参考[CreateJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateJob.html)*中的。

以下示例说明如何在中指定 KMS 密钥`OutputDataConfig`：

```
{
    "OutputDataConfig": {
        "S3OutputPath": "s3://{{your-bucket}}/output/",
        "KmsKeyArn": "arn:aws:kms:{{region}}:{{account-id}}:key/{{key-id}}"
    }
}
```

如果您在 Amazon S3 中的输入数据使用客户托管密钥 (SSE-KMS) 进行加密，请确保执行角色拥有该密钥的`kms:Decrypt`权限。您可以对输入和输出加密使用相同的密钥，也可以使用不同的密钥。

#### 缩小对客户托管的 KMS 密钥的访问权限
<a name="model-customize-mtrl-cmk-scope-down"></a>

您可以使用以下机制来限制对客户托管的 KMS 密钥的访问：

sagemaker：条件键 OutputKmsKeyArn   
使用调用方的 IAM 策略中的`sagemaker:OutputKmsKeyArn`条件密钥来控制可以为任务输出加密指定哪个 KMS 密钥。这允许管理员强制在创建多回合 RL 作业时仅使用经批准的密钥。有关 SageMaker AI 条件密钥的完整列表，请参阅 A [mazon A SageMaker I 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonsagemaker.html)。  

```
"Condition": {
    "ArnEquals": {
        "sagemaker:OutputKmsKeyArn": "arn:aws:kms:{{region}}:{{account-id}}:key/{{key-id}}"
    }
}
```

混淆代理保护  
在 KMS 密钥策略中使用`aws:SourceArn`或`aws:SourceAccount`条件密钥来防止出现混淆的副手问题。这样可以确保只有来自您的特定账户或资源的请求才能使用该密钥。  

```
"Condition": {
    "StringEquals": {
        "aws:SourceAccount": "{{account-id}}"
    },
    "ArnLike": {
        "aws:SourceArn": "arn:aws:sagemaker:{{region}}:{{account-id}}:job/*"
    }
}
```

## 多轮 RL 作业的加密上下文
<a name="model-customize-mtrl-cmk-encryption-context"></a>

当多轮 RL 任务使用您的客户托管的 KMS 密钥加密数据时，Amazon A SageMaker I 会在通过 Amazon S3 发出的每个 Amazon KMS 请求中都包含*加密上下文*。加密上下文是一组键值对，它们为操作提供额外的身份验证数据 (AAD)。 Amazon KMS 加密上下文已登录，可以在 Amazon CloudTrail KMS 密钥策略和授予限制中使用，以进一步限制访问权限。

Amazon SageMaker AI 使用以下加密上下文键值对进行多回合 RL 训练作业：

```
{
    "aws:sagemaker:finetuning-job-arn": "arn:aws:sagemaker:{{region}}:{{account-id}}:job/AgentRFT/{{job-name}}"
}
```

对于多轮 RL 评估作业，加密上下文使用：

```
{
    "aws:sagemaker:agent-rft-evaluation-job-arn": "arn:aws:sagemaker:{{region}}:{{account-id}}:job/AgentRFTEvaluation/{{job-name}}"
}
```

加密上下文绑定到创建加密数据的特定任务。在加密环境中，每个作业都使用自己的 ARN 加密自己的输出。这在加密数据和生成该数据的工作之间提供了加密绑定。

加密环境是通过 Amazon A SageMaker I 在创造就业机会时创建的授权限制自动强制执行的。您无需在 KMS 密钥策略中添加加密上下文条件即可正常进行加密。

如果您在 KMS 密钥策略的`kms:CreateGrant`语句中添加加密上下文条件，则必须允许对迭代训练链中的当前作业和上一个作业进行授权。以下示例允许 Amazon SageMaker AI 在加密环境中为任何训练作业 ARN 创建授权：

```
{
    "Sid": "AllowCreateGrantForCaller",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::{{account-id}}:role/{{CallerRole}}"
    },
    "Action": [
        "kms:CreateGrant",
        "kms:DescribeKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringLike": {
            "kms:ViaService": "sagemaker.*.amazonaws.com",
            "kms:EncryptionContext:aws:sagemaker:finetuning-job-arn": "arn:aws:sagemaker:{{region}}:{{account-id}}:job/AgentRFT/*"
        },
        "Bool": {
            "kms:GrantIsForAWSResource": "true"
        }
    }
}
```

**注意**  
如果您在加密环境中仅限`kms:CreateGrant`于单个特定任务 ARN，则迭代训练将失败，因为 Amazon A SageMaker I 还会使用前一个任务的 ARN 作为加密上下文创建读取授权。使用通配符模式允许为账户中的任何任务提供资助。

当您运行迭代训练作业（后续作业从前一个作业的检查点恢复）时，每个作业的加密上下文都包含该作业自己的 ARN。Amazon SageMaker AI 会自动管理两项 Amazon KMS 资助来支持迭代训练：
+ **写入授权**-允许当前作业使用当前作业的 ARN 作为加密上下文来加密自己的检查点数据。
+ **读取授权**-允许当前作业使用前一个作业的 ARN 作为加密上下文解密前一个作业的检查点数据。

任务完成后，这两项补助金都会自动停用。您无需为迭代培训添加任何其他密钥政策声明，即可使用客户托管密钥。

当您查看多轮 RL 作业发出的 Amazon KMS API 调用的 CloudTrail 日志时，加密上下文会显示在日志条`requestParameters`目的字段中。您可以使用此信息来确定哪个作业对您的数据执行了特定的加密或解密操作。

## 监视多圈 RL 的相互作用 Amazon KMS
<a name="model-customize-mtrl-cmk-monitoring"></a>

您可以使用 Amazon CloudTrail 来监控代表您的多回合 RL 作业发出的 Amazon KMS API 调用。以下 CloudTrail 事件名称与监控 KMS 密钥使用情况有关：
+ `Decrypt`— 当任务从 Amazon S3 读取加密数据时记录。
+ `GenerateDataKey`— 在任务将加密数据写入 Amazon S3 时记录。
+ `CreateGrant`— 当呼叫者在创建任务时创建拨款时已记录。
+ `DescribeKey`— 在作业描述用于验证的 KMS 密钥时记录。

在这些事件的 CloudTrail 日志条目中，查找以下值：
+ **req Parameters.granteePrincipal** uest — 对于`CreateGrant`事件，显示获得补助金的服务主体 (`job.sagemaker.amazonaws.com`)。

有关记录 Amazon KMS API 调用的更多信息，请参阅*Amazon KMS 开发者指南 Amazon CloudTrail*中的[使用记录 Amazon KMS API 调用](https://docs.amazonaws.cn/kms/latest/developerguide/logging-using-cloudtrail.html#searching-kms-ct)。