

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

# 安全性和访问控制
<a name="harness-security"></a>

该安全带为您提供了与其余安全原语相同的安全原语 AgentCore，并通过配置进行连接。
+  **孤立执行。**[在运行时，每个会话都在自己的 Firecracker microVM 中运行。AgentCore ](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/runtime-how-it-works.html)没有共享状态，没有共享文件系统。
+  **IAM 执行角色。**该工具承担您拥有的 IAM 角色，可配置为包括 Bedrock、ECR 和它所涉及 AgentCore 的原语。 CloudWatch请参阅下面的[执行角色策略](#harness-execution-role-policy)示例。
**注意**  
如果您的账户中启用了角色管理器，则会为您 AgentCore 附加角色，此处描述的角色选择步骤将替换为 “**自定义**” 选项。要使用其它角色，请选择**自定义**。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 角色创建](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create.html)。
+  **IAM 权限模型。**Harness API 需要对线束资源和底层[AgentCore 运行时](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/runtime-how-it-works.html)资源的权限。例如，调用`InvokeHarness`需要对线束 ARN `bedrock-agentcore:InvokeAgentRuntime` 具有`bedrock-agentcore:InvokeHarness`和权限。同样的模式也适用于控制平面操作：`DeleteHarness`要求`bedrock-agentcore:UpdateAgentRuntime``bedrock-agentcore:DeleteAgentRuntime`、`UpdateHarness`要求等。有关完整列表，请参阅[执行角色策略](#harness-execution-role-policy)。
+  **入站 OAuth Support。**JWT 配置的 Harness 资源要求呼叫者在调用安全带之前出示由已配置的身份提供商颁发的有效 JWT。AgentCore I@@ [d](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/identity.html) entity 通过代理线程化最终用户身份，因此下游工具可以使用限定范围的用户凭据而不是共享服务帐户调用 API。
+  **VPC。**将 Harness 会话连接到您的 VPC，以私密访问内部资源。
+  **网关上的策略。**当通过 [AgentCore Gateway](gateway.md) 提供工具时，可以配置用 Dogwood 或 Cedar 编写的[策略](policy.md)来控制每个呼叫：呼叫者可以调用哪些代理操作、在什么条件下、使用哪些参数。

**注意**  
 **Sigv4 和每个用户的身份。**当呼叫者使用 Sigv4 (Amazon IAM) 进行身份验证时，该工具不会将每个用户的身份传播到下游工具调用中。这意味着[AgentCore 身份](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/identity.html)令牌库中的每用户凭证范围界定功能（例如用户范围的 OAuth 令牌存储和代替令牌交换）仅在呼叫者通过 OAuth 入站路径向 Bearer JWT 进行身份验证时才可用。如果您的用例需要为下游工具设定每个用户的凭据范围，请在工具上配置入站 OAuth。计划在 future 版本中提供对每用户身份的 Sigv4 支持。

## 责任共担模式
<a name="harness-shared-responsibility"></a>

该工具基于 AgentCore 运行时构建，安全边界相同：IAM 或 JWT 身份验证与 microVM 隔离相结合。任何通过该门的委托人都会到达线束上配置的工具和功能，这使得呼叫者授权和输入验证成为客户的责任。

**Amazon 职责：**
+ 硬件级别的安全基础设施和 microVM 隔离
+ 操作系统内核修补
+ 用于直接部署代码的语言运行时补丁
+ 托管线束运行时代码，包括对请求结构的验证，是否`InvokeHarness`接受
+ 网络基础设施安全
+ 服务可用性和弹性

**你的责任：**
+ 代理代码安全和依赖关系管理
+ IAM 访问控制和资源策略
+ 运行时会话中执行的命令的安全性
+ Session-to-user 测绘执法
+ 输入验证和提示注入预防-包括验证所有`InvokeHarness`输入（参见[信任边界和输入验证](#harness-trust-boundary)）
+ 模型配置验证-例如`additionalParams``apiBase`、和`modelId`字段（请参阅[模型配置参数](#harness-model-params-security)）
+ 技能和说明来源-确保用于技能的 S3 存储桶、Git 存储库和网址包含可信内容（参见[技能和说明](#harness-skills-security)）
+ 容器镜像更新（用于容器部署）-定期使用最新的安全基础镜像进行重建
+ 网络配置（安全组、VPC 终端节点、路由表）

有关完整的 AgentCore 运行时分担责任模型，请参阅[ AgentCore 运行时安全最佳实践](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/runtime-security-best-practices.html#security-bp-shared-responsibility)。

### 信任边界和输入验证
<a name="harness-trust-boundary"></a>

任何通过 IAM 或 JWT 身份验证和授权门禁的委托人都可以访问完整的 microVM 会话，包括该工具上配置的工具和功能。该工具会验证其接受的请求的结构，但它不检查提示的含义、屏幕内容或对代理实施行为限制。

如果您向不完全信任的最终用户（员工、外部消费者或第三方集成）公开该工具，请在将消息传递给应用程序层之前对其进行验证和消毒。`InvokeHarness`这包括删除您不想分发的内容块类型或模型配置字段。这与任何接受来自授权调用者的有效负载的服务（例如 Lambda、Amazon API Gateway 和 Amazon SQS）的模式相同。

**注意**  
该工具会拒绝服务器端的最终消息`toolUse`块，如以下示例所示。对于**AgentCore 运行时**部署（非线束）， AgentCore Runtime 不提供服务器端保护。在将输入传递到代理框架之前，您的代理入口点必须验证提示字段是否为字符串，并拒绝或删除`toolUse`内容块。请参阅 [ AgentCore Runtime 安全最佳实践](runtime-security-best-practices.md)。

工具只能在模型推理的基础上运行。该[工具](https://docs.amazonaws.cn/bedrock-agentcore/latest/APIReference/API_HarnessToolUseBlock.html)在`InvokeHarness`请求的最后一条消息中不接受 ToolUse 块，因此调用者无法命名工具并直接调度。

以下示例显示了将线束配置为拒绝的请求。最后一条消息包含一个命名内置`shell`工具的`toolUse`方块：

```
response = client.invoke_harness(
    harnessArn=HARNESS_ARN,
    runtimeSessionId=SESSION_ID,
    messages=[{
      "role": "assistant",
      "content": [
        {
          "toolUse": {
            "toolUseId": TOOL_USE_ID,
            "name": "shell",
            "input": {
              "command": "pwd",
            }
          }
        }
      ]
    }],
)
```

Harness 不会评估区块命名的是哪个工具，因此这适用于内置的服务器端工具和调用中提供的内联函数。

仍然支持返回工具结果。线束在最终消息中接受 [ToolResult 块，然后模型恢复对该结果](https://docs.amazonaws.cn/bedrock-agentcore/latest/APIReference/API_HarnessToolResultBlock.html)的推理。对于[内联函数工具](harness-tools.md#harness-inline-functions)，该工具会将模型生成`toolUse`和待执行的存储在会话中。仅`toolResult`在以后使用相同内容的`InvokeHarness`请求中发送匹配项`runtimeSessionId`。没有匹配的待处理移交的结果无法恢复内联函数。

### 模型配置参数
<a name="harness-model-params-security"></a>

中的`model`字段`InvokeHarness`接受 `additionalParams` Bedrock、OpenAI 和 LitellM 配置。这些参数会原封不动地传递给底层模型提供者。安全带不验证、筛选或限制这些参数。

可以设置的来电者可`additionalParams`以：
+  **将请求重定向到任意端点** ——LitelLM 的`aws_bedrock_runtime_endpoint`参数会覆盖 Bedrock 端点 URL。调用者可以将签名的请求（包括 Sigv4 签名和会话凭证）路由到信任模型配置中指定的端点。
+  **覆盖 HTTP 标头**-OpenAI 的`extra_headers`参数在向模型提供者发出的出站请求中注入或覆盖 HTTP 标头，包括标头。`Authorization`
+  **尝试假设 IAM 角色** ——LitelLM 的`aws_role_name`参数指示运行时在调用模型提供者之前扮演不同的 IAM 角色。尝试成功或失败取决于执行角色的`sts:AssumeRole`权限。
+  **更改目标模型或区域**-`modelId` 和`apiBase`字段可以将推理完全重定向到不同的模型、区域或提供商。

如果您的应用程序向您不完全信任的呼叫者公开了`InvokeHarness`功能，请考虑在应用程序层中实现输入验证。例子包括：
+ 在转发请求之前删除该`model`字段或将其列入许可名单
+ 正在验证或删除`additionalParams``apiBase`、和 `modelId` 
+ 如果不需要角色切换，则拒绝`sts:AssumeRole`执行角色
+ 使用 VPC 安全组确定线束网络访问的范围

### 技能和说明
<a name="harness-skills-security"></a>

技能是指套件在调用时从 Amazon S3 或 Git 中获取并注入代理上下文的降价和脚本捆绑包。安全带将所有技能内容视为可信输入。在向代理提供内容或技能来源之前，它不会对内容或技能来源进行验证、消毒或检查。

您有责任做到以下几点：
+ 确保技能来源（S3 存储桶、Git 存储库、URL）可信且受访问控制
+ 在安全带上配置技能内容之前，请先查看技能内容（包括 markdown 指令和任何嵌入式脚本）
+ 控制哪些委托人可以在每次调用时覆盖该`skills`字段，因为调用者可以将工具指向任意 S3 或 Git 源

每次`InvokeHarness`通话可以重写技能。如果您的应用程序将来电者提供的输入转发给`InvokeHarness`，则呼叫者可以提供自己的技能来源，其中包含任意指令或脚本。缓解措施的例子包括：
+ 从来电者提供的请求中`skills`删除或忽略该字段
+ 允许列入允许的 S3 前缀或 Git 存储库

### 可观测性和迹线相关性
<a name="harness-observability-security"></a>

该工具会自动将关联标识符传播到下游 AgentCore 基元（网关、内存、代码解释器、浏览器），以便在中启用统一的跟踪视图。 CloudWatch这些标识符仅用于可观察性——它们从不用于授权或数据访问决策。

## 网络配置
<a name="harness-network-config"></a>

默认情况下，线束会话在公共网络上运行。要访问私有资源（数据库、内部 API、私有子网），请在您的 VPC 中部署安全带。

**Example**  

```
aws bedrock-agentcore-control create-harness \
  --harness-name "VpcHarness" \
  --execution-role-arn "arn:aws:iam::123456789012:role/MyHarnessRole" \
  --environment '{"agentCoreRuntimeEnvironment": {"networkConfiguration": {"networkMode": "VPC", "vpcConfig": {"securityGroupIds": ["sg-0abc1234def56789a"], "subnetIds": ["subnet-0abc1234def56789a"]}}}}'
```

```
agentcore add harness --name internal-agent \
  --network-mode VPC \
  --subnets subnet-0abc1234def56789a \
  --security-groups sg-0abc1234def56789a
agentcore deploy
```

**重要**  
在 VPC 模式下，该工具会在每个会话开始时从线束区域的私有 Amazon ECR 存储库中提取其托管应用程序容器。您的 VPC 不需要 NAT 网关或互联网访问权限即可进行此提取。相反，请为`com.amazonaws.<region>.ecr.dkr`和创建接口 VPC 终端节点`com.amazonaws.<region>.ecr.api`，为其创建网关 VPC 终端节点`com.amazonaws.<region>.s3`，以便图像及其层在您的 VPC 内解析。如果您的代理调用 Amazon Bedrock 进行推理，则还要为创建接口终端节点。`com.amazonaws.<region>.bedrock-runtime`如果没有所需的端点，会话将由于图像拉取超时而无法启动。执行角色必须允许从私有存储库中提取。参见[执行角色政策](#harness-execution-role-policy)。

有关其他网络配置指南，请参阅[配置 AgentCore 运行时和内置工具 VPC 配置](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/agentcore-vpc.html)。有关通过进行的入站 API 连接 PrivateLink，请参阅 [VPC 接口终端节点](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/vpc-interface-endpoints.html)。

## 入站 OAuth
<a name="_inbound_oauth"></a>

要求呼叫者在调用安全带之前出示由已配置的身份提供商签发的有效 JWT。AgentCore I@@ [d](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/identity.html) entity 通过代理线程化最终用户身份，因此下游工具可以使用限定范围的用户凭据而不是共享服务帐户调用 API。

**Example**  

```
aws bedrock-agentcore-control create-harness \
  --harness-name "OAuthHarness" \
  --execution-role-arn "arn:aws:iam::123456789012:role/MyHarnessRole" \
  --authorizer-configuration '{"customJWTAuthorizer": {"discoveryUrl": "https://cognito-idp.us-west-2.amazonaws.com/<POOL_ID>/.well-known/openid-configuration", "allowedClients": ["<CLIENT_ID>"]}}'
```
使用持有者令牌而不是 Sigv4 凭证进行调用：  

```
curl -X POST "https://bedrock-agentcore.us-west-2.amazonaws.com/harnesses/invoke?harnessArn=${HARNESS_ARN}" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${ID_TOKEN}" \
  -H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: $(uuidgen)" \
  -d '{"messages": [{"role": "user", "content": [{"text": "Hi"}]}]}'
```

```
agentcore add harness --name MyNewHarness \
  --authorizer-type CUSTOM_JWT \
  --discovery-url {DISCOVERY_URL} \
  --allowed-clients {CLIENT_ID}
agentcore deploy
```
使用不记名令牌调用：  

```
agentcore invoke --harness MyNewHarness --bearer-token "{token}" "Hello"
```
当您的身份提供商的 OIDC 发现端点只能通过以下方式访问时 PrivateLink，请向 CUSTOM\_JWT 授权方添加私有端点标志。使用服务托管 VPC 终端节点：  

```
agentcore add harness --name MyNewHarness \
  --authorizer-type CUSTOM_JWT \
  --discovery-url {DISCOVERY_URL} \
  --allowed-clients {CLIENT_ID} \
  --private-endpoint-vpc-id vpc-0abc1234def56789a \
  --private-endpoint-subnets subnet-0abc1234def56789a,subnet-0def5678abc12349b \
  --private-endpoint-ip-type IPV4 \
  --private-endpoint-security-groups sg-0abc1234def56789a
agentcore deploy
```
或者指向现有 VPC Lattice 资源配置，而不是托管 VPC 终端节点：  

```
agentcore add harness --name MyNewHarness \
  --authorizer-type CUSTOM_JWT \
  --discovery-url {DISCOVERY_URL} \
  --allowed-clients {CLIENT_ID} \
  --private-endpoint-lattice-arn rcfg-0abc1234def56789a
agentcore deploy
```
私有端点标志仅对有效。`--authorizer-type CUSTOM_JWT` `--private-endpoint-vpc-id`并且`--private-endpoint-lattice-arn`是相互排斥的，请选择一个。使用`--private-endpoint-vpc-id`，`--private-endpoint-subnets`和`--private-endpoint-ip-type`（`IPV4`或`IPV6`）均为必填项。
有关完整的 OAuth 设置流程，请参阅[入站 JWT 授权](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/inbound-jwt-authorizer.html)方。
`agentcore`在项目目录中运行，选择**添加**，选择 H **arn** ess，然后进入**高级设置**。使用 **Spac** e 启用**身份验证**（以及 VPC 访问的**网络**），然后**按 Enter**。  

1. 为 OIDC 持有者令牌身份验证选择授权者类型：** Amazon IAM**（默认）或**自定义 JWT**。  
![选择安全带授权者类型](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/images/tui/harness-security-02-auth-type.png)

1. 对于**自定义 JWT**，请输入 OIDC 发现 URL。  
![配置自定义 JWT：发现 URL](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/images/tui/harness-security-03-jwt.png)

1. 选择要验证的代币限制-允许的受众、允许的客户、允许的范围或自定义声明。  
![选择要配置的 JWT 约束](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/images/tui/harness-security-04-jwt-constraints.png)

1. 选择安全带到达 IdP 发现端点的方式：**无**（可公开访问）、VP **C Lattice 资源**或托管 V **PC 终端节点**（）。PrivateLink  
![PrivateLink IdP 发现端点的选项](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/images/tui/harness-security-05-privatelink.png)

1. 对于**网络**，请选择 VPC 模式并提供子网 ID 和安全组 ID。  
![输入 VPC 子网 ID](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/images/tui/harness-security-06-network-subnets.png)
确认向导，然后运行`agentcore deploy`以应用。

[了解更多：[AgentCore 身份](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/identity.html)·[入站 JWT 授权机构](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/inbound-jwt-authorizer.html)·出站凭证](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/identity-outbound-credential-provider.html) 

## 网关策略
<a name="_gateway_policies"></a>

当通过 [AgentCore Gateway](gateway.md) 提供工具时，用 Dogwood 或 Cedar 编写的[策略](policy.md)会限制每次调用：调用者可以调用哪些代理操作、在什么条件下、使用哪些参数。

了解更多：[AgentCore 政策](policy.md)·[政策撰写指南](policy-authoring-guide.md) 

## 执行角色策略
<a name="harness-execution-role-policy"></a>

该工具承担您提供的 IAM 执行角色。角色的信任策略必须允许 AgentCore 服务主体承担以下责任：

```
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "bedrock-agentcore.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }]
}
```

### 来电者必需的 IAM 权限
<a name="harness-iam-permissions"></a>

Harness API 需要对线束资源和底层[AgentCore 运行时](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/runtime-how-it-works.html)以及可选[AgentCore 内存](https://docs.amazonaws.cn/bedrock-agentcore/latest/devguide/memory.html)资源的权限。下表列出了每个 API 所需的操作：


| API | 所需的 IAM 操作 | 
| --- | --- | 
|  `InvokeHarness`  |  `bedrock-agentcore:InvokeHarness`, `bedrock-agentcore:InvokeAgentRuntime`  | 
|  `InvokeAgentRuntimeCommand`  |  `bedrock-agentcore:InvokeAgentRuntimeCommand`, `bedrock-agentcore:InvokeAgentRuntime`  | 
|  `InvokeAgentRuntimeCommandShell`  |  `bedrock-agentcore:InvokeAgentRuntimeCommandShell`  | 
|  `CreateHarness`  |  `bedrock-agentcore:CreateHarness`, `bedrock-agentcore:CreateAgentRuntime`, `bedrock-agentcore:CreateMemory`  | 
|  `UpdateHarness`  |  `bedrock-agentcore:UpdateHarness`, `bedrock-agentcore:UpdateAgentRuntime`, `bedrock-agentcore:UpdateMemory`  | 
|  `DeleteHarness`  |  `bedrock-agentcore:DeleteHarness`, `bedrock-agentcore:DeleteAgentRuntime`, `bedrock-agentcore:DeleteMemory`  | 
|  `GetHarness`  |  `bedrock-agentcore:GetHarness`  | 
|  `ListHarnesses`  |  `bedrock-agentcore:ListHarnesses`  | 
|  `CreateHarnessEndpoint`  |  `bedrock-agentcore:CreateHarnessEndpoint`, `bedrock-agentcore:CreateAgentRuntimeEndpoint`  | 
|  `UpdateHarnessEndpoint`  |  `bedrock-agentcore:UpdateHarnessEndpoint`, `bedrock-agentcore:UpdateAgentRuntimeEndpoint`  | 
|  `DeleteHarnessEndpoint`  |  `bedrock-agentcore:DeleteHarnessEndpoint`, `bedrock-agentcore:DeleteAgentRuntimeEndpoint`  | 
|  `GetHarnessEndpoint`  |  `bedrock-agentcore:GetHarnessEndpoint`  | 
|  `ListHarnessEndpoints`  |  `bedrock-agentcore:ListHarnessEndpoints`  | 
|  `ListHarnessVersions`  |  `bedrock-agentcore:ListHarnessVersions`  | 

大多数操作都使用线束 ARN 作为资源范围:. `arn:aws:bedrock-agentcore:<region>:<accountId>:harness/<id>` 端点操作还使用线束端点 ARN:。`arn:aws:bedrock-agentcore:<region>:<accountId>:harness/<id>/harness-endpoint/<endpointName>`

`GetHarnessEndpoint``UpdateHarnessEndpoint`、和`DeleteHarnessEndpoint`操作需要安全带 ARN 和端点 ARN。 `CreateHarnessEndpoint`只需要安全带 ARN。该端点尚不存在，因此不需要端点 ARN。当您调用自定义端点时，`InvokeHarness`同时`InvokeAgentRuntimeCommand`需要安全带 ARN 和端点 ARN。

### 执行角色策略示例
<a name="_sample_execution_role_policy"></a>

以下示例介绍了公共网络上的一个线束，它从 Amazon ECR Public 中提取其托管容器映像。处于 VPC 模式的线束会从线束区域的私有 Amazon ECR 存储库中提取托管映像，因此其执行角色还需要私有 ECR 拉取权限。在 [VPC 模式下添加语句：从私有 ECR 的托管映像拉取](#harness-vpc-managed-ecr)到 VPC-mode 线束的执行角色。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BedrockModelInvocation",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:*::foundation-model/*",
        "arn:aws:bedrock:<region>:<accountId>:*"
      ]
    },
    {
      "Sid": "EcrPublicTokenAccess",
      "Effect": "Allow",
      "Action": [
        "ecr-public:GetAuthorizationToken"
      ],
      "Resource": "*"
    },
    {
      "Sid": "StsForEcrPublicPull",
      "Effect": "Allow",
      "Action": [
        "sts:GetServiceBearerToken"
      ],
      "Resource": "*"
    },
    {
      "Sid": "XRayTracingAccess",
      "Effect": "Allow",
      "Action": [
        "xray:PutTraceSegments",
        "xray:PutTelemetryRecords",
        "xray:GetSamplingRules",
        "xray:GetSamplingTargets"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CloudWatchLogsGroup",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:DescribeLogStreams"
      ],
      "Resource": "arn:aws:logs:<region>:<accountId>:log-group:/aws/bedrock-agentcore/runtimes/*"
    },
    {
      "Sid": "CloudWatchLogsDescribeGroups",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups"
      ],
      "Resource": "arn:aws:logs:<region>:<accountId>:log-group:*"
    },
    {
      "Sid": "CloudWatchLogsStream",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:<region>:<accountId>:log-group:/aws/bedrock-agentcore/runtimes/*:log-stream:*"
    },
    {
      "Sid": "CloudWatchLogsPutResourcePolicy",
      "Effect": "Allow",
      "Action": [
        "logs:PutResourcePolicy"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CloudWatchMetricsPublish",
      "Effect": "Allow",
      "Resource": "*",
      "Action": "cloudwatch:PutMetricData",
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "bedrock-agentcore"
        }
      }
    },
    {
      "Sid": "AgentCoreWorkloadIdentity",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:GetWorkloadAccessToken",
        "bedrock-agentcore:GetWorkloadAccessTokenForJWT"
      ],
      "Resource": [
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default",
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default/workload-identity/harness_<agentName>-*"
      ]
    },
    {
      "Sid": "AgentCoreBrowserDefault",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:StartBrowserSession",
        "bedrock-agentcore:StopBrowserSession",
        "bedrock-agentcore:GetBrowserSession",
        "bedrock-agentcore:ListBrowserSessions",
        "bedrock-agentcore:UpdateBrowserStream",
        "bedrock-agentcore:ConnectBrowserAutomationStream",
        "bedrock-agentcore:ConnectBrowserLiveViewStream"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:aws:browser/*"
    },
    {
      "Sid": "AgentCoreCodeInterpreterDefault",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:StartCodeInterpreterSession",
        "bedrock-agentcore:StopCodeInterpreterSession",
        "bedrock-agentcore:GetCodeInterpreterSession",
        "bedrock-agentcore:ListCodeInterpreterSessions",
        "bedrock-agentcore:InvokeCodeInterpreter"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:aws:code-interpreter/*"
    },
    {
      "Sid": "AgentCoreMemory",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:CreateEvent",
        "bedrock-agentcore:DeleteEvent",
        "bedrock-agentcore:GetEvent",
        "bedrock-agentcore:ListEvents",
        "bedrock-agentcore:RetrieveMemoryRecords"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:memory/harness_<agentNameAbbrv>_*"
    }
  ]
}
```

当您搭建线束项目时， AgentCore CLI 会自动创建具有这些权限的角色。上述政策适用于您自己创建角色的情况。

**注意**  
上面的`BedrockModelInvocation`示例语句允许调用所有地区的所有基础模型以及您账户中的所有 Bedrock 资源。要缩小范围，请将资源 ARN 替换为特定的[推理配置文件](https://docs.amazonaws.cn/bedrock/latest/userguide/inference-profiles.html)，这样您就可以使用单个 ARN 跨模型和区域路由请求。例如：与所有允许的区域`arn:aws:bedrock:<destination_regions>:<accountId>:inference-profile/<profileId>`配对`arn:aws:bedrock:<region>:<accountId>:foundation-model/<modelId>`。

对于生产工作负载，请将`Resource`值范围缩小到您的线束需要而不是使用的`"*"`特定 ARN。

### 可选功能的额外权限
<a name="_additional_permissions_for_optional_features"></a>

以下是您可以根据您的线束使用的功能附加到执行角色的示例策略。遵循最低权限原则-仅向您的线束代理授予其推理所需的特定工具和证书。有关占位符[占位符参考](#harness-optional-placeholders)的定义，请参阅。

#### 生命周期挂钩目标
<a name="harness-lifecycle-hook-permissions"></a>

[为生命周期挂钩中配置的每个 Lambda、SNS 或 EventBridge 目标添加权限。](harness-lifecycle-hooks.md)

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InvokeLifecycleHookLambda",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "<hookFunctionArn>"
    },
    {
      "Sid": "PublishLifecycleHookSns",
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "<hookTopicArn>"
    },
    {
      "Sid": "PublishLifecycleHookEventBridge",
      "Effect": "Allow",
      "Action": "events:PutEvents",
      "Resource": "<hookEventBusArn>"
    }
  ]
}
```

将每个资源替换为挂钩配置中的确切目标 ARN，包括 Lambda 版本或别名限定符（如果存在）。移除该工具不使用的目标类型的语句。对于跨账户目标，还要将目标的基于资源的策略配置为允许利用框架执行角色。

#### 私有 ECR 访问权限（自定义容器镜像）
<a name="harness-custom-container-ecr"></a>

当您的线束使用私有 ECR 镜像作为自定义容器时，请添加此策略。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ECRImageAccess",
      "Effect": "Allow",
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "arn:aws:ecr:<ecrRegion>:<ecrAccountId>:repository/<ecrRepoName>"
    },
    {
      "Sid": "ECRTokenAccess",
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}
```

#### VPC 模式：从私有 ECR 提取托管镜像
<a name="harness-vpc-managed-ecr"></a>

当您的安全带在 VPC 模式下运行时，请添加此策略。在 VPC 模式下，该工具从线束区域的私有 Amazon ECR 存储库（已命名`harness-<region>`）中提取其托管应用程序容器。此拉取使用私有 ECR 而不是 Amazon ECR Public，因此执行角色需要私有 ECR 拉取权限。此政策与[自定义容器镜像权限](#harness-custom-container-ecr)是分开的，即使您不提供自己的容器，它也适用于 Amazon 托管映像。

仓库归 Amazon 服务账户所有，因此仓库 ARN 中的账户是通配符。拉取权限的范围限于安全带区域。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EcrManagedImagePull",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchCheckLayerAvailability"
      ],
      "Resource": "arn:aws:ecr:<region>:*:repository/harness-*"
    },
    {
      "Sid": "EcrManagedImageToken",
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}
```

确保您的 VPC 中存在所需的 VPC 终端节点（参见[网络配置](#harness-network-config)）：`com.amazonaws.<region>.ecr.dkr`和`com.amazonaws.<region>.ecr.api`的接口终端节点和的网关终端节点`com.amazonaws.<region>.s3`。

#### AgentCore 记忆
<a name="_agentcore_memory"></a>

当您的安全带使用客户拥有的内存实例时，请添加此策略。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreMemory",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:CreateEvent",
        "bedrock-agentcore:DeleteEvent",
        "bedrock-agentcore:GetEvent",
        "bedrock-agentcore:ListEvents",
        "bedrock-agentcore:RetrieveMemoryRecords"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:memory/<memoryId>"
    }
  ]
}
```

#### AgentCore 浏览器（自定义）
<a name="_agentcore_browser_custom"></a>

当您的安全带使用客户拥有的自定义浏览器资源时，请添加此政策。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreBrowserCustom",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:StartBrowserSession",
        "bedrock-agentcore:StopBrowserSession",
        "bedrock-agentcore:GetBrowserSession",
        "bedrock-agentcore:ListBrowserSessions",
        "bedrock-agentcore:UpdateBrowserStream",
        "bedrock-agentcore:ConnectBrowserAutomationStream",
        "bedrock-agentcore:ConnectBrowserLiveViewStream"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:browser-custom/<browserCustomId>"
    }
  ]
}
```

#### AgentCore 代码解释器（自定义）
<a name="_agentcore_code_interpreter_custom"></a>

当您的安全带使用客户拥有的自定义代码解释器时，请添加此政策。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreCodeInterpreterCustom",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:StartCodeInterpreterSession",
        "bedrock-agentcore:StopCodeInterpreterSession",
        "bedrock-agentcore:GetCodeInterpreterSession",
        "bedrock-agentcore:ListCodeInterpreterSessions",
        "bedrock-agentcore:InvokeCodeInterpreter"
      ],
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:code-interpreter-custom/<codeInterpreterCustomId>"
    }
  ]
}
```

#### AgentCore 网关
<a name="_agentcore_gateway"></a>

当您的线束使用配置了 Sigv4 入站身份验证的网关时，请添加此策略。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreGatewayAccess",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:InvokeGateway",
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:gateway/<gatewayId>"
    }
  ]
}
```

#### 亚马逊 S3 和 Git 中的技能来源
<a name="_skill_sources_in_amazon_s3_and_git"></a>

当您的安全带从 Amazon S3 来源获取技能时，请添加此策略。执行角色列出并下载存储桶前缀下的技能对象。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreSkillS3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<skillBucket>",
        "arn:aws:s3:::<skillBucket>/*"
      ]
    }
  ]
}
```

要从私有 Git 存储库中获取技能，该工具会从 API 密钥凭据提供者那里读取个人访问令牌。为持有该**令牌的凭证提供商授予如下所示的 API 密钥**凭证提供商政策。

#### API 密钥凭证提供商（OpenAI、Gemini、LitelLM 或 MCP 标头 ARN 参考文献）
<a name="_api_key_credential_provider_openai_gemini_litellm_or_mcp_header_arn_references"></a>

当你的安全带使用 OpenAI、Gemini 或 LitelLM 等模型提供者的 API 密钥凭证提供程序时，请添加此政策。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreApiKeyTokenVaultDefault",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:GetResourceApiKey",
      "Resource": [
        "arn:aws:bedrock-agentcore:<region>:<accountId>:token-vault/default",
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default",
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default/workload-identity/harness_<agentName>-*"
      ]
    },
    {
      "Sid": "AgentCoreApiKeyTokenVaultPerKey",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:GetResourceApiKey",
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:token-vault/default/apikeycredentialprovider/<apiKeyName>"
    },
    {
      "Sid": "AgentCoreApiKeySecret",
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:secretsmanager:<region>:<accountId>:secret:bedrock-agentcore-identity!default/apikey/<apiKeyName>-*"
    }
  ]
}
```

#### OAuth2 凭证提供商（网关）OAuth-protected
<a name="_oauth2_credential_provider_oauth_protected_gateway"></a>

当您的安全工具使用 OAuth2 凭证提供商作为网关工具时，请添加此策略。 OAuth-protected 

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AgentCoreOAuth2TokenVaultDefault",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:GetResourceOauth2Token",
      "Resource": [
        "arn:aws:bedrock-agentcore:<region>:<accountId>:token-vault/default",
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default",
        "arn:aws:bedrock-agentcore:<region>:<accountId>:workload-identity-directory/default/workload-identity/harness_<agentName>-*"
      ]
    },
    {
      "Sid": "AgentCoreOAuth2TokenVaultPerProvider",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:GetResourceOauth2Token",
      "Resource": "arn:aws:bedrock-agentcore:<region>:<accountId>:token-vault/default/oauth2credentialprovider/<oauthProviderName>"
    },
    {
      "Sid": "AgentCoreOAuth2Secret",
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:secretsmanager:<region>:<accountId>:secret:bedrock-agentcore-identity!default/oauth2/<oauthProviderName>-*"
    }
  ]
}
```

#### 占位符参考
<a name="harness-optional-placeholders"></a>

将上述策略中的以下占位符替换为特定于您的环境的值：


| Placeholder | 说明 | 
| --- | --- | 
|  `<region>`  | 您的资源部署的地 Amazon 区。 | 
|  `<accountId>`  | 您的 Amazon 账户 ID。 | 
|  `<agentName>`  | 你的安全带代理的名字。 | 
|  `<agentNameAbbrv>`  | 默认 AgentCore 内存资源名称中使用的线束代理名称的缩写形式。 | 
|  `<memoryId>`  | 您的 AgentCore 内存资源的 ID。 | 
|  `<browserCustomId>`  | 您的自定义浏览器资源的 ID。 | 
|  `<codeInterpreterCustomId>`  | 您的自定义代码解释器资源的 ID。 | 
|  `<gatewayId>`  | 您的 AgentCore 网关资源的 ID。 | 
|  `<apiKeyName>`  | 您的 API 密钥凭证提供商的名称。 | 
|  `<skillBucket>`  | 存放您的技能文件的 S3 存储桶的名称。 | 
|  `<oauthProviderName>`  | 您的 OAuth2 凭证提供商的名称。 | 
|  `<ecrRegion>`  | 托管 ECR 存储库的区域。 | 
|  `<ecrAccountId>`  | 拥有 ECR 存储库的 Amazon 账户 ID。 | 
|  `<ecrRepoName>`  | 您的 ECR 存储库的名称。 | 
|  `<hookFunctionArn>`  | Lambda 生命周期挂钩目标的 ARN，包括版本或别名限定符（如果存在）。 | 
|  `<hookTopicArn>`  | SNS 生命周期挂钩目标的 ARN。 | 
|  `<hookEventBusArn>`  |  EventBridge 生命周期挂钩目标的 ARN。 | 

**注意**  
Secrets Manager 资源的尾`-*`随机解释了 Secrets Manager 附加到机密 ARN 的随机后缀。

#### 相关主题
<a name="_related_topics"></a>
+  [工具](harness-tools.md)-查看工具类型和`allowedTools`模式
+  [生命周期挂钩](harness-lifecycle-hooks.md) — 配置挂钩以验证调用和工具调用
+  [环境和文件系统](harness-environment.md)-配置自定义环境和 ECR 权限
+  [交互式外壳](harness-command-shell.md)-在线束会话中打开交互式终端
+  [用限制控制成本](harness-operations.md#harness-limits) — 设置执行限额以控制成本
+  [API 文档](harness-get-started.md#api-documentation) 