全部产品
云市场

SQL变更

更新时间:2020-05-11 16:34:26

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

背景

新版的安全规则具备非常灵活的能力(DSL),可以根据业务需求自定义风险级别,让不同风险的变更,走不同的审批流程。比如您可以用最严格的形式限制SQL的执行,或者以最宽松的形式放行所有SQL。详情请参见安全规则DSL语法

前提条件

账号角色为管理员DBA安全管理员

基础配置项

SQL变更有两个基础配置项:

  • 数据变更默认审批模板:当风险审批规则中未配置不同风险对应的审批流程时,系统会采用此默认的审批模板。您可以通过切换审批模板来更改默认审批模板的审批流程。操作流程请参见修改默认审批模板操作步骤
  • 数据变更风险等级列表:风险等级主要作用于风险识别规则风险审批规则中,对工单中的变更进行风险评估。您可以在不同场景中设置不同的风险等级和审批流程。目前风险等级有四种:
    • LOW:低风险
    • MIDDLE:中风险
    • HIGH:高风险
    • HIGHEST:重大风险

检测点

当一个SQL变更的工单被提交时,系统会校验该工单是否符合各检测点的相关规则。只有在全部校验通过的情况下,该工单才会被放行。SQL变更中有如下4个检测点:

  • SQL执行规则:用于限制SQL的提交,只有允许的SQL语句才能提交工单执行。如未在此处启用任何规则,变更类SQL或命令均会被禁止执行。假设您希望仅允许DML语句对线上商品库做出修改时,可以增加如下安全规则。如何增加安全规则请参见新增规则操作步骤
    1. if
    2. @fac.env_type not in ['product']
    3. and
    4. @fac.sql_type in [ 'UPDATE','DELETE','INSERT']
    5. then
    6. @act.allow_submit
    7. end

    上面这段规则的含义是:如果数据库环境是线上,并且SQL语句是UPDATEDELECTINSERT类型,则允许提交工单。

  • 风险识别规则:当工单通过了SQL执行规则的校验,系统会继续对其进行风险识别规则的校验。风险识别规则用于识别被提交工单的风险等级,您可以根据数据库环境、SQL影响行数、SQL类型等条件自定义风险等级。

    注意:不同的安全规则会针对变更标记为不同的风险,最终DMS会结合所有的风险取最大值,例如3个中风险、5个低风险、1个高风险,则最终结果是高风险。

    假设您希望将线下环境定义为低风险,则可以增加如下风险识别规则。如何增加安全规则请参见新增规则操作步骤

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

    上面这段规则的含义是:如果环境非线上生产环境,则风险等级为低风险。

  • 风险审批规则:当风险识别规则识别出工单的风险等级以后,系统会根据风险审批规则中定义的规则对其作出相应处理。您可以在风险审批规则中自定义审批规则。

    注意:

    • 如果您的风险级别未在本检测点中命中任何规则,那么DMS将会采用基础配置项数据变更默认审批模板指定的审批流程。详情请参见设置审批流程
    • 测试环境默认为低风险,低风险默认为无审批。
  • 批量数据导入规则:仅适用于数据导入工单的校验。您可以使用安全规则模板库中提供的规则,也可以自定义新增规则。详情请参见新增规则操作步骤

因子和动作

  • 因子:因子是系统内置变量,可用来获取安全规则校验的上下文信息,如获取SQL类型、影响行数等。因子全部以@fac.开头,后接因子名称。每个模块的不同检测点均提供不同因子,SQL变更中提供因子的说明请参见下表:
    因子名 说明
    @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 识别为该风险的原因。
  • 动作:动作是满足if条件之后系统执行的行为,比如:禁止提交工单、选择工作流、允许执行、拒绝执行等,这些动作表达了安全规则的主要目的。动作全部以@act.开头,后接动作名称。每个模块的不同检测点均提供不同动作,SQL变更中提供动作的说明请参见下表:
    动作名 说明
    @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

模板库

安全规则提供了大量的规则模板可直接选择启用,也可以在模板基础上按照实际需求自行调整启用。SQL变更中的模板如下所示:

