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

前提条件

用户角色为管理员DBA安全管理员

背景信息

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

SQL变更模块检测点

检测点说明示例
基础配置项

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

  • 数据变更默认审批模板:数据变更类工单的默认审批模板ID为853,审批人为DBA。
    说明 更改默认审批模板,请参见修改默认审批模板
  • 数据变更风险等级列表:风险等级可以对工单中的变更进行风险评估,您可以在不同场景中设置不同的风险等级和审批流程,主要用于风险识别规则风险审批规则检测点。

    默认风险等级有四种:

    • LOW:低风险
    • MIDDLE:中风险
    • HIGH:高风险
    • HIGHEST:重大风险
  • 数据导入是否支持选择极速模式:安全规则对应的数据库在创建数据导入工单时是否支持极速模式。更多信息,请参见数据导入
-
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. 在顶部菜单栏中,选择安全与规范 > 安全规则
  3. 安全规则页签中,单击目标规则集操作列中的编辑
  4. 详情页面左侧的导航栏中,单击SQL变更模块。
  5. SQL变更模块中,单击基础配置项
  6. 数据变更默认审批模板操作列中,单击编辑
  7. 编辑配置项对话框中,单击切换审批模板
  8. 切换审批模板对话框中,单击目标模板操作中的选择,将默认审批模板切换为目标模板。
    说明 如果工单不需要审批,您可以单击重置为免审批,使工单自动跳过审批步骤。
  9. 单击提交

SQL变更模块因子和动作

因子

因子是系统内置变量,可用来获取安全规则校验的上下文信息,如获取SQL类型、影响行数等。
  • 因子全部以@fac.开头,后接因子名称。
  • 每个模块的不同检测点会提供不同因子。
表 1. 因子列表
因子说明
@fac.env_type环境类型,值为环境标识,如DEVPRODUCT。更多环境类型请参见实例环境说明
@fac.sql_typeSQL脚本的类型,如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_columnSQL脚本中是否包含敏感列。
@fac.security_column_listSQL脚本中包含的敏感列列表。
@fac.risk_level识别到的风险级别。
@fac.risk_reason识别为该风险的原因。
@fac.table_name_listSQL变更涉及的表名列表。使用示例如下:
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