AegisDB
EnglishGitHub
能力全览

控制台里的每一页,都通向同一条判定链

20 页控制台按角色收敛菜单,但它们共用同一套规则、同一条审计链。没有第二条执行通道。

为什么是 20 页

运维前台 10 个导航入口,管理后台 12 个,其中总览与审批待办 2 页两侧都挂 —— 去重后 20 页。

产品自己的文档少算了一页:管理后台的「在线表结构变更」在导航栏上的短名也叫「变更」,与「变更工单」的短名一字不差 —— 按短名去重,两页就并成了一页。

所以下面每一页都写全名。

10

运维前台

日常操作的人看到的那一侧:连上一台实例、把语句送进闸门、看它被拦在哪里、回来取结果。

总览与审批待办两侧导航都挂着,卡片列在这一栏,下一栏不再重复。

总览

/dashboard
给谁用
任何登录用户的落地页。从前登录后直接落到终端 —— 把唯一能改真实数据的地方当默认页。
解决什么
不用它,「几张待批、几张等我执行、哪扇免审批窗口开着」要分别翻四个页面。

不显然的约束

  • 网关状态卡对所有人显示全局数据。统计查询失败时返回 0 —— 「从没拦截过」与「统计挂了」在界面上是同一个数字。
  • 两张卡只取第一页前 5 条再过滤,所以「待我审批 0 条」可能只是本页里没有。

终端

/terminal
给谁用
值班 DBA 与运维排查或临时改数据的主界面:左树选实例与库,中间敲 SQL,右栏看判定上下文。
解决什么
不用它,得人手一份生产账号用本地客户端直连 —— 判定、审批、脱敏、审计全不存在。

不显然的约束

  • 结果集只回前 200 行,写死在网关里、不可配。要全量只能走数据导出。
  • 单条语句默认 30 秒超时,跑半小时的存储过程在这页跑不完 —— 这正是后台执行调度那一页存在的理由。

我的申请

/approvals
给谁用
在终端里被拦下、拿到工单号的人,回这里看批没批,然后按执行。
解决什么
因为批准不执行,没有这一页,变更会一直挂着,直到有人发现它根本没生效(ADR 0010)。

不显然的约束

  • 一张单只执行一次,占位发生在执行之前、失败也不退回:连接在语句中途断开时,命令跑没跑是不确定的。
  • 已批准、未执行的工单永不过期,超时清扫只处理还在等签字的那些 —— ADR 0010 把它记成明知的欠账。

审批待办

/inbox
给谁用
审批人一天里反复回来的那一页。前后台导航都挂了它,因为审批人不一定是平台管理员。
解决什么
不用它,被拦的命令靠私聊找人批,而审批人拿不到目标环境、风险等级、命中规则和完整 SQL。

不显然的约束

  • 审批链是并列的、任一人通过即生效,不是多级会签:审批池里每个人各建一个节点,一次通过就定死整张单。
  • 右侧链上打勾的名字不一定是真正签字的人 —— 界面盖的是序号最小的那个待办节点,真正的签字人在审计的操作者字段里。

变更工单

/changes
给谁用
要把一批 SQL 正式上到某套环境的人:提交发布单,回这页看它跑到哪、谁签了字。
解决什么
ADR 0005 的背景段说得最准:审计链能证明某条语句被谁执行了,证明不了它执行前有没有被审查过。

不显然的约束

  • 能不能起一张单,由能力矩阵里一个专门的维度按分层判,先于语句本身被判。
  • DML 与 DDL 不得同单,声明与内容不符当场拒、并点名第几条第几个动词。分类口径反直觉:SELECT 计 DML,GRANT 与 REVOKE 计 DDL。

脚本库

/scripts
给谁用
要把几百到几万条语句的迁移或初始化脚本放到目标库上跑的 DBA 与发布负责人。
解决什么
不用它,大脚本只能本地一把梭:没有逐条判级,也没有「审查的字节和执行的字节是同一份」这个保证。

不显然的约束

  • 扫描必须先选目标实例;实例或它的分层解析不出来就整个拒绝扫描 —— 拿空分层去扫,字典一行都匹配不到,每条语句都会被报成安全。
  • 同一份脚本在演练环境和在生产环境判级结果不同:按目标实例自己的分层判,不再按一个固定的扫描基准(ADR 0014)。

数据导出

