OpenClaw 安全路线图:给能动手的 AI 助手套上缰绳

2026-05-18 28 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:11 分钟

一个能直接在你机器上读写文件、执行命令、装插件、访问网络的 AI 助手——听起来像是一个随时可能失控的超级用户。OpenClaw 就是这样的助手,但它团队的态度很明确:强大不等于盲目,不等于无边界,更不等于无法审计。他们刚发布了安全路线图,把"让 AI 助手变得可防御"这件事拆成了多层机制,文件系统安全是第一仗。

为什么"能动手"的 AI 必须被约束

传统聊天型 AI 的风险边界很清晰:它只能输出文本,用户自己决定要不要执行。但 OpenClaw 这类助手直接操作真实环境,风险模型完全不同——一次错误的文件删除、一个越权的网络请求,后果立刻落地,没有"我先看看再说"的缓冲区。

更关键的是,AI 助手的决策链路对用户来说是个黑盒。用户看到的是"帮我整理项目目录"这个指令,助手内部可能经历了意图解析、工具选择、参数填充好几步,任何一步出错都可能把操作指向错误路径。所以安全机制不能只靠"提示词里说清楚",必须从系统层面硬性约束。

文件系统安全:第一道硬墙

路线图把文件系统安全放在首位,逻辑很简单:文件操作是最高频、也是最容易造成不可逆损害的动作。OpenClaw 的思路不是"禁止操作",而是"划定操作范围并强制审计"。

核心机制包括:

  • 路径白名单:助手只能在用户明确授权的目录树下读写,超出范围直接拒绝,不弹确认框。
  • 操作分级:读操作宽松,写操作严格,删除操作需要二次确认或独立审计通道。
  • 变更日志:每次文件操作都记录时间、路径、动作类型、触发指令,事后可追溯。

这套机制的实质是把"超级用户"降级为"受限角色"——能力还在,但行动边界被硬编码收窄。

多层防御:不止于文件系统

路线图明确提到安全是多层叠加的,不是单点依赖。除了文件系统,后续层级涉及:

  • 命令执行沙箱:助手执行的 shell 命令在受限环境中运行,网络访问、系统调用可被过滤。
  • 插件权限隔离:每个插件声明自己需要的权限范围,安装时用户审批,运行时强制遵守。
  • 网络请求管控:出站请求受域名和端口策略约束,防止助手成为数据外泄通道。
  • 审计与回滚:操作日志不可篡改,关键操作支持回滚到操作前状态。

每一层独立生效,即使某一层被绕过,下一层仍然拦截。这是经典的深度防御思路,用在 AI 助手场景里同样成立。

实践:给你的 AI 助手写一份安全策略

OpenClaw 的路线图是理念层面的,但如果你正在构建或部署类似的 AI 助手,现在就可以用具体的策略文件把约束落地。下面是一个可改造的安全策略配置示例,用 YAML 格式声明助手的行为边界:

# openclaw-security-policy.yaml
# 放在助手配置目录下,启动时自动加载

assistant:
  name: openclaw
  version: "0.9.0"

filesystem:
  # 允许读写的目录白名单,支持 glob 模式
  allow_paths:
    - "/home/user/projects/**"
    - "/tmp/openclaw-workspace/**"
  # 禁止触碰的路径,即使白名单内也会被排除
  deny_paths:
    - "/home/user/projects/.env"
    - "/home/user/projects/**/secrets.*"
  # 操作分级策略
  read:  auto        # 自动放行
  write: confirm     # 需用户确认
  delete: audit_log  # 记录审计日志后放行,高危目录需二次确认
  delete_high_risk:
    - "/home/user/projects/**/database/**"
    action: block    # 直接拒绝

command:
  # 允许执行的命令白名单
  allow_commands:
    - "ls"
    - "cat"
    - "grep"
    - "python3"
    - "git"
    - "npm"
  # 禁止执行的命令(即使白名单内也排除)
  deny_commands:
    - "rm -rf"
    - "sudo"
    - "chmod 777"
  # 沙箱参数
  sandbox:
    network: restricted    # 限制网络访问
    max_execution_time: 30 # 单次命令最长 30 秒
    max_memory_mb: 512     # 内存上限

network:
  # 出站请求允许的目标
  allow_domains:
    - "api.github.com"
    - "pypi.org"
    - "registry.npmjs.org"
  deny_domains:
    - "*"                  # 默认拒绝所有,白名单优先
  allow_ports:
    - 443
    - 80

