OpenClaw部署之安全篇

0 阅读10分钟

写在前面

关于 OpenClaw 的部署、升级、接入飞书、接入大模型、多机器人配置……这些主题我之前已经写了好几篇。那几篇笔记的重点都是“怎么把它跑起来”“怎么配置好用”。

但在实际折腾的过程中,我发现一个被很多人忽略的问题:大家忙着跑通功能,往往把安全放在最后考虑,甚至根本不考虑。

我的服务器是阿里云的 2 核 2G,系统是 Alibaba Cloud Linux 3。作为一个 7x24 小时运行的服务,OpenClaw 暴露在公网上的时间越长,风险就越大。SSH 暴力破解、容器逃逸、密钥泄露……这些不是理论上的威胁,而是每天都在发生的事。

这篇笔记不是部署教程,也不是配置教程。它是我前面所有实操经验的安全篇总结——我会记录在部署和配置过程中,做了哪些安全加固、为什么这么做、以及这些配置到底在防什么。

如果你已经照着我的其他笔记把 OpenClaw 跑起来了,那这篇笔记就是你的“安全检查清单”。


一、服务器基础安全:先把门守好

OpenClaw 跑在服务器上,服务器的安全是一切的前提。这一步没做好,后面容器配置得再安全也没用。

1.1 改 SSH 端口 + 关密码登录

默认的 22 端口每天被扫描无数次。我做了这几件事:

配置项我的设置防什么
Port28345避开自动化扫描工具的默认端口探测
PermitRootLoginno让攻击者猜不到用户名(不是 root)
PasswordAuthenticationno只允许密钥登录,密码再强也可能被破
MaxAuthTries3输错几次就断掉,暴力破解没戏

1.2 阿里云安全组:云平台的防火墙

安全组在云平台边缘节点就把流量过滤掉了,比服务器上的 iptables 更安全——攻击者连你的服务器都摸不到。

原则我的做法
最小开放只开 SSH 端口(限定我的 IP)和 OpenClaw 端口(只绑本地)
默认拒绝没明确允许的流量,全部拦掉
分层防御安全组 + 容器安全 + 应用认证,三道防线

关键点:OpenClaw 的 Web 端口我只绑了 127.0.0.1,不暴露在公网。我通过本地代理访问,这样就算端口被扫到,外部也连不进来。


二、容器安全配置:把 OpenClaw 关进“笼子”

Docker 容器的默认权限其实偏大。如果容器被攻破,攻击者可能获得宿主机的部分权限。我的目标是:即使容器被入侵,攻击者也干不了什么

配置项我的设置安全作用
cap_drop: ALL移除所有 Linux Capabilities容器只有最小必要权限,无法执行高危系统操作
cap_add: DAC_OVERRIDE只保留文件读写权限不多给一个多余的权限
read_only: true根文件系统只读攻击者无法在容器内安装恶意软件或篡改系统文件
user: "1000:1000"非 root 用户运行容器内没有 root 权限
no-new-privileges:true禁止权限提升防止通过 setuid 等方式提权
ports: 127.0.0.1:38459:18789只绑定本地Web 服务不暴露公网

2.1 Docker 部署的独特安全优势:快速止损

如果容器真的被攻击了——比如你发现日志里有异常请求、某个 Agent 行为怪异——Docker 部署能让你秒级止损

# 立即暂停(保留现场,方便排查)
docker pause openclaw-gateway

# 或者直接停止
cd /opt/openclaw && docker compose down

对比传统部署方式:如果是直接跑在宿主机上的进程,被攻击后你需要 kill 进程、查端口、清理残留文件……一套操作下来至少几分钟。而 Docker 部署下,一条命令就能把整个服务隔离起来,给你争取宝贵的排查时间。

这也是我选择 Docker 部署的重要原因之一——不仅方便管理,更是为了在被攻击时能快速切断风险。

2.2 挂载目录的权限策略

