自定义 L3 Skills¶
L3 审查 Agent 是 ClawSentry 三层决策模型的最深层。它通过多轮 LLM 工具调用对高风险事件进行深度安全审查。Skill 是 L3 Agent 的领域知识载体——每个 Skill 定义了一个特定安全领域的审查专长,包括触发条件、审查提示词和评估标准。
本文介绍如何理解内置 Skills,以及如何编写和加载自定义 Skills 来扩展 L3 Agent 的审查能力。
什么是 Skill¶
Skill 是以 YAML 文件定义的领域审查专长,由 SkillRegistry 加载和管理。每个 Skill 包含:
- 触发条件 (triggers) -- 决定何时激活该 Skill
- 系统提示词 (system_prompt) -- 提供给 LLM 的领域专家角色指令
- 评估标准 (evaluation_criteria) -- 定义该领域的安全评估维度
当一个高风险事件需要 L3 审查时,SkillRegistry 会根据事件特征(工具名称、风险提示、payload 内容)自动选择最匹配的 Skill,确保 LLM 以正确的领域专家身份进行审查。
Skill 选择算法¶
SkillRegistry 使用加权评分算法选择最佳 Skill:
| 匹配维度 | 权重 | 说明 |
|---|---|---|
risk_hints 匹配 |
每命中 1 个 +10 分 | 事件的 risk_hints 与 Skill triggers 的交集 |
tool_names 匹配 |
命中 +5 分 | 事件的 tool_name 是否在 Skill 的 tool_names 列表中 |
payload_patterns 匹配 |
每命中 1 个 +1 分 | payload 文本中是否包含 Skill 定义的模式子串 |
得分最高的 Skill 被选中。如果最高分 <= 0(无任何匹配),则 fallback 到 general-review Skill。得分相同时,priority 值更高的 Skill 优先。
内置 Skills¶
ClawSentry 内置 6 个安全审查 Skill,覆盖主要安全领域。它们位于 src/clawsentry/gateway/skills/ 目录:
shell-audit (优先级: 10)¶
Shell 命令安全审查,检测命令注入和权限升级。
| 属性 | 值 |
|---|---|
| 触发 risk_hints | privilege_escalation, sudo_usage, shell_injection, destructive_intent, shell_execution, destructive_pattern 等 |
| 触发 tool_names | bash, shell, exec, sudo, chmod, chown |
| 触发 payload_patterns | sudo, chmod 777, rm -rf, dd if=, curl \| sh, wget \| sh 等 |
审查重点:命令注入风险、权限升级(sudo/chmod 777/setuid)、破坏性命令、代码下载执行、数据外传。
credential-audit (优先级: 10)¶
凭证安全审查,审查涉及凭证、密钥、令牌的操作。
| 属性 | 值 |
|---|---|
| 触发 risk_hints | credential_access, credential_exfiltration, secret_access, key_access, env_access, config_access 等 |
| 触发 tool_names | read_file, bash, shell, exec |
| 触发 payload_patterns | password, secret, token, api_key, .pem, .ssh, .env, credentials.json 等 |
审查重点:读取敏感凭证文件、凭证写入不安全位置、凭证外传、最小权限原则违反。
code-review (优先级: 8)¶
代码安全审查,检测安全漏洞和恶意代码注入。
| 属性 | 值 |
|---|---|
| 触发 risk_hints | code_injection, supply_chain_attack, malicious_code |
| 触发 tool_names | write_file, edit_file, create_file, edit, write |
| 触发 payload_patterns | eval(, exec(, __import__, subprocess, os.system, pickle.loads, base64.b64decode 等 |
审查重点:后门/恶意代码注入、危险函数调用(eval/exec/pickle)、供应链攻击、硬编码凭证。
file-system-audit (优先级: 8)¶
文件系统安全审查,检测越权访问和敏感文件修改。
| 属性 | 值 |
|---|---|
| 触发 risk_hints | path_traversal, unauthorized_file_access, sensitive_file_write, sensitive_file_read |
| 触发 tool_names | read_file, write_file, edit_file, bash, shell |
| 触发 payload_patterns | /etc/, /root/, /usr/, ../, .ssh, authorized_keys, /proc/, sudoers, crontab 等 |
审查重点:路径遍历越权、系统敏感目录访问、SSH authorized_keys/sudoers 修改、cron 持久化。
network-audit (优先级: 8)¶
网络安全审查,检测数据外传和不安全连接。
| 属性 | 值 |
|---|---|
| 触发 risk_hints | data_exfiltration, network_exfiltration, suspicious_network |
| 触发 tool_names | http_request, fetch, web_fetch, bash, shell |
| 触发 payload_patterns | curl, wget, http://, https://, nc, ncat, socat, ftp://, scp, rsync, base64 等 |
审查重点:敏感数据外传、可疑域名/IP 连接、DNS 隧道、远程代码下载执行。
general-review (优先级: 0)¶
通用 Fallback 审查,当无其他 Skill 匹配时使用。
此 Skill 的 triggers 列表为空,不会通过匹配算法被选中,仅在所有其他 Skill 评分为 0 时作为兜底。
审查重点:行为与意图一致性、异常操作序列、安全最佳实践违反、整体风险评估。
general-review 是必需的
SkillRegistry 初始化时会验证 general-review Skill 必须存在。如果缺失,将抛出 ValueError 异常。
创建自定义 Skill¶
步骤 1: 创建 YAML 文件¶
在你选择的目录下创建一个 .yaml 文件。建议使用描述性的文件名:
步骤 2: 编写 Skill 定义¶
以下是一个完整的 数据库安全审查 Skill 示例:
name: database-audit
description: 审查数据库操作,检测未授权访问和数据泄露 / Audit database operations for unauthorized access and data leaks
enabled: true
priority: 9
triggers:
risk_hints:
- database_access
- sql_injection
- data_leak
- unauthorized_query
tool_names:
- bash
- shell
- exec
- psql
- mysql
- sqlite3
payload_patterns:
- SELECT
- INSERT
- UPDATE
- DELETE
- DROP TABLE
- ALTER TABLE
- GRANT
- REVOKE
- mysqldump
- pg_dump
- "INTO OUTFILE"
- LOAD DATA
system_prompt: |
你是一个数据库安全审查专家。分析 AI agent 的数据库操作,判断是否存在:
1. SQL 注入风险(用户输入未参数化,拼接 SQL 语句)
2. 未授权数据访问(查询敏感表:users, credentials, payments)
3. 数据外泄风险(SELECT INTO OUTFILE, mysqldump 到外部位置)
4. 破坏性 DDL 操作(DROP TABLE, TRUNCATE, ALTER 关键约束)
5. 权限升级(GRANT ALL, 修改 root 密码)
You are a database security auditor. Analyze the AI agent's database operations for:
1. SQL injection risks (unsanitized user input, string concatenation in queries)
2. Unauthorized data access (queries on sensitive tables: users, credentials, payments)
3. Data exfiltration risks (SELECT INTO OUTFILE, mysqldump to external locations)
4. Destructive DDL operations (DROP TABLE, TRUNCATE, ALTER critical constraints)
5. Privilege escalation (GRANT ALL, modifying root password)
Respond ONLY with JSON: {"risk_level": "low|medium|high|critical", "findings": ["..."], "confidence": 0.0}
evaluation_criteria:
- name: sql_injection
severity: critical
description: SQL 注入风险 / SQL injection risk
- name: unauthorized_data_access
severity: high
description: 未授权数据访问 / Unauthorized data access
- name: data_exfiltration
severity: critical
description: 数据外泄 / Data exfiltration via database tools
- name: destructive_ddl
severity: high
description: 破坏性 DDL 操作 / Destructive DDL operations
步骤 3: 设置环境变量¶
通过 AHP_SKILLS_DIR 环境变量指向包含自定义 Skill 文件的目录:
步骤 4: 重启 Gateway¶
启动时日志会显示加载的自定义 Skill 数量:
Skill Schema 完整参考¶
# ===== 必需字段 =====
name: string # Skill 的唯一标识符(不可与其他 Skill 重名)
description: string # Skill 的人类可读描述
system_prompt: string # LLM 的系统提示词(角色指令 + 审查要求 + 输出格式)
# ===== 可选字段 =====
enabled: bool # 是否启用此 Skill(默认 true)
priority: int # 优先级 0-10(默认 0,值越大优先级越高)
triggers: # 触发条件(所有子列表可选,为空则永不通过匹配被选中)
risk_hints: # 匹配事件 risk_hints(小写比较)
- string
tool_names: # 匹配事件 tool_name(小写比较)
- string
payload_patterns: # 匹配 payload 文本的子串(小写比较)
- string
evaluation_criteria: # 评估标准列表(可选但推荐)
- name: string # 标准名称
severity: string # 严重性: low / medium / high / critical
description: string # 标准描述
字段详细说明¶
name (必需)¶
Skill 的唯一标识符。在整个系统中(内置 + 自定义)不能重复。如果自定义 Skill 的 name 与内置 Skill 冲突,自定义 Skill 将被跳过并打印警告日志。
description (必需)¶
人类可读的描述文字。建议使用双语格式:中文 + 英文用 / 分隔。
system_prompt (必需)¶
提供给 LLM 的系统提示词。这是 Skill 最核心的部分,决定了 L3 Agent 以何种专家身份进行审查。
enabled¶
布尔值,控制是否启用此 Skill。设为 false 可以在不删除文件的情况下临时禁用。默认 true。
priority¶
整数,取值 0-10。当两个 Skill 对同一事件的匹配得分相同时,priority 更高的 Skill 被选中。内置 Skill 的 priority 分配:
shell-audit/credential-audit: 10(最高优先级,安全关键)code-review/file-system-audit/network-audit: 8general-review: 0(最低优先级,兜底)
triggers¶
包含三个子列表,全部使用小写比较:
risk_hints-- 事件的risk_hints字段与此列表取交集,每命中一个加 10 分tool_names-- 事件的tool_name是否在此列表中,命中加 5 分payload_patterns-- 事件 payload 的文本表示中是否包含此列表中的子串,每命中一个加 1 分
evaluation_criteria¶
定义该领域关注的安全评估维度。每个标准包含:
name-- 标准标识符(如sql_injection)severity-- 严重性等级,必须是low/medium/high/critical之一description-- 标准的人类可读描述
加载机制详解¶
SkillRegistry 初始化¶
Gateway 启动时,SkillRegistry 按以下顺序加载 Skills:
- 加载内置 Skills -- 从
src/clawsentry/gateway/skills/*.yaml目录加载所有 YAML 文件 - 验证
general-review存在 -- 缺失则抛出ValueError - 加载自定义 Skills -- 如果设置了
AHP_SKILLS_DIR环境变量,调用load_additional()加载外部 Skills
load_additional() 行为¶
- 遍历目录中所有
.yaml文件(按文件名排序) - 每个文件经过完整的 schema 验证
- 重名 Skill 被跳过 -- 不会覆盖内置 Skill,打印 WARNING 日志
- 返回成功加载的 Skill 数量
验证规则¶
加载每个 YAML 文件时,以下条件会导致 ValueError:
name为空description为空system_prompt为空triggers不是字典类型evaluation_criteria不是列表类型evaluation_criteria中的条目缺少必需字段或 severity 值不合法
编写有效的 system_prompt¶
system_prompt 是 Skill 的核心,直接决定 L3 审查的质量。以下是编写建议:
1. 明确角色身份¶
2. 列出具体审查要点¶
使用编号列表,每个要点聚焦一个风险类别:
3. 提供双语支持¶
内置 Skills 使用中英双语提示词,确保不同语言的 LLM 都能理解:
4. 严格约束输出格式¶
L3 Agent 需要解析 LLM 的输出,务必指定 JSON 格式:
system_prompt: |
...
Respond ONLY with JSON: {"risk_level": "low|medium|high|critical", "findings": ["..."], "confidence": 0.0}
5. 避免过于宽泛¶
不好的示例:"检查所有安全问题" -- 过于宽泛,LLM 容易分散注意力。
好的示例:"专注检查 SQL 注入、未授权数据访问和 DDL 破坏" -- 聚焦具体领域。
完整示例:Kubernetes 审查 Skill¶
name: kubernetes-audit
description: 审查 Kubernetes 集群操作,检测越权和破坏性变更 / Audit K8s cluster operations for privilege escalation and destructive changes
enabled: true
priority: 9
triggers:
risk_hints:
- cluster_admin
- pod_security_bypass
- namespace_deletion
tool_names:
- bash
- shell
- exec
- kubectl
payload_patterns:
- kubectl
- "delete namespace"
- "delete pod"
- "--privileged"
- hostNetwork
- hostPID
- securityContext
- clusterrole
- "create secret"
- "get secret"
system_prompt: |
你是一个 Kubernetes 安全审查专家。分析 AI agent 的集群操作,判断是否存在:
1. 权限升级(创建 ClusterRoleBinding、使用 cluster-admin)
2. Pod 安全策略绕过(privileged 容器、hostNetwork、hostPID)
3. 破坏性操作(删除 namespace、强制删除 Pod、清空 Deployment)
4. 敏感信息访问(get secret、describe configmap 含凭证)
5. 不安全的镜像来源(未知仓库、latest 标签、无签名验证)
You are a Kubernetes security auditor. Analyze the AI agent's cluster operations for:
1. Privilege escalation (creating ClusterRoleBinding, using cluster-admin)
2. Pod Security bypass (privileged containers, hostNetwork, hostPID)
3. Destructive operations (deleting namespaces, force-deleting pods)
4. Sensitive data access (get secrets, describe configmaps with credentials)
5. Insecure image sources (unknown registries, latest tags, no signature verification)
Respond ONLY with JSON: {"risk_level": "low|medium|high|critical", "findings": ["..."], "confidence": 0.0}
evaluation_criteria:
- name: privilege_escalation
severity: critical
description: 集群权限升级 / Cluster privilege escalation
- name: pod_security_bypass
severity: critical
description: Pod 安全策略绕过 / Pod security policy bypass
- name: destructive_cluster_ops
severity: high
description: 破坏性集群操作 / Destructive cluster operations
- name: secret_exposure
severity: high
description: Kubernetes Secret 暴露 / Kubernetes secret exposure