/export
给谁用
需要把查询结果整份拿走的人:对账、迁移、监管调取。网关在后台跑,回这页下载加密压缩包。
解决什么
不用它,「导一份数据」的现实做法是 DBA 在跳板机上写成文件再丢进聊天工具:没有上限、没有脱敏、没有审批。

不显然的约束

  • 默认不走审批 —— 逐行脱敏后直接跑。只有勾了「包含敏感字段原值」的任务才停下来、按高危开一张审批单,批准后由 worker 跑。
  • 「只读」不等于「有权导」:任何不是放行的结论都直接拒,包括转审批。这是一次真实漏洞的修复 —— 曾经一个被拒绝查询数据的角色,能从导出页把整张表拉走。
  • 只接受单条只读查询;INTO OUTFILE 与 DUMPFILE 被单独显式挡掉 —— 它们保留 SELECT 做前导动词,动词白名单看不出来。

后台执行调度

/async-jobs
给谁用
要跑月结存储过程、大批量 DML、长事务 DDL 的 DBA。提交之后可以关掉页面。
解决什么
一条 30 到 60 分钟的过程在终端里必然撞上 30 秒语句超时;绕开网关用客户端守夜,判定、审计、脱敏就全没了。

不显然的约束

  • 它不返回结果集。丢一条 SELECT 进来,只会得到「影响 0 行」—— 这页不是后台查询,是后台执行。
  • 没有取消,谁都不能取消,包括管理员。后端没有中止接口,前端为此写了一行说明,而不是放一个点不动的按钮。

执行窗口(班车)

/exec-windows
给谁用
要在某个夜里连着跑几十条变更的人:提前申请一个时间段加一个具体的库。
解决什么
ADR 0015 的背景原话:一晚上几十条 DDL 逐条把审批人叫醒;或者提前改松、事后忘了改回去 —— 后者比没有审批更糟。

不显然的约束

  • 窗口只把转审批降为放行。拒绝永远是拒绝,风险等级也不降 —— 降级会让审计里这条 DROP 看起来像一次普通查询。它也不会放宽 MFA:那一条按分层的标志独立判,与判定结论无关。
  • 建和改都要走审批,等待期间一行都不放行;删除不走审批。改一下就回到待审批、旧审批单当场作废。
  • 窗口列表不设菜单闸、也不按用户收敛,任何登录用户都看得到全部窗口 —— 一扇免审批的门开在哪、什么时候开,不该只有管理员知道。

数据资产

/catalog
给谁用
有终端菜单的运维、DBA 与开发,在「我要改的那张表在哪台实例哪个库」时打开。
解决什么
不用它,跨实例的列名检索等于对每台生产实例的每张表问一遍列。

不显然的约束

  • 数据是本地缓存副本,不是实时库 —— 而且这个同步默认是关的,不去设置页打开,这页永远是空的。
  • 页面上的敏感字段标记是前端把脱敏规则套上去算出来的,后端字段里没有这一项 —— 两边口径一旦分叉,标出来的和真正被打码的会是两份清单。
12

管理后台

定义闸门本身的那一侧:实例、规则、流程、角色都在这里改,而改这些事本身也进审计链。

这一栏列 10 张卡 —— 导航里的总览与审批待办和运维前台是同一个路由,卡片在上一栏。

数据库配置

/connections
给谁用
平台管理员接入新集群、或调整某个环境的管控强度时。它是整个网关的唯一数据源头。
解决什么
不用它,得手工往表里插带明文口令的行,还要自己保证环境能解析到一个真实存在的分层。

不显然的约束

  • 分层持有规则,环境只决定实例归属,一个分层可以挂多个环境。所以「加一台香港生产集群」就是在生产分层下新建一个环境 —— 建好那一刻它就已经受完整管控。
  • 标签决定谁碰得到这台实例,而且用户级标签整体覆盖角色级标签,不是取并集;角色标签为空等于不受限制,不是「未配置」;授权读不出来就是拒绝。
  • 新建分层必须从现有分层克隆规则,没有「空分层」这个选项 —— 两处规则查表都把「查不到」读成放行,空分层会在有实例指过来的那一刻上线。

在线表结构变更

/osc
给谁用
DBA 在「一张两亿行的表要加索引,而且下面还挂着从库」这种场景下。
解决什么
ADR 0011 把原生 DDL 的代价列成一张表:中途不能限流、不能暂停、不能中止;主库跑 3 小时,从库就延迟 3 小时。

