没人告诉你 OpenClaw 有多危险,但我们找到了答案:Serverless + 零信任
OpenClaw 最近因安全问题被反复讨论——Lightsail 部署方案存在明显隐患,数据可能在你不知情的情况下暴露。本文从安全工程师的视角梳理了核心风险,并给出一个真正可用于生产的解法:基于 AWS Bedrock AgentCore,结合私有 VPC、用户隔离、STS 凭证和 S3 持久化,让你的 AI Agent 既能 Serverless 运行,又不再裸奔。
前言
本周,AWS 官方宣布支持 在 Lightsail 上运行 OpenClaw,这个消息令社区非常兴奋,我自己也不例外。
Lightsail 方案部署极其简单,但它有一个问题:实例必须全月保持运行(也就意味着持续计费)。OpenClaw 是一款出色的开源产品,但其安全性也让不少用户感到担忧。AWS Hero Gerardo Castro Arica 对这套 Lightsail 实现做了深入的安全分析——总体而言,它正在朝着正确的方向发展,但还需要一些额外的加固步骤。
但你知道吗?Lightsail 并不是在 AWS 上运行 OpenClaw 的唯一方式。还有另一种"更安全、Serverless"的方案:使用 Bedrock AgentCore。
AWS 工程师团队发布了这个仓库,包含了搭建所需的全部资源,使用 CDK 完成整体部署。这套方案不如 Lightsail 那么简单直接,但对于熟悉 CLI 工具的用户来说完全可以胜任(没错,Kiro/Claude Code 可以直接读取说明文档并自动完成部署)。
架构设计

