SQL变更作为变更SQL执行的入口,需要极高的安全性。在工单提交、审批时,通过一系列的安全规则进行校验,只有满足规则校验的SQL,才能正常执行。

前提条件

系统角色为管理员DBA安全管理员

背景信息

数据管理DMS的安全规则具备非常灵活的DSL能力,可以根据业务需求自定义风险级别,让不同风险的变更,走不同的审批流程。例如,您可以用最严格的形式限制SQL的执行,或者以最宽松的形式放行所有SQL。

SQL变更模块检测点

检测点

说明

示例

基础配置项

基础配置项中包含5个默认规则:

  • 数据变更默认审批模板:数据变更类工单的默认审批模板ID为853,审批人为DBA。

    说明

    更改默认审批模板,请参见修改默认审批模板

  • 数据变更风险等级列表:风险等级可以对工单中的变更进行风险评估,您可以在不同场景中设置不同的风险等级和审批流程,主要用于风险识别规则风险审批规则检测点。

    默认风险等级有四种:

    • LOW:低风险

    • MIDDLE:中风险

    • HIGH:高风险

    • HIGHEST:重大风险

  • 数据导入是否支持选择极速模式:安全规则对应的数据库在创建数据导入工单时是否支持极速模式。更多信息,请参见数据导入

  • 普通数据变更是否允许跳过影响行数校验:如果开启该规则,则在普通数据变更工单的预检查阶段,DMS禁止工单跳过行数校验。反之允许跳过行数校验。

  • 普通数据变更禁止行数校验不一致的工单提交:如果开启该规则,行数校验不一致的普通数据变更工单将不允许被提交。反之允许提交工单。

-

SQL执行规则

用于限制在SQL窗口执行SQL语句,只有被允许的SQL语句才能通过SQL窗口执行。

说明

如果相互矛盾的两个规则同时被启用,系统会依照更严格的规则执行。

例如,以下两条规则同时被启用,系统将按第二种规则执行。

  • 允许所有DML在SQL控制台直接执行。

  • 禁止所有DML在SQL控制台直接执行,必须以工单方式执行。

仅允许DML语句对线上商品库做出修改,可以增加如下SQL执行规则:

假设。

if
  @fac.env_type not in ['product']
  and
  @fac.sql_type in [ 'UPDATE','DELETE','INSERT']
then
  @act.allow_submit
end

代码含义:如果数据库环境为非线上生产环境,并且SQL语句是UPDATEDELETEINSERT类型,则允许执行该SQL语句。

风险识别规则

用于识别被提交工单的风险等级,您可以根据数据库环境、SQL影响行数、SQL类型等条件自定义风险等级。

说明

不同的安全规则针对变更任务会标记不同的风险等级,最终取所有风险等级的最大值。

例如一个SQL变更任务有5个低风险、3个中风险和1个高风险,则最终该任务被认定为高风险。

将线下环境定义为低风险,可以增加如下风险识别规则:

if
  @fac.env_type not in ['product','pre']
then
  @act.mark_risk 'low' '低风险:线下环境'
end

代码含义:如果数据库环境为非线上生产环境,则风险等级为低风险。

风险审批规则

配置或自定义风险等级的审批规则。

如果数据库在风险识别规则检测点中未命中任何风险等级,那么数据库将采用基础配置项数据变更默认审批模板指定的审批流程。

测试环境默认为低风险等级,低风险默认无需审批。

批量数据导入规则

适用于数据导入工单的校验规则。

允许批量导入插入语句。

修改默认审批模板

  1. 登录数据管理DMS 5.0
  2. 在顶部菜单栏中,选择安全与规范 > 权限中心 > 权限模板

    说明

    若您使用的是极简模式的控制台,请单击控制台左上角的2023-01-28_15-57-17.png图标,选择全部功能 > 安全与规范 > 权限中心 > 权限模板

  3. 安全规则页签中,单击目标规则集操作列中的编辑

  4. 详情页面左侧的导航栏中,单击SQL变更模块。

  5. SQL变更模块中,单击基础配置项

  6. 数据变更默认审批模板操作列中,单击编辑

  7. 编辑配置项对话框中,单击切换审批模板

  8. 切换审批模板对话框中,单击目标模板操作中的选择,将默认审批模板切换为目标模板。

    说明

    如果工单不需要审批,您可以单击重置为免审批,使工单自动跳过审批步骤。

  9. 单击提交

SQL变更模块因子和动作

因子

因子是系统内置变量,可用来获取安全规则校验的上下文信息,如获取SQL类型、影响行数等。

  • 因子全部以@fac.开头,后接因子名称。

  • 每个模块的不同检测点会提供不同因子。

表 1. 因子列表

因子

说明

@fac.env_type

环境类型,值为环境标识,如DEVPRODUCT。更多环境类型请参见实例环境说明

@fac.sql_type

SQL脚本的类型,如UPDATEINSERT。详情请参见SQLConsole中对于SQL子类的描述。

@fac.detail_type

数据变更的种类:

  • COMMON:普通数据变更

  • CHUNK_DML:无锁数据变更

  • PROCEDURE:存储过程

  • CRON_CLEAR_DATA:定时清理表

  • BIG_FILE:批量数据导入

@fac.is_logic

是否为逻辑库。

@fac.extra_info

其他变更信息(暂无用途)。

@fac.is_ignore_affect_rows

是否跳过校验。

@fac.insert_rows

插入数据的影响行数。

@fac.update_delete_rows

更新数据的影响行数。

@fac.max_alter_table_size

修改表中,最大的表空间大小。

@fac.is_has_security_column

SQL脚本中是否包含敏感列。

@fac.security_column_list

SQL脚本中包含的敏感列列表。

@fac.risk_level

识别到的风险级别。

@fac.risk_reason

识别为该风险的原因。

@fac.table_name_list

SQL变更涉及的表名列表。使用示例如下:

if    
   'tb_order' in @fac.table_name_list or 'tb1_order' in @fac.table_name_list
then    
    @act.mark_risk 'high' '高风险:涉及订单表变更'
end

代码含义:若SQL变更涉及的表名为tb_order或tb1_order,则风险等级为高风险。

动作

动作是满足if条件之后系统执行的行为,例如:禁止提交工单、选择工作流、允许执行、拒绝执行等。

  • 动作全部以@act.开头,后接动作名称。

  • 每个模块的不同检测点会提供不同动作。

表 2. 动作列表

动作

说明

@act.allow_submit

允许提交工单执行。

@act.allow_execute_direct

允许直接在SQL控制台执行。

@act.forbid_execute

禁止执行。

@act.mark_risk

标记风险。用法:@act.mark_risk 'middle' '中风险:线上环境'

@act.do_not_approve

指定审批模板ID。详情请参见设置审批流程

@act.choose_approve_template

@act.choose_approve_template_with_reason