检测点 模板
SQL执行规则 允许所有DML在SQL控制台直接执行。
禁止所有DML在SQL控制台直接执行,必须以工单方式执行。
允许所有DDL在SQL控制台直接执行。
禁止所有DDL在SQL控制台直接执行,必须以工单方式执行。
允许所有DCL在SQL控制台直接执行。
禁止所有DCL在SQL控制台直接执行,必须以工单方式执行。
允许所有可编程对象在SQL控制台直接执行。
禁止所有可编程对象在SQL控制台直接执行,必须以工单方式执行。
允许UPDATE在SQL控制台直接执行。
禁止UPDATE在SQL控制台直接执行,必须以工单方式执行。
允许DELETE在SQL控制台直接执行。
禁止DELETE在SQL控制台直接执行,必须以工单方式执行。
允许INSERT在SQL控制台直接执行。
禁止INSERT在SQL控制台直接执行,必须以工单方式执行。
允许TRUNCATE在SQL控制台直接执行。
禁止TRUNCATE在SQL控制台直接执行,必须以工单方式执行。
允许CREATE_TABLE在SQL控制台直接执行。
禁止CREATE_TABLE在SQL控制台直接执行,必须以工单方式执行。
允许DROP_TABLE在SQL控制台直接执行。
禁止DROP_TABLE在SQL控制台直接执行,必须以工单方式执行。
允许ALTER_TABLE在SQL控制台直接执行。
禁止ALTER_TABLE在SQL控制台直接执行,必须以工单方式执行。
允许KILL在SQL控制台直接执行。
禁止KILL在SQL控制台直接执行,必须以工单方式执行。
风险识别规则 测试环境,默认为低风险。
生产环境,默认为中风险。
生产环境,跳过行数校验,默认为高风险。
生产环境,insert行数超过10万,默认为高风险。
生产环境,update/delete行数超过10万,默认为高风险。
生产环境,包含敏感列,默认为高风险。
生产环境,执行非DML语句,默认为高风险。
线上库批量导入,默认为中风险。
风险审批规则 低风险审批流程(无需审批)。
中风险审批流程。
高风险审批流程。
批量数据导入规则 允许批量导入插入语句。
允许批量导入指定工单的update语句(性能较好)。

修改默认审批模板操作步骤

  1. 登录数据管理DMS控制台
  2. 在页面顶部的导航栏中,单击系统管理 > 安全管理 > 安全规则
    新增安全规则
  3. 安全规则页签中,单击目标规则集右侧操作列中的编辑
  4. 详情页面左侧的导航栏中,单击SQL变更
  5. SQL变更页签中,单击基础配置项
  6. 单击数据变更默认审批模板右侧操作列的编辑
    修改默认审批模板
  7. 在弹出的编辑配置项页面中,单击切换审批模板
  8. 选择目标模板名称右侧操作列的选择

    说明:您也可以单击重置为免审批,使工单跳过审批步骤。

  9. 单击提交

新增规则操作步骤

  1. 登录数据管理DMS控制台
  2. 在页面顶部的导航栏中,单击系统管理 > 安全管理 > 安全规则
    新增安全规则
  3. 安全规则页签中,单击目标规则集右侧操作列中的编辑
  4. 详情页面左侧的导航栏中,单击SQL变更
  5. SQL变更页签中,单击操作右侧的新增规则
    新增安全规则1
  6. 新增规则 - SQL变更对话框中,设置如下参数:
    参数 说明
    检测点(必选) 选择需要增加规则的检测点。SQL变更中提供了4个检测点:
    • SQL执行规则
    • 风险识别规则
    • 风险审批规则
    • 批量数据导入规则
    模板库(可选) 安全规则模板库中提供了大量规则模板,选择了检测点以后,您可以从模板库中按需加载规则模板。可选的模板库列表请参见模板库
    规则名称(必填) 自定义规则名称。(如您在模板库中选择了规则模板,此处会自动填充。)
    规则DSL必填 填写规则DSL,DSL语法请参见安全规则DSL语法(如您在模板库中选择了规则模板,此处会自动填充。)
  7. 单击提交
  8. 新增的规则默认处于已禁用状态,单击规则右侧操作列中的启用
  9. 在弹出的对话框中单击确认