S3 工作区同步
AgentCore 的 microVM 在设计上是临时性的——按需启动,空闲时自动销毁。
问题在于:OpenClaw 将它所了解的用户一切信息都存储在本地文件系统的 .openclaw/ 目录下(对话记忆、用户画像、Agent 配置、工具输出)。如果没有持久化策略,所有这些数据在会话结束的瞬间就会消失殆尽。
解决方案是在容器内构建一个轻量的 S3 同步层:
- 会话启动时:在 OpenClaw 初始化之前,contract server 先从 S3 还原用户的
.openclaw/目录,让 Agent 拥有完整的上下文,仿佛上一次会话从未中断过 - 每 5 分钟:后台定时器将工作区推送回 S3,防止会话中途意外中断导致数据丢失
- 关闭时(SIGTERM):在 AgentCore 的 15 秒优雅退出窗口内执行最终保存,确保 microVM 终止前本次会话的所有数据都完整落地
安全设计
网络层:AgentCore 容器运行在私有 VPC 子网中,没有直接的公网暴露。所有 AWS 服务流量通过 VPC Endpoint 路由(S3、Bedrock、Secrets Manager、ECR、DynamoDB、STS、CloudWatch)。唯一的公网入口是 API Gateway HTTP API。
Webhook 身份验证:每个入站 Webhook 在进行任何处理之前都会经过密码学校验。Telegram 使用通过 setWebhook 注册的 Secret Token;Slack 使用带 5 分钟重放窗口的 HMAC-SHA256 签名校验。两者均采用 fail-closed 策略——如果密钥未配置,请求将被直接拒绝。
用户隔离:每个用户在独立的 AgentCore microVM 中运行,拥有专属的 S3 命名空间,用户间没有任何共享状态。命名空间由系统控制分配,无法被用户输入所影响。
STS 会话级凭证:容器使用会话策略承担 IAM 角色,将对 S3 和 DynamoDB 的访问权限限制在当前用户的命名空间和记录范围内。即使用户以某种方式获得了容器的 Shell 访问权限,也无法读取其他用户的数据。
密钥管理:所有敏感信息(Bot Token、Webhook Secret、Cognito 凭证)存储在 Secrets Manager 中,使用客户托管 KMS 密钥(CMK)加密,在运行时加载到进程内存中。
工具加固:OpenClaw 的 read 工具被禁用,以防止通过 /proc 或本地文件读取凭证。exec 工具允许用于技能管理,但受 STS 凭证作用域限制爆炸半径。代理绑定到 loopback 地址,安全组出站规则限制为 HTTPS。
容器加固:Bridge 以非 root 用户(openclaw,uid 1001)运行。请求体上限为 1 MB。内部错误详情和堆栈跟踪绝不会出现在 API 响应中。
加密:所有数据静态加密(S3 和 Secrets Manager 使用 CMK,DynamoDB 使用 AWS 托管密钥),传输加密(所有 AWS API 调用使用 TLS,API Gateway 使用 HTTPS)。
最小权限 IAM:每个组件的权限都被精细收缩。Router Lambda 只能调用其对应的 AgentCore Runtime。
部署步骤
第一步:克隆仓库
git clone https://github.com/aws-samples/sample-host-openclaw-on-amazon-bedrock-agentcore.git
cd sample-host-openclaw-on-amazon-bedrock-agentcore
# 设置 AWS 账号和区域
export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
export CDK_DEFAULT_REGION=us-east-1 # 替换为你的目标区域
第二步:安装 Python 依赖
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
第三步:初始化 CDK
cdk bootstrap aws://$CDK_DEFAULT_ACCOUNT/$CDK_DEFAULT_REGION
第四步:部署所有 Stack
cdk synth
cdk deploy --all --require-approval never
第五步:构建 OpenClaw 容器镜像
# 登录 ECR
aws ecr get-login-password --region $CDK_DEFAULT_REGION | \
docker login --username AWS --password-stdin \
$CDK_DEFAULT_ACCOUNT.dkr.ecr.$CDK_DEFAULT_REGION.amazonaws.com
# 从 cdk.json 读取版本号,用于镜像 Tag
VERSION=$(python3 -c "import json; print(json.load(open('cdk.json'))['context']['image_version'])")
# 构建 ARM64 镜像(AgentCore Runtime 要求)
docker build --platform linux/arm64 -t openclaw-bridge:v${VERSION} bridge/
# 打 Tag 并推送
docker tag openclaw-bridge:v${VERSION} \
$CDK_DEFAULT_ACCOUNT.dkr.ecr.$CDK_DEFAULT_REGION.amazonaws.com/openclaw-bridge:v${VERSION}
docker push \
$CDK_DEFAULT_ACCOUNT.dkr.ecr.$CDK_DEFAULT_REGION.amazonaws.com/openclaw-bridge:v${VERSION}
第六步:配置飞书(Feishu)渠道
6.1 创建飞书自建应用
- 打开 飞书开放平台,登录后点击「创建企业自建应用」
- 填写应用名称(如
OpenClaw Bot)、描述,上传图标 - 进入应用详情页 → 凭证与基础信息,记录
App ID和App Secret
6.2 配置权限
进入应用的「权限管理」,开启以下权限后发布新版本使其生效:
| 权限标识 | 用途 |
|---|---|
im:message |
接收和发送消息 |
im:message.group_at_msg |
接收群组 @ 消息(如需群组使用) |
im:resource |
接收消息中的媒体资源 |
6.3 配置消息事件订阅
- 进入「事件订阅」页面
- 推荐开启「使用长连接接收事件」(WebSocket 模式,无需公网域名)
- 如使用 Webhook 模式:配置请求地址为
https://<your-api-gateway-url>/feishu/webhook
- 如使用 Webhook 模式:配置请求地址为
- 点击「添加事件」,搜索并添加
im.message.receive_v1(接收消息)
6.4 将凭证存入 Secrets Manager
aws secretsmanager create-secret \
--name openclaw/channels/feishu \
--secret-string '{
"app_id": "cli_xxxxxxxxxxxxxxxx",
"app_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}' \
--region $CDK_DEFAULT_REGION
如果 Secret 已存在,使用 update-secret 替代 create-secret:
aws secretsmanager update-secret \
--secret-id openclaw/channels/feishu \
--secret-string '{
"app_id": "cli_xxxxxxxxxxxxxxxx",
"app_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}' \
--region $CDK_DEFAULT_REGION
6.5 将自己加入用户白名单
运行 setup 脚本,将你的飞书 open_id 加入系统白名单:
# 先获取你的 open_id
# 方式一:在飞书开放平台 → 「用户与机器人」→「用户信息」中查询
# 方式二:通过 API 获取 tenant_access_token 后调用用户信息接口
# 获取 tenant_access_token
curl -X POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal \
-H "Content-Type: application/json" \
-d '{"app_id":"YOUR_APP_ID","app_secret":"YOUR_APP_SECRET"}'
# 执行白名单配置脚本(将 YOUR_OPEN_ID 替换为实际值,格式如 ou_xxxxxx)
./scripts/setup-feishu.sh YOUR_OPEN_ID
6.6 开始使用
在飞书中向 Bot 发送消息,即可开始使用。首次启动需要约 1-2 分钟初始化 AgentCore microVM,后续会话的启动速度会更快。如果遇到问题,可以查看 AgentCore 的运行日志进行排查。
总结
这套方案整体运行良好,但有几点值得注意:
💰 成本问题:该方案会部署一个全新的 VPC,其中包含 NAT Gateway,费用约为 32 USD/月——这比 Lightsail 上的 OpenClaw 实例还要贵。不过,该架构可以修改为复用现有 VPC,也可以在同一套部署下托管多个 Agent,从而分摊成本。(对于单实例场景,性价比确实不算突出。)
🔧 已知问题:在部署过程中遇到了若干需要手动修复的问题:
- 硬编码的 Region 配置
- DynamoDB API 废弃警告
- IAM Role 循环依赖问题
- 部分可用区(AZ)尚不支持 AgentCore,需要将 AZ 设为可配置项(令人意外的是,这类限制确实存在)
上述修复已提交 PR #30。
🤖 模型切换:默认使用 Claude,如果你的 AWS Credits 不覆盖 Claude 的费用,可以切换为 Amazon Nova Pro,效果同样相当不错。
想亲自试试?GitHub 仓库在这里 👈
更多推荐



所有评论(0)