不显然的约束

  • 只支持 MySQL,而且只支持加索引与删索引两种动作。ADR 甚至主动劝退:表不大、从库延迟无所谓的话,原生 DDL 是更好的选择。
  • 这一页不看标签授权、不看分层、也不走审批,只看你是不是平台管理员。读接口连管理员都不要,任何登录用户可读。
  • 发起前把 14 条阻塞项一次报完。而从库延迟限流装不装得起来,取决于目标实例 —— 主库报不出从库、复制断着、心跳到不了,这次迁移照跑,但不限流。

高危规则

/risk-rules
给谁用
平台管理员在「要不要在演练环境上也拦 TRUNCATE」这类问题上做决定时。
解决什么
不用它,「哪些词在哪个环境算高危」要么写死在代码里随发版走,要么散在几个人的记忆里。

不显然的约束

  • 高危不等于禁止。三档的真实语义是:高风险与中风险都转审批,关掉则落回能力矩阵。真正会拒绝的只有两种情况 —— 能力矩阵判拒绝,以及闸门读不出来。
  • 字典扫的是抹掉字符串字面量之后的结构,不是原文 —— 一份只有 INSERT 的脚本,曾因为权限串里写着 system:menu:delete 被判成高危 DELETE。

SQL 审查规范

/sql-review
给谁用
DBA 与规范负责人决定「要不要把『建表必须有主键』提到卡住发布」时。
解决什么
不用它,这些规范只活在几份 Word 里,评审靠人肉看;被拦下的开发无从知道那是公司规定还是平台的偏好。

不显然的约束

  • 规范审查不参与执行判定。它在整个后端只有两个调用点:流水线的审查阶段,和这一页的手动自查;判定引擎里零引用 —— 服务注释的原话是,这条通道从不决定一条命令能不能跑。
  • 内置 87 条规则里,拦住发布的 55 条、记录并放行的 16 条、只是建议的 16 条。平台级别与规范分级是刻意分开的两列 —— 运维把某条规则降成告警,不等于把公司规范改了。
  • 认不出的方言不静默降级,直接报错 —— 曾经 PolarDB for PostgreSQL 因为标签里含 polardb 被套上 MySQL 规范,报出来的没有一条是真的。

数据治理

/gov
给谁用
平台管理员在上线前把手机号、身份证号这类字段登记成敏感字段时。
解决什么
ADR 0009 的核心论点:任何由前端负责打码的做法,等于把原值完整发到浏览器,再请它别显示。

不显然的约束

  • 它治理的只有一件事:按「表名 + 字段名」的脱敏规则。页面上第二块「临时授权」是空壳,界面自己渲染成「尚未接入」。
  • 规则是全局的:没有实例维度、没有环境维度、没有库维度。给某张表的某个字段建一条规则,所有引擎上的同名表一起生效;表名留空就是所有表。
  • 这道闸防的是「顺手看到」,不是防外泄:匹配是「宁可多打」的启发式,并且明确承认能被换列名的子查询绕过。真正的边界是不给这张表的访问权限。

角色与权限

/permissions
给谁用
平台管理员要给某个角色、某个分层松一格或紧一格时。持有权限菜单但不是管理员的人只能只读浏览。
解决什么
不用它,权限只存在于四张表里,只能直接改库,而且改完在审计链上不留痕迹。

不显然的约束

  • 能力矩阵是 8 个维度:查询数据 / 写入数据 / 结构变更 / 授权与账号 / 连接实例 / 审批工单 / 执行计划 / 发起发布单。其中 6 个参与逐语句判定 —— 连接实例与审批工单在判定层没有读者。
  • 三档是放行、转审批、拒绝,而且认不出的值一律读成拒绝。这是一次真实修复:从前映射对未知键返回最宽松的那一档,于是矩阵里写着「拒绝」的那一格,实际是放行。

上面这张「角色与权限」卡说的 8 个维度,在控制台上长这样 —— 同一个角色、同一行能力,在不同分层上判出不同的结论。

能力矩阵

角色:二线运维(L2)(固定展示)

PRODGLISTAGINGUATDEV
查询数据放行放行放行放行放行
写入数据转审批转审批转审批转审批放行
结构变更转审批转审批转审批转审批放行
授权与账号拦截拦截拦截拦截拦截
连接实例拦截拦截拦截拦截拦截
审批工单拦截拦截拦截拦截拦截
执行计划放行放行放行放行放行
发起发布单转审批转审批转审批转审批放行

