跳到主要内容

策略执行

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 子句的 DELETE
    • no_where_update — 不带 WHERE 子句的 UPDATE
    • prepare — 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)没有匹配的规则,提示用户允许或拒绝。

评估顺序为:

  1. 首先检查拒绝列表 — 如果匹配,操作立即被拒绝。
  2. 然后检查允许列表 — 如果匹配,操作被允许。
  3. 无匹配 — 决策为 NeedConfirm,需要用户审批。

策略组​

策略组是可复用的规则集合,可以被多个资产和分组引用。

内置策略组​

OpsKat 内置了以下策略组(不可修改):

SSH 命令组​

组名说明
Linux Read-Only常用的 Linux 只读命令(ls、cat、head、tail、grep、ps、df、netstat 等)
Kubernetes Read-OnlyKubernetes 只读命令(kubectl get、kubectl describe、kubectl logs 等)
Docker Read-OnlyDocker 只读命令(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 修改等

自定义策略组​

你可以创建自定义策略组:

  1. 打开策略组管理页面。
  2. 点击 创建,选择与资产操作相匹配的策略类型。
  3. 定义允许/拒绝规则。
  4. 保存策略组。

你也可以复制一个内置策略组来创建基于它的自定义策略组。

分配策略组​

策略组通过资产或分组的策略配置进行分配。当资产或分组引用了一个策略组时,该策略组的规则会被合并到资产的有效策略中。

默认情况下,新建的 SSH 资产会引用 Linux Read-Only 和 Dangerous Command Deny 策略组。新建的数据库资产会引用 SQL Read-Only 和 SQL Dangerous Deny。新建的 Redis 资产会引用 Redis Read-Only 和 Redis Dangerous Deny。

策略组继承​

资产树中的分组可以拥有自己的策略。评估资产的有效策略时:

  1. 加载资产自身的策略规则和引用的策略组。
  2. 同时考虑父分组的策略(如果有)。
  3. 所有引用的策略组被解析,其规则合并到最终的允许/拒绝列表中。

这使你可以在分组级别设置组织范围的规则,同时允许资产级别的自定义覆盖。

策略测试​

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 参考。