🚀 龙虾新手指南

龙虾OpenClaw部署安全配置指南:防止AI智能体泄露姓名手机号等敏感信息

发布时间:2026-07-15 分类: 龙虾新手指南
摘要:龙虾(OpenClaw)部署翻车实录:你的AI智能体正在偷偷泄露姓名、公司和手机号2026年3月,某创业团队用龙虾搭了个客户自动回访Agent。第二天,三条含真实姓名、公司名、手机号的对话记录,出现在公开 GitHub Issue 里。 不是被黑,是三处配置没动:日志开着 debug、输入没过滤、容器直接挂载了宿主机 /home 目录。龙虾本身没问题。问题出在“跑通就上线”的节奏里。它默认...

封面

龙虾(OpenClaw)部署翻车实录:你的AI智能体正在偷偷泄露姓名、公司和手机号

2026年3月,某创业团队用龙虾搭了个客户自动回访Agent。第二天,三条含真实姓名、公司名、手机号的对话记录,出现在公开 GitHub Issue 里。
不是被黑,是三处配置没动:日志开着 debug、输入没过滤、容器直接挂载了宿主机 /home 目录。

龙虾本身没问题。问题出在“跑通就上线”的节奏里。它默认把用户原始输入、模型思考链(Thought)、工具调用参数全写进 logs/config.yamllog_level: debug 没关,enable_rag: true 却没配向量库权限隔离。

以下是第一批真实泄露事件暴露出的 4 个必须堵上的安全缺口(已在 yitb.com 实测验证):

✅ 缺口1:环境未隔离 → 容器逃逸风险

原因:龙虾用 docker-compose up 启动,默认 docker-compose.yml 没设 user 字段,容器以 root 运行。插件一旦执行 os.system("ls /etc"),就能读宿主机敏感文件。
修复

# docker-compose.yml 修改段
services:
  openclaw:
    user: "1001:1001"  # 强制非root用户
    volumes:
      - ./data:/app/data:ro   # 只读挂载,删掉 - /home:/home 这类危险映射

✅ 缺口2:输入无过滤 → 敏感词直穿 Agent

原因prompt_engineering.py 默认不清洗输入。用户发“帮我查张三@xx公司+138**1234”,Agent 就原样塞进 RAG 检索和工具调用。
修复:在 main.py 入口加两行过滤:

import re
def sanitize_input(text):
    # 删除手机号、邮箱、中文姓名(简单版,生产请接正则库)
    text = re.sub(r'1[3-9]\d{9}', '[PHONE]', text)
    text = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '[EMAIL]', text)
    text = re.sub(r'[\u4e00-\u9fa5]{2,4}(?:先生|女士|老师)', '[NAME]', text)
    return text

# 在 agent.run() 前插入
user_input = sanitize_input(user_input)

✅ 缺口3:日志未脱敏 → debug 日志 = 泄露源

原因logging.basicConfig(level=logging.DEBUG) 会把 tool_args={"phone": "138****1234"} 完整打出来,而 logs/ 目录常被 Nginx 直接映射为静态资源。
修复

# 启动前关闭 debug,只留 warn
sed -i 's/logging\.basicConfig(level=logging\.DEBUG)/logging\.basicConfig(level=logging\.WARNING)/g' app/main.py
# 并禁用日志文件输出(改用 syslog 或专用日志服务)
echo "LOG_TO_FILE: false" >> config.yaml

配图

✅ 缺口4:权限未最小化 → 插件可读写任意路径

原因:龙虾插件(如 file_reader)默认有 os.listdir() 权限。用户传入 ../.env,插件就真去读。
修复:在 plugins/__init__.py 顶部加沙箱限制:

import os
# 限定所有插件只能访问 ./data/ 下文件
os.chdir("/app/data")  # 进程级根目录锁定
# 再用 pathlib 校验
from pathlib import Path
def safe_path(p):
    p = Path(p).resolve()
    if not str(p).startswith("/app/data"):
        raise PermissionError("Access denied outside /app/data")
    return p

✅ 验证是否生效

启动后,手动触发测试:

curl -X POST http://localhost:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"张三@阿里云+13812345678"}'

检查:

  • logs/ 里不再出现手机号/邮箱原文
  • docker ps --format "{{.ID}} {{.User}}" 显示 1001:1001 而非 root
  • ls /etc/shadow 在容器内返回 Permission denied

❓常见问题

Q:开了过滤,会不会影响 Agent 理解?
A:不会。脱敏只发生在输入层和日志层,模型看到的是 [PHONE],但工具调用时仍用原始值(需在工具内部做二次校验,见《AI Agent 安全加固实操》第3节)。

Q:为什么不用现成 WAF?
A:龙虾是本地 Agent,流量不经过网关。WAF 拦不住 curl localhost:8000/chat 这种直连——安全必须从进程内嵌开始。

下一步

  • 立即对照《龙虾本地部署指南》第5章“安全基线检查表”逐项打钩
  • 深度实践:《AI Agent 安全加固实操》手把手教你给插件加 seccomp 沙箱、用 Ollama 内置 RBAC 管模型调用
  • 进阶预警:下期拆解「如何用 eBPF 拦截龙虾进程的异常 syscalls」——真正的生产级防线

跑得快是爱好,跑得稳才是本事。龙虾不是玩具,是你的数字分身——先锁好它的嘴,再教它说话。

返回首页