OpenClaw权限失控致隐私泄露?5步加固方案含systemd沙箱配置详解

OpenClaw权限失控致隐私泄露:5步加固方案(含systemd沙箱配置)
这事儿怎么发生的?
先说个真事儿。2026年3月,一位"养虾人"在群里分享了自己的OpenClaw龙虾模型。本来是技术交流的好事,结果有人开始跟他的龙虾聊天,三言两语就套出了运行电脑的型号、系统环境,甚至通过模型间接推断出了主人的姓名和工作单位。
问题出在哪?OpenClaw默认配置下,模型进程拥有几乎完整的系统访问权限——能读文件、能访问网络、能执行命令。一旦有人通过提示词注入(prompt injection)诱导模型泄露环境信息,你的隐私就裸奔了。
这篇文章帮你堵上这个漏洞。5个步骤,从根源上限制AI工具的权限边界。
方案总览
| 步骤 | 目标 | 关键技术 |
|---|---|---|
| 1 | 隔离运行环境 | systemd沙箱 |
| 2 | 限制网络访问 | 网络命名空间 |
| 3 | 锁定文件权限 | 只读挂载+最小目录 |
| 4 | 屏蔽系统信息 | 环境变量清理 |
| 5 | 监控异常行为 | 日志审计 |
第1步:用systemd沙箱隔离进程
为什么需要这步? 默认情况下,OpenClaw进程和你的浏览器、编辑器跑在同一个用户空间里。沙箱的作用是给它画一个"围栏",让它只能在围栏内活动,碰不到围栏外的东西。
创建systemd服务文件:
sudo nano /etc/systemd/system/openclaw.service写入以下配置:
[Unit]
Description=OpenClaw AI Service (Sandboxed)
After=network.target
[Service]
Type=simple
User=openclaw
Group=openclaw
WorkingDirectory=/opt/openclaw
# 沙箱核心配置
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
NoNewPrivileges=yes
# 只允许访问必要目录
ReadWritePaths=/opt/openclaw/data
ReadOnlyPaths=/opt/openclaw/models
ExecStart=/opt/openclaw/bin/openclaw serve --config /opt/openclaw/config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target每行配置的含义:
ProtectSystem=strict:系统目录(/usr、/boot等)全部只读,龙虾改不了系统文件ProtectHome=yes:禁止访问/home下的用户目录,你的文档、桌面都安全PrivateTmp=yes:给进程一个独立的/tmp目录,看不到其他程序的临时文件PrivateDevices=yes:屏蔽/dev下的硬件设备,防止读取摄像头、U盘等NoNewPrivileges=yes:禁止进程通过setuid等方式提权
创建专用用户并启动:
# 创建专用用户,禁止登录
sudo useradd -r -s /usr/sbin/nologin openclaw
# 设置目录权限
sudo chown -R openclaw:openclaw /opt/openclaw
# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable --now openclaw.service验证沙箱是否生效:
# 以openclaw用户身份尝试读取敏感文件
sudo -u openclaw cat /etc/shadow
# 预期输出:Permission denied
# 查看服务状态
systemctl status openclaw.service
# 确认 Active: active (running)第2步:限制网络访问
为什么需要这步? 龙虾模型本身不需要访问外网。如果它被诱导发起网络请求(比如把你的信息发到某个服务器),后果不堪设想。
在service文件的[Service]段添加:
# 限制网络访问(仅允许本地通信)
RestrictAddressFamilies=AF_UNIX
IPAddressDeny=any
IPAddressAllow=127.0.0.0/8
# 或者完全断网(如果不需要API调用)
# PrivateNetwork=yes如果你的OpenClaw需要调用外部API(比如用Claude做推理),可以精确放行:
# 只允许访问特定域名
IPAddressDeny=any
IPAddressAllow=127.0.0.0/8
# 配合防火墙规则放行API地址配合iptables做白名单:
# 只允许openclaw用户访问Claude API
sudo iptables -A OUTPUT -m owner --uid-owner openclaw -d api.anthropic.com -j ACCEPT
sudo iptables -A OUTPUT -m owner --uid-owner openclaw -j DROP验证网络隔离:
sudo -u openclaw curl https://www.baidu.com
# 预期:连接失败或超时第3步:锁定文件权限
为什么需要这步? 即使有了沙箱,如果配置文件权限宽松,龙虾仍然可能读到不该读的东西。最小权限原则——只给它完成任务所需的最少文件访问权。
# 模型文件:只读
sudo chmod 444 /opt/openclaw/models/*
sudo chown root:openclaw /opt/openclaw/models
# 数据目录:可读写(用于存储对话记录)
sudo chmod 750 /opt/openclaw/data
sudo chown openclaw:openclaw /opt/openclaw/data
# 配置文件:只读,且不含敏感信息
sudo chmod 440 /opt/openclaw/config.yaml
sudo chown root:openclaw /opt/openclaw/config.yaml关键检查: 打开config.yaml,确保里面没有写死API密钥。用环境变量替代:
# 错误写法
api_key: sk-ant-xxxxxx
# 正确写法
api_key: ${OPENCLAW_API_KEY}然后在systemd服务中注入环境变量:

EnvironmentFile=/opt/openclaw/.env.env文件权限设为600:
sudo chmod 600 /opt/openclaw/.env
sudo chown root:root /opt/openclaw/.env第4步:屏蔽系统信息
为什么需要这步? 回到开头的案例——龙虾泄露了运行环境信息。即使进程被沙箱隔离,模型仍可能通过/proc文件系统或环境变量读取系统信息。
在service文件中添加:
# 隐藏系统信息
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
ProcSubset=pid
# 清理环境变量
Environment=HOSTNAME=
Environment=USER=openclaw
Environment=HOME=/opt/openclaw
Environment=PATH=/usr/bin:/bin验证系统信息是否被屏蔽:
# 检查/proc/cpuinfo是否可见
sudo -u openclaw cat /proc/cpuinfo
# 在ProcSubset=pid配置下,应返回空或错误
# 检查hostname
sudo -u openclaw hostname
# 应返回空或默认值,而非真实主机名第5步:监控异常行为
为什么需要这步? 加固不是一劳永逸的。有人可能发现新的绕过方式。日志监控帮你及时发现问题。
启用审计日志:
# 安装auditd
sudo apt install auditd
# 监控openclaw进程的文件访问
sudo auditctl -w /etc/ -p r -k openclaw_etc_access
sudo auditctl -w /home/ -p r -k openclaw_home_access
# 查看审计日志
sudo ausearch -k openclaw_etc_access在systemd中启用详细日志:
[Service]
# 记录所有系统调用
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources设置日志轮转,防止日志撑爆磁盘:
sudo nano /etc/logrotate.d/openclaw/var/log/openclaw/*.log {
daily
rotate 7
compress
missingok
notifempty
}完整配置汇总
把上面所有配置合并,最终的openclaw.service长这样:
[Unit]
Description=OpenClaw AI Service (Sandboxed)
After=network.target
[Service]
Type=simple
User=openclaw
Group=openclaw
WorkingDirectory=/opt/openclaw
# 沙箱隔离
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
NoNewPrivileges=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
ProcSubset=pid
# 网络限制
RestrictAddressFamilies=AF_UNIX
IPAddressDeny=any
IPAddressAllow=127.0.0.0/8
# 文件权限
ReadWritePaths=/opt/openclaw/data
ReadOnlyPaths=/opt/openclaw/models
# 环境清理
EnvironmentFile=/opt/openclaw/.env
Environment=HOSTNAME=
Environment=USER=openclaw
Environment=HOME=/opt/openclaw
# 系统调用限制
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources
ExecStart=/opt/openclaw/bin/openclaw serve --config /opt/openclaw/config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target常见问题
Q:加了沙箱后龙虾启动失败怎么办?
A:用journalctl -u openclaw.service -e查看错误日志。常见原因是目录权限不对,确保openclaw用户对data目录有写权限。
Q:完全断网后还能用吗?
A:如果用纯本地模型(如Ollama部署的Llama),完全断网没问题。如果需要调用API,用iptables精确放行目标地址。
Q:这套方案适用于其他AI工具吗?
A:完全适用。Dify、Coze本地版、任何本地部署的AI服务都可以套用这个systemd沙箱模板,只需修改ExecStart和目录路径。
下一步学习
- 想深入了解Linux安全机制:
man systemd.exec,里面有100+个安全相关的配置项 - 想部署本地大模型:参考Ollama本地部署教程
- 想了解提示词注入防御:参考AI安全防护指南
记住:AI工具本身是中性的,权限配置才是安全的关键。 花10分钟做好加固,省去10天处理泄露的麻烦。