控制台界面复刻 · 非截图

8 个维度控制台上都有,参与逐语句判定的只有 6 个 —— 连接实例、审批工单在判定层没有读者,改了它们不改变任何一条语句的裁决。

变更流程配置

/pipelines
给谁用
平台管理员定义「一次发布要过哪几关」。读只要流程菜单,写再加管理员。
解决什么
不用它就得手工插两张表,而阶段类型集合是封闭的:未知类型要么被跳过,要么让执行器崩。

不显然的约束

  • 七种阶段类型一种都不是必填,但不能一个都没有。没有执行阶段是合法的 —— 「审查加审批,最后人工交给 DBA」是真实工作流;零阶段非法,它会报成功却什么都没做。
  • 失败后的动作只有中止与继续,而执行阶段被强制成中止:失败后继续,意味着后面的校验与通知会宣告一次并未发生的变更成功。

用户管理

/users
给谁用
平台管理员在入职、离职、丢了验证器、临时封号时。
解决什么
不用它就得直接写三张表,而且改口令、换角色、停用这些特权变更不会进哈希链。

不显然的约束

  • 认证模型只有本地口令加 TOTP:没有 LDAP,也没有 SSO。「邀请」只建一行没有口令的账户,而登录只放行已激活的 —— 被邀请的人自己登不进来。
  • 管理员做不到的事:看不到别人的 TOTP 密钥;不能给服务账号设登录口令;不能停用自己;不能停用最后一位管理员。

审计日志

/audit
给谁用
审计员、DBA 负责人与管理员做跨人审查和链校验;其他持有审计菜单的人只看得见自己那几行。
解决什么
不用它就得直接查表,而且没有任何工具能重算哈希链 —— 校验是这一页唯一的入口。

不显然的约束

  • 记完整命令文本,不记任何结果集。记录的也不止命令:登录成功与失败、管理员改角色改用户改配置、发布单提交与人工放行、导出,以及模拟执行。
  • 校验覆盖「内容被改」和「行被从链中间抽掉」,覆盖不到「从链尾整段截断」—— 那需要把链尾锚到网关之外。负载还有多个版本,历史行一律不重算(ADR 0019)。
  • 审计行没有任何删除或编辑入口,也没有保留期清理,现状是永久保留。当然,能直连数据库的人仍然改得动行 —— 链的价值在于改了查得出来。

系统设置

/settings
给谁用
平台管理员。读只要设置菜单,所有写再加管理员。
解决什么
这些值直接改库不会进审计链;而且其中几项的爆炸半径远超「一个开关」。

不显然的约束

  • 爆炸半径最大的几项:空闲锁定到点是真登出,不是锁屏;强制 MFA 打开会把尚未绑定的人全部挡在生产之外;元数据同步打开,意味着这台网关周期性登录你的每一台生产实例。
  • 下拉存的是键、不是翻译后的标签 —— 曾经因为存标签,切过语言的人按一下保存,审批超时被放宽成自动升级、会话时长变成 8 小时,而界面上什么也没说。
  • 保存是两段式、全有或全无:先把每一条算成最终要写的样子,一个字都不写库,算完了再一次性写。界面上点的是一个保存,而半套里可能正好有一条是把某道闸关掉。

「项目」不是一页

控制台里没有「项目」这一页。它只存在于数据库配置页上的一个模态框里 —— 那里是唯一能新建、改名、删除项目的地方。

它的定位由代码亲口说死:组织维度,不是安全边界。判定层一概不看项目号。再叠一层能限制访问的「项目」,就是两套互相重叠的范围机制 —— 而错的那一层会以「本该看不见却看得见」的形式出现。

归属的单位是库,不是实例 —— 挂在实例上,等于逼着人按项目去拆实例。「未归属」是合法状态,不是待填。

「后台跑」是一个机制,但只有一个页面入口

后台 SQL 执行任务只有「后台执行调度」一个入口:终端页没有「转后台执行」按钮,脚本库和变更工单页也没有。

但「在后台跑」这件事横跨三处:数据导出有自己独立的 worker 池;变更工单与流程配置的执行阶段共用同一个单步执行上限;系统设置里一个滑块同时管着这两样。

三套队列彼此独立,重启时的处理也各不相同:后台执行与导出一律判失败;发布队列里排队中的重新入队、执行中的判失败、等待确认的不动。