龍蝦OpenClaw部署安全配置指南:防止AI智能體泄露姓名手機號等敏感信息

龍蝦(OpenClaw)部署翻車實錄:你的AI智能體正在偷偷泄露姓名、公司和手機號
2026年3月,某創業團隊用龍蝦搭了個客戶自動回訪Agent。第二天,三條含真實姓名、公司名、手機號的對話記錄,出現在公開 GitHub Issue 里。
不是被黑,是三處配置沒動:日志開著 debug、輸入沒過濾、容器直接掛載了宿主機 /home 目錄。
龍蝦本身沒問題。問題出在“跑通就上線”的節奏里。它默認把用戶原始輸入、模型思考鏈(Thought)、工具調用參數全寫進 logs/;config.yaml 里 log_level: debug 沒關,enable_rag: true 卻沒配向量庫權限隔離。
以下是第一批真實泄露事件暴露出的 4 個必須堵上的安全缺口(已在 www.xmhny.cn 實測驗證):
? 缺口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而非rootls /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」——真正的生產級防線
跑得快是愛好,跑得穩才是本事。龍蝦不是玩具,是你的數字分身——先鎖好它的嘴,再教它說話。