这是我从一个坑里爬出来的教训。挂载目录的权限设计遵循该写的才给写,不该写的坚决只读

挂载目录权限为什么这么设
./config./workspace./agents:rwOpenClaw 需要写入会话状态和记忆,只读会报错
./credentials:ro飞书密钥,只读,防止被窃取或篡改
./skills./extensions:ro技能和插件代码,只读,防止恶意代码注入

踩坑记录:一开始我把 config 目录也设成了只读,结果容器一直报 EROFS。查了半天才发现 OpenClaw 需要在里面写会话状态。教训:安全配置要建立在理解程序运行机制的基础上,不能一刀切。


三、文件权限:防止“自己人”泄密

服务器上可能有多个用户(或者你以后会加其他人)。如果文件权限太松,别人就能看到你的密钥。

文件/目录权限防什么
.env600只有所有者能读写,其他用户看不到 API Key
credentials/700只有所有者能访问,飞书 Secret 不外泄
docker-compose.yml640同组可读,但不可写,防止配置被篡改
其他目录755正常访问即可
其他文件644正常读取即可

为什么是 1000:1000? 因为容器以 user: "1000:1000" 运行,宿主机文件属主也设为 1000:1000,容器才能正常读写。


四、技能安装:从可信源下载

技能本质上是下载代码并在你的环境中执行。如果下载慢,你可能去非官方渠道找,这就引入了风险。

我的做法:让小智从国内可信镜像站 http://mirror-cn.clawhub.com 安装。

在飞书里告诉小智:

"国内镜像站地址 mirror-cn.clawhub.com,用这个地址下载安装技能。帮我安装一下 [技能名称]"

安全收益

  • 镜像站对技能做了基础安全扫描
  • 避免从不明第三方源下载
  • 小智自动处理,减少人为操作失误

技能共享的权限考虑:技能默认安装在小智的工作区。为了让所有 Agent 都能用,我把它移到全局目录,并保持只读挂载,防止运行中的 Agent 篡改技能代码。


五、数据备份:最后一道防线

安全配置再完善,也可能有疏漏。定期备份是数据可恢复性的保障

备份内容重要性说明
workspace/⭐⭐⭐⭐⭐Agent 的记忆和规则,丢了要重新训练
config/credentials/⭐⭐⭐⭐⭐飞书密钥,泄露可轮换,但丢了麻烦
config/openclaw.json⭐⭐⭐⭐核心配置,丢了服务无法原样恢复
data/⭐⭐⭐⭐聊天记录,不可重建

备份策略:每周日凌晨自动备份,保留 28 天。这个窗口足够你发现数据异常并回滚。


六、安全验证:确认配置真的生效

# 验证非 root 运行
docker exec -it openclaw-gateway whoami
# 应输出:node

# 验证根文件系统只读
docker exec -it openclaw-gateway touch /test.txt
# 应报错:Read-only file system

# 验证端口绑定
docker compose ps
# 应显示:127.0.0.1:38459->18789/tcp

# 验证无权限错误
docker compose logs openclaw --tail 50 | grep -i "erofs\|permission"
# 应无输出

七、应急响应:被攻击了怎么办?

7.1 快速止损

# 方案1:暂停(最快,保留现场,方便排查)
docker pause openclaw-gateway

# 方案2:停止(彻底,释放资源)
cd /opt/openclaw && docker compose down

暂停 vs 停止的区别

操作效果适用场景
docker pause冻结进程,保留内存状态怀疑被攻击,需要保留现场分析
docker compose down停止容器,释放资源确定要重启,或需要彻底清理

7.2 排查问题

# 导出日志
docker compose logs openclaw --tail 500 > incident.log

# 检查可疑文件
ls -la /opt/openclaw/workspace/main/skills/
ls -la /opt/openclaw/skills/

# 检查配置文件是否被篡改
diff /opt/openclaw/config/openclaw.json /path/to/backup/openclaw.json

7.3 恢复服务

