当 AI Agent 拿到浏览器权限,它可以去任何网站——这对企业来说是个不可接受的风险。Amazon Bedrock AgentCore 现在支持将 Chrome 企业策略注入浏览器会话,让你精确控制 Agent 能访问哪些域名、能否下载文件、是否允许执行 JavaScript。本文演示如何配置这些策略、通过会话录制验证策略生效,以及如何注入自定义根 CA 证书让 Agent 访问内部 HTTPS 服务。
Agent 浏览器的权限困境
Bedrock AgentCore 的浏览器工具让 Agent 能像人一样打开网页、点击、滚动、提取内容。但默认情况下,Agent 拿到的 Chrome 实例几乎没有限制——它能访问公网任意站点,也能触及不该碰的内网服务。
这在企业场景中直接阻断落地:
- 合规要求:金融、医疗等行业的数据访问有严格边界,Agent 不能随意跳转到第三方站点。
- 数据泄露风险:Agent 可能将敏感查询参数发送到外部搜索引擎。
- 内部服务访问:内网 HTTPS 服务使用私有 CA 签发证书,Agent 的浏览器会因证书不可信而拒绝连接。
Chrome 企业策略(Enterprise Policies)正是解决这些问题的标准机制——IT 管理员用它管控员工浏览器,现在同样的策略可以注入 Agent 的浏览器会话。
配置 URL 白名单策略
核心策略是 URLBlacklist 和 URLWhitelist:先黑名单阻断所有站点,再白名单放行指定域名。这比单独用黑名单更安全——默认拒绝,显式允许。
在 Bedrock AgentCore 中,策略通过浏览器会话配置注入。以下是一个完整的配置示例:
import boto3
client = boto3.client("bedrock-agentcore")
# 创建带 Chrome 企业策略的浏览器会话
response = client.create_browser_session(
browserIdentifier="my-restricted-browser",
chromeEnterprisePolicies={
"policies": {
# 1. 黑名单阻断所有 URL
"URLBlacklist": ["*"],
# 2. 白名单放行 Bedrock 文档站点
"URLWhitelist": [
"docs.aws.amazon.com/bedrock/",
"docs.aws.amazon.com/bedrock-agentcore/",
],
# 3. 禁止下载文件
"DownloadRestrictions": 3, # 3 = 完全禁止下载
# 4. 禁止开发者工具(防止 Agent 绕过限制)
"DeveloperToolsAvailability": 2, # 2 = 禁用
# 5. 禁止书签和密码保存
"AllowSavingBrowserHistory": False,
"PasswordManagerEnabled": False,
}
}
)
session_id = response["sessionId"]
print(f"受限浏览器会话已创建: {session_id}")
策略生效后,Agent 尝试访问 google.com 或任何不在白名单中的站点时,Chrome 会直接拦截,页面显示"被企业策略阻止"。
注意:
URLBlacklist设为["*"]是关键——它阻断一切,然后白名单才有意义。如果只配白名单不配黑名单,白名单不会生效。
通过会话录制验证策略
光配策略不够,你需要亲眼确认 Agent 确实被拦住了。AgentCore 的会话录制功能(Session Recording)可以回放 Agent 的每一步浏览器操作。
# 启动一个带录制的 Agent 任务
response = client.invoke_agent(
agentIdentifier="my-doc-researcher",
sessionId=session_id,
inputText="查找 Bedrock AgentCore 的浏览器工具使用文档",
sessionRecordingConfig={
"recordingMode": "SCREEN_AND_AUDIO" # 录制屏幕画面和音频
}
)
# 任务完成后获取录制回放
recording = client.get_session_recording(
sessionId=session_id
)
# 录制会包含:
# - Agent 成功访问 docs.aws.amazon.com 的画面
# - Agent 尝试访问其他站点时被策略拦截的画面(如果有)
print(f"录制回放地址: {recording['playbackUrl']}")
在回放中你会看到:Agent 打开白名单站点时一切正常,但如果 Agent 的推理链中产生了访问外部搜索引擎的意图,Chrome 会弹出策略拦截页面,Agent 不得不回到白名单站点继续操作。
这是最直观的验证方式——比翻日志更可信,比单元测试更真实。
注入自定义根 CA 证书
企业内网服务常用私有 CA 筣发证书。普通 Chrome 会报 NET::ERR_CERT_AUTHORITY_INVALID,Agent 的浏览器也一样。AgentCore 支持在策略中注入自定义根 CA,让 Agent 信任内网证书。
# 读取企业内部 CA 的根证书(PEM 格式)
with open("internal-root-ca.pem", "r") as f:
root_ca_pem = f.read()
response = client.create_browser_session(
browserIdentifier="internal-browser",
chromeEnterprisePolicies={
"policies": {
"URLBlacklist": ["*"],
"URLWhitelist": [
"internal-dashboard.corp.example.com",
"api.internal.corp.example.com",
],
# 注入自定义根 CA 证书
"CACertificates": [
{
"certificate": root_ca_pem, # PEM 格式的根证书内容
"displayName": "Corp Internal Root CA"
}
]
}
}
)
你可以用公开测试站点验证证书注入是否生效。例如 badssl.com 提供了各种证书错误场景的测试页面:
# 验证场景:先用已知不受信的证书站点确认默认行为是拦截
# 再注入对应根 CA,确认 Agent 能正常访问
# 步骤 1:不带 CA 创建会话,访问 https://untrusted-root.badssl.com/
# 预期:Agent 报证书错误,无法继续
# 步骤 2:注入 badssl 的测试根 CA 后重新创建会话
# 预期:Agent 能正常打开页面并提取内容
实际部署中:你不会注入 badssl 的 CA——这里只是用公开测试站点验证机制。真实场景注入的是你企业自己的根 CA。
完整实践:一个受限的文档研究 Agent
把上述能力组合起来,构建一个只能在指定站点查资料、只能访问内网 HTTPS 服务的 Agent:
import boto3
import json
client = boto3.client("bedrock-agentcore")
# --- 1. 准备企业根 CA ---
with open("corp-root-ca.pem", "r") as f:
corp_ca = f.read()
# --- 2. 创建受限浏览器会话 ---
browser_session = client.create_browser_session(
browserIdentifier="doc-research-browser",
chromeEnterprisePolicies={
"policies": {
"URLBlacklist": ["*"],
"URLWhitelist": [
"docs.aws.amazon.com/bedrock-agentcore/",
"docs.aws.amazon.com/bedrock/",
"internal-kb.corp.example.com/", # 内网知识库
],
"DownloadRestrictions": 3,
"DeveloperToolsAvailability": 2,
"CACertificates": [
{
"certificate": corp_ca,
"displayName": "Corp Root CA"
}
]
}
}
)
# --- 3. 配置 Agent 使用该浏览器 ---
agent_config = {
"agentIdentifier": "doc-researcher",
"browserSessionId": browser_session["sessionId"],
"sessionRecordingConfig": {
"recordingMode": "SCREEN"
}
}
# --- 4. 执行研究任务 ---
result = client.invoke_agent(
**agent_config,
inputText="总结 Bedrock AgentCore 浏览器工具的核心功能和安全配置方法"
)
print(result["outputText"])
# --- 5. 审查录制回放 ---
recording = client.get_session_recording(
sessionId=browser_session["sessionId"]
)
print(f"审查回放: {recording['playbackUrl']}")
上线前的检查清单
| 检查项 | 说明 |
|---|---|
URLBlacklist 设为 ["*"] |
否则白名单不生效,这是最常见的配置错误 |
| 白名单域名精确到路径 | docs.aws.amazon.com 太宽泛,docs.aws.amazon.com/bedrock/ 才是精确边界 |
| 自定义 CA 用 PEM 格式 | DER 格式不会被接受,确保你的 CA 证书是 PEM 编码 |
| 开启会话录制 | 这是审计和调试的唯一直观手段,不要省略 |
| 禁用开发者工具 | DeveloperToolsAvailability: 2 防止通过 DevTools 绕过策略 |
| 测试拦截场景 | 主动让 Agent 尝试访问黑名单站点,确认策略确实生效 |
权衡提醒:白名单越窄,安全性越高,但 Agent 的信息获取能力也越受限。如果 Agent 需要交叉验证多个信息源,白名单需要覆盖所有必要站点。一个实用做法是:先宽后窄——初期放开较多站点观察 Agent 实际访问模式,再逐步收紧到最小集。
Chrome 企业策略让 AI Agent 的浏览器从"无人驾驶"变成"有围栏的无人驾驶"——Agent 仍然自主决定怎么浏览,但它只能在你画好的边界内行动。