plugin:
  # 每个插件必须声明权限,运行时强制遵守
  require_permission_declaration: true
  # 安装时需要用户审批
  install_requires_approval: true

audit:
  # 审计日志存储路径
  log_path: "/home/user/.openclaw/audit.jsonl"
  # 日志不可篡改(追加写入,文件权限 0440)
  immutable: true
  # 关键操作支持回滚
  rollback_enabled: true
  rollback_snapshot_path: "/home/user/.openclaw/snapshots"

使用方式——假设你有一个 Python 实现的策略加载器:

import yaml
from pathlib import Path
from fnmatch import fnmatch

def load_policy(path: str = "openclaw-security-policy.yaml") -> dict:
    with open(path) as f:
        return yaml.safe_load(f)

def check_file_access(policy: dict, filepath: str, action: str) -> bool:
    """检查文件操作是否被策略允许"""
    fs = policy.get("filesystem", {})
    allow = fs.get("allow_paths", [])
    deny = fs.get("deny_paths", [])

    # 先检查白名单
    in_allow = any(fnmatch(filepath, p) for p in allow)
    if not in_allow:
        print(f"[DENY] {filepath} 不在允许路径内")
        return False

    # 再检查黑名单(黑名单优先)
    in_deny = any(fnmatch(filepath, p) for p in deny)
    if in_deny:
        print(f"[DENY] {filepath} 在禁止路径内")
        return False

    # 检查高危删除
    if action == "delete":
        high_risk = fs.get("delete_high_risk", [])
        for rule in high_risk:
            if fnmatch(filepath, rule["path"] if "path" in rule else rule):
                if rule.get("action") == "block":
                    print(f"[BLOCK] {filepath} 是高危删除目标,直接拒绝")
                    return False

    # 检查操作分级
    action_policy = fs.get(action, "auto")
    if action_policy == "block":
        print(f"[BLOCK] {action} 操作被策略禁止")
        return False
    elif action_policy == "confirm":
        print(f"[CONFIRM] {action} {filepath} 需要用户确认")
        # 实际实现中这里会触发确认流程
        return True  # 假设用户已确认
    elif action_policy == "audit_log":
        print(f"[AUDIT] {action} {filepath} 已记录审计日志")
        return True

    return True

# 快速验证
policy = load_policy()
test_paths = [
    ("/home/user/projects/app/main.py", "read"),
    ("/home/user/projects/app/.env", "read"),
    ("/home/user/projects/app/database/old_data.db", "delete"),
    ("/etc/passwd", "read"),
]

for fp, act in test_paths:
    result = check_file_access(policy, fp, act)
    print(f"  → 结果: {'允许' if result else '拒绝'}\n")

运行后你会看到每条路径的判定过程和结果,这正是 OpenClaw 路线图里"可审计"的落地方式——每一次操作都有明确的判定逻辑和日志记录,而不是靠模型"自觉"。

部署前的检查清单

如果你打算用 OpenClaw 或自建类似助手,安全策略上线前建议逐项确认:

  • 路径白名单是否覆盖了助手真正需要的工作目录? 过窄会导致助手频繁被拒,过宽等于没有墙。建议从最小集开始,按需扩展。
  • 删除操作是否有独立审计通道? 文件删除不可逆,审计日志必须追加写入且不可篡改,最好配合快照回滚。
  • 命令白名单是否包含助手实际依赖的工具? 比如 gitpython3npm,漏掉会让助手功能受限,但 sudorm -rf 绝对不该放进去。
  • 网络策略是否堵住了数据外泄路径? 默认拒绝所有出站,只开放助手需要的 API 域名,是最安全的起点。
  • 插件权限声明是否强制? 不声明权限的插件直接拒绝加载,不给"先装再管"的机会。
  • 审计日志是否定期审查? 有日志不看等于没有。设定每周自动汇总异常操作(被拒绝的尝试、高危路径触碰),比人工翻日志有效。

OpenClaw 的路线图把一个容易被贴上"危险"标签的 AI 助手,重新定义为"可防御的系统"。思路不复杂:能力照给,边界硬设,操作可查。这对所有正在做 AI Agent 的人都是个值得抄的作业——别等出了事再补墙,在助手第一次触碰文件系统之前,策略文件就该就位。


相关推荐