策略执行
OpsKat 会根据资产和分组策略评估受支持的命令与数据操作,前提是操作来自 AI 智能体或适用的 opsctl 命令。策略决策为 Allow、Deny 或 NeedConfirm。应用内的数据控制台不走策略检查,详见查询编辑器。
策略覆盖范围取决于具体能力。内置类型覆盖 shell 命令、SQL、Redis、MongoDB、Kafka、Kubernetes、etcd 和对象存储。交互式 RDP 与 VNC 会话目前没有专用的放行/拦截策略类型。
策略类型
SSH 命令策略
控制哪些 shell 命令可以在 SSH 资产上执行。
- 允许列表 — 自动放行的命令模式(例如
ls *、cat *、systemctl status *) - 拒绝列表 — 始终阻止的命令模式(例如
rm -rf /*、shutdown *) - 分组 — 引用策略组,其规则会被合并
命令使用 shell 解析器(mvdan.cc/sh)进行精确匹配。* 通配符匹配任意参数。
SQL 查询策略
控制哪些 SQL 语句可以在数据库资产上执行。
- 允许类型 — 允许的语句类型(例如
SELECT、SHOW、DESCRIBE、EXPLAIN、USE) - 拒绝类型 — 阻止的语句类型(例如
DROP TABLE、DROP DATABASE、TRUNCATE、GRANT、REVOKE、CREATE USER、DROP USER、ALTER USER) - 拒绝标记 — 阻止的模式:
no_where_delete— 不带WHERE子句的DELETEno_where_update— 不带WHERE子句的UPDATEprepare—PREPARE语句call—CALL语句
- 分组 — 引用策略组
SQL 语句通过 TiDB Parser 进行分析,用于分类语句类型和检测危险模式。
Redis 策略
控制哪些 Redis 命令可以在 Redis 资产上执行。
- 允许列表 — 允许的命令模式(例如
GET、HGETALL、KEYS、INFO) - 拒绝列表 — 阻止的命令模式(例如
FLUSHDB、FLUSHALL、CONFIG SET *、SHUTDOWN *) - 分组 — 引用策略组
支持多词 Redis 命令(例如 CONFIG SET、ACL DELUSER)。
MongoDB 策略
按方法类型控制 MongoDB 操作。策略可以允许 find、aggregate 等读取操作,拒绝 dropDatabase、dropCollection 等破坏性操作,并将未匹配操作留给用户确认。
Kafka 策略
通过动作和资源模式控制 Kafka 操作,覆盖 AI 智能体与 opsctl 可触达的 Broker、Topic、消费者组、ACL、Schema 和消息操作;Kafka 面板本身不做策略检查。
Kubernetes 策略
控制 Kubernetes 资产的 kubectl 命令模式。新资产采用面向只读操作的默认规则,并同时配置危险命令拒绝规则。
etcd 策略
按动作和 Key 模式控制 etcd 操作,适用于 AI 智能体与 opsctl 的操作;内置 etcd 面板不做策略检查。
决策流程
当操作被评估时,策略引擎会产生以下三种决策之一:
| 决策 | 含义 |
|---|---|
| 允许(Allow) | 命令匹配了允许规则,立即执行。 |
| 拒绝(Deny) | 命令匹配了拒绝规则,被阻止。 |
| 需要确认(NeedConfirm) | 没有匹配的规则,提示用户允许或拒绝。 |
评估顺序为:
- 首先检查拒绝列表 — 如果匹配,操作立即被拒绝。
- 然后检查允许列表 — 如果匹配,操作被允许。
- 无匹配 — 决策为
NeedConfirm,需要用户审批。
策略组
策略组是可复用的规则集合,可以被多个资产和分组引用。
内置策略组
OpsKat 内置了以下策略组(不可修改):
SSH 命令组
| 组名 | 说明 |
|---|---|
| Linux Read-Only | 常用的 Linux 只读命令(ls、cat、head、tail、grep、ps、df、netstat 等) |
| Kubernetes Read-Only | Kubernetes 只读命令(kubectl get、kubectl describe、kubectl logs 等) |
| Docker Read-Only | Docker 只读命令(docker ps、docker images、docker logs 等) |
| Dangerous Command Deny | 阻止危险的系统命令(rm -rf /*、mkfs、dd、shutdown、reboot 等) |
SQL 查询组
| 组名 | 说明 |
|---|---|
| SQL Read-Only | 仅允许 SELECT、SHOW、DESCRIBE、EXPLAIN、USE |
| SQL Dangerous Deny | 阻止 DROP TABLE、DROP DATABASE、TRUNCATE、GRANT、REVOKE、用户管理,以及标记 no_where_delete、no_where_update、prepare |
Redis 组
| 组名 | 说明 |
|---|---|
| Redis Read-Only | 仅允许只读命令(GET、HGETALL、LRANGE、SMEMBERS、ZRANGE、INFO、KEYS 等) |
| Redis Dangerous Deny | 阻止 FLUSHDB、FLUSHALL、CONFIG SET、SHUTDOWN、DEBUG、SLAVEOF、ACL 修改等 |
自定义策略组
你可以创建自定义策略组:
- 打开策略组管理页面。
- 点击 创建,选择与资产操作相匹配的策略类型。
- 定义允许/拒绝规则。
- 保存策略组。
你也可以复制一个内置策略组来创建基于它的自定义策略组。
分配策略组
策略组通过资产或分组的策略配置进行分配。当资产或分组引用了一个策略组时,该策略组的规则会被合并到资产的有效策略中。
默认情况下,新建的 SSH 资产会引用 Linux Read-Only 和 Dangerous Command Deny 策略组。新建的数据库资产会引用 SQL Read-Only 和 SQL Dangerous Deny。新建的 Redis 资产会引用 Redis Read-Only 和 Redis Dangerous Deny。
策略组继承
资产树中的分组可以拥有自己的策略。评估资产的有效策略时:
- 加载资产自身的策略规则和引用的策略组。
- 同时考虑父分组的策略(如果有)。
- 所有引用的策略组被解析,其规则合并到最终的允许/拒绝列表中。
这使你可以在分组级别设置组织范围的规则,同时允许资产级别的自定义覆盖。
策略测试
OpsKat 为已注册的内置策略类型提供实时策略测试器。在策略编辑器中输入操作,即可查看它会被允许、拒绝还是需要确认,以及匹配了哪条规则。
使用 opsctl 管理策略
无需桌面 UI,也可以通过 CLI 管理同一套永久策略:
opsctl policy show web-01
opsctl policy allow web-01 -- 'systemctl status *'
opsctl policy deny web-01 -- 'rm -rf *'
opsctl policy rm web-01 2
show 会合并资产自身规则、继承的资产组规则、已挂载权限组和仍有效的 grant。资产目标上的 --type 只是断言;资产组自身没有资产类型,所以组目标必须指定:
opsctl policy allow --group production --type ssh -- 'uptime'
权限组也可在 CLI 中列出、查看、创建、复制、编辑、挂载和卸载:
opsctl policy group list --type command
opsctl policy group copy builtin:linux-readonly --name production-readonly
opsctl policy group allow 5 -- 'journalctl *'
opsctl policy attach web-01 5
内置组和扩展组只读,必须先复制成用户组再修改。policy show、policy group list、policy group show 不要求 TTY;所有策略写操作都要求真人在交互终端中明确确认。非交互 agent 会得到 NEEDS TTY,不能自行扩权。完整语法见 opsctl policy 参考。