# 如果之前用了 pause,恢复
docker unpause openclaw-gateway

# 如果之前用了 down,启动
cd /opt/openclaw && docker compose up -d

⚠️ 重要提醒:重启不一定“干净”

docker compose down + up -d 能恢复容器运行状态,但不会清除被篡改的持久化数据

项目重启后是否恢复干净
内存中的恶意代码✅ 清除
正在进行的攻击连接✅ 断开
被篡改的配置文件❌ 如果文件被改了,还在
被注入的恶意技能❌ 如果技能代码被改了,还在
被盗取的密钥❌ 密钥文件还在

如果需要完全干净的恢复,建议从备份恢复:

# 1. 停止容器
cd /opt/openclaw && docker compose down

# 2. 从备份恢复配置文件
cp /path/to/clean-backup/config/openclaw.json config/

# 3. 清理可疑技能
rm -rf skills/<可疑技能名>

# 4. 重新启动
docker compose up -d

八、常见问题(安全视角)

Q1:2核2G服务器够用吗?

够用。我跑了 5-6 个 Agent,内存限制 1.5G,CPU 限制 1 核,很稳定。资源限制本身就是安全措施——防止某个 Agent 耗光资源导致拒绝服务。

Q2:装技能太慢有安全风险吗?

有。下载慢会诱使你去非官方渠道找资源,增加被植入后门的风险。我的解决方案是使用国内可信镜像站,让小智自动安装。

Q3:docker pause 和 docker stop 有什么区别?

命令效果恢复适用场景
docker pause冻结进程,保留内存状态docker unpause保留现场排查
docker compose down停止并删除容器docker compose up -d重启服务
docker stop停止容器,保留容器docker start临时停止

九、安全检查清单

检查项状态防什么
SSH 端口已改(非 22)避开自动化扫描
SSH 密码登录已关防止暴力破解
安全组配置了 IP 白名单网络层访问控制
容器以非 root 运行限制容器权限
容器根文件系统只读防止容器内篡改
OpenClaw 端口只绑本地服务不暴露公网
.env 权限 600防止 API Key 泄露
credentials/ 权限 700防止飞书 Secret 泄露
技能/插件目录只读挂载防止代码注入
定期备份已配置数据可恢复
应急响应命令已熟悉被攻击时快速止损

最后

回顾我写过的那些 OpenClaw 笔记——《阿里云2核2G服务器玩转OpenClaw:Docker安全部署完全指南》《OpenClaw Docker 部署极速升级指南》《OpenClaw 接入阿里云百炼大模型完整教程》《OpenClaw 接入飞书机器人完整教程》《OpenClaw 多飞书机器人完整配置教程》《亲测有效!OpenClaw卸载重装党狂喜!5步彻底干净》——它们讲的是怎么部署、怎么配置、怎么升级、怎么接入各种服务。

而这篇笔记,是前面所有经验的安全篇总结

我把自己在实操过程中对安全的思考和做法提炼出来,核心就是这几条:

  • 缩小攻击面:改 SSH 端口、关密码登录、安全组白名单、端口只绑本地
  • 限制容器权限:非 root 运行、只读根文件系统、最小 Capabilities
  • 保护敏感数据:密钥文件 600 权限、凭证目录 700、关键目录只读挂载
  • 防止代码注入:技能和插件目录只读、从可信源安装
  • 快速止损能力:Docker 部署,一条命令就能暂停或停止服务
  • 保证可恢复:定期备份、保留 28 天

这些配置大部分是一次性的,花半小时配好,后面就不用操心了。但如果你忽略了它们,风险会一直存在。

特别提一下应急响应docker pause 能让你在被攻击时秒级冻结容器、保留现场,从容排查;docker compose down 能快速重启服务。但记住,重启不会清除被篡改的持久化数据——真正的“干净”恢复,需要从备份还原。

安全没有绝对,但能多做一层就多做一层。希望这份笔记对你有帮助。

有问题欢迎交流,我会持续更新。