您可以在PolarDB控制台新增、启用或禁用黑名单规则,同时您还可以修改或删除已有的规则。本文将介绍黑名单规则的概念以及相关的操作步骤。

黑名单规则

Proxy提供的一种拦截能力,您可以通过配置黑名单规则来拦截指定类型的SQL语句或具体的SQL语句。

当前支持通过以下三种方式配置黑名单规则:
  • 固定规则模式:在控制台设置的常见的黑名单规则模式,每一种规则可以设定对某个账号以及某个集群生效。当前支持的常见规则请参见表 1
  • 用户自定义SQL参数化模式:该模式支持将您在数据库中执行的SQL语句中的所有变量进行参数化处理,并生成参数化模板记录到数据库中。当执行符合参数化模板的SQL语句时,Proxy会进行拦截。
  • 用户自定义具体SQL模式:该模式支持对您指定的具体的SQL语句进行拦截,而不将SQL语句中的变量进行参数化处理,其它任意参数的SQL语句不受该模式影响。

新增黑名单规则

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 在左侧菜单栏中单击配置与管理 > 安全管理
  5. SQL防火墙页签,单击页面左侧的新增
  6. 新建SQL防火墙规则对话框中,根据您需要新建的黑名单模式,设置对应的参数信息。
    • 固定规则模式
      1. 选择新建固定规则模式时,设置以下参数。
        表 1. 配置SQL防火墙规则
        参数名称 是否必填 描述
        基本信息 规则名称 SQL防火墙规则的名称。规则名称需满足如下要求:
        • 使用数字和英文字母组成。
        • 字符长度不能超过30个字符。
        规则描述 描述该规则的相关信息,便于后续管理。
        说明 字符长度不能超过64个字符。
        Endpoint 需要应用当前规则的Endpoint。
        规则配置 规则类型 需要新增的规则类型。选择黑名单规则
        当前模式 SQL防火墙规则的模式。固定为防护模式。即检测到符合黑名单中的SQL语句时,进行拦截。
        数据库账号名 需要应用当前规则的数据库账号名称。支持以下选项:
        • 所有数据库账号:表示当前规则对该集群中的所有数据库账号生效,此时右侧文本框无需填写任何内容。
        • 包含:表示当前规则仅对目标数据库账号生效,此时右侧文本框中必须填入一个或多个数据库账号名,多个账号之间使用英文逗号(,)分隔。
        • 不包含:表示当前规则会对该集群中,除目标数据库账号外的所有数据库账号生效,此时右侧文本框中必须填入一个或多个数据库账号名,多个账号之间使用英文逗号(,)分隔。
        说明 文本框中填入的数据库账号名称需满足如下格式中的任意一种:
        • 账号名。示例:user
        • 账号名@完整IP地址。示例:user@10.0.0.0
        拦截*号 是否拦截含有*号的SQL语句。取值:
        • 开启:拦截含有*号的SQL语句。
        • 关闭:不拦截含有*号的SQL语句。
        拦截特定类型 是否拦截特定类型的SQL语句。取值:
        • 开启:拦截特定类型的SQL语句。如果选择开启拦截特定类型,则至少选择其中一种类型。目前支持的类型有:
          • CREATE
          • DROP
          • ALTER
          • TRUNCATE
          • RENAME
          • INSERT
          • UPDATE
          • SELECT
          • DELETE
        • 关闭:不拦截特定类型的SQL语句。
        拦截无where条件 是否拦截无where条件的SQL语句。取值:
        • 开启:拦截指定类型且无where条件的SQL语句。如果选择开启拦截无where条件,则至少选择其中一种类型。目前支持的类型有:
          • UPDATE
          • SELECT
          • DELETE
        • 关闭:不拦截无where条件的SQL语句。
        说明 目前只针对SELECTUPDATEDELETE语句且语句中至少包含一个表名时生效。SELECT 1;这类语句不会被Proxy拦截。
        拦截特定列名 是否拦截含有特定列名的SQL语句。取值:
        • 开启:拦截含有特定列名的SQL语句。如果选择开启拦截特定列名,支持以下选项:
          • 所有:表示当前规则对该集群中的所有数据库列名生效,此时右侧文本框无需填写任何内容。
          • 包含:表示当前规则仅对该集群中指定的列名生效,此时右侧文本框中必须填入一个或多个列名,多个列名之间使用英文逗号(,)分隔。
          • 不包含:表示当前规则会对该集群中,除指定的列名外的所有数据库列名生效,此时右侧文本框中必须填入一个或多个列名,多个列名之间使用英文逗号(,)分隔。
        • 关闭:不拦截含有特定列名的SQL语句。
        拦截特定函数 是否拦截特定函数。取值:
        • 开启:拦截含有特定函数的SQL语句。如果选择开启拦截特定函数,支持以下选项:
          • 所有:表示当前规则对在该集群的数据库中执行的所有函数生效,此时右侧文本框无需填写任何内容。
          • 包含:表示当前规则仅对在该集群的数据库中执行的特定的函数生效,此时右侧文本框中必须填入一个或多个函数名,多个函数名之间使用英文逗号(,)分隔。
          • 不包含:表示当前规则会对在该集群的数据库中执行的,除指定的函数名外的所有函数生效,此时右侧文本框中必须填入一个或多个函数名,多个函数名之间使用英文逗号(,)分隔。
        • 关闭:不拦截含有特定函数的SQL语句。
        拦截特定函数引用特定列名 是否拦截含有特定函数且引用特定列名的SQL语句。取值:
        • 开启:拦截含有特定函数且引用特定列名的SQL语句。如果选择开启拦截特定函数引用特定列名,右侧文本框中必须填入一个或多个函数名列名。其中:
          • 如果函数名选择包含列名也选择包含时。表示该规则对该集群中使用特定函数,且引用特定列名的SQL语句生效。
          • 如果函数名选择包含列名选择不包含。表示该规则对该集群中使用特定函数,且引用指定列名之外的SQL语句生效。
          • 如果函数名选择不包含列名选择包含。表示该规则对该集群中使用特定函数之外的函数,且引用指定列名的SQL语句生效。
          • 如果函数名选择不包含列名也选择不包含。表示该规则对该集群中使用特定函数之外的函数,且引用指定列名之外的列名的SQL语句生效。
        • 关闭:不拦截含有特定函数且引用特定列名的SQL语句。
      2. 规则设置完成后,单击确认
    • 用户自定义SQL参数化模式
      1. 选择新建用户自定义SQL参数化模式时,设置您需要的参数信息,具体的参数信息请参见表 1
        说明 当您使用用户自定义SQL参数化模式时,可以不开启规则配置中的任何拦截规则。
      2. 规则设置完成后,单击确认
      3. 使用上述步骤中的数据库账号名连接指定的数据库Endpoint地址。通过在指定的SQL语句前添加HINT命令hint(/* store_to_blacklist */)来指定要拦截的SQL语句。例如,拦截SQL语句select id from sqlblack_test where id = 1; ,执行如下命令:
        /* store_to_blacklist */ select id from sqlblack_test where id = 1;
        参数化后的模板如下:
        select id from sqlblack_test where id = ?
        其中,表示任意值。
        等待5s,当使用该账号在该指定的集群中执行符合以上参数化模板的SQL语句时,会被Proxy进行拦截。拦截后显示的信息如下:
        ERROR 1141 (HY000): This SQL is rejected by SQL Firewall. Access denied for user 'xxx'@'x.x.x.x' to database 'xzh': This SQL is in blacklist bl_test.
        其中,bl_test为黑名单规则表。
      说明
      • 如果使用MySQL命令行,需要加-c选项,否则HINT命令不生效。
      • 被参数化后的SQL语句,需要等待5s才会生效。
    • 用户自定义具体SQL模式
      1. 选择新建用户自定义具体SQL模式时,设置您需要的参数信息,具体的参数信息请参见表 1
        说明 当您使用用户自定义具体SQL模式时,可以不开启规则配置中的任何拦截规则。
      2. 规则设置完成后,单击确认
      3. 使用上述步骤中的数据库账号名连接指定的数据库Endpoint地址。通过在指定的SQL语句前添加HINT命令hint(/* orginal_store_to_blacklist */)来指定要拦截的SQL语句。例如,拦截SQL语句update t set k = 2 where id = 2;
        /* orginal_store_to_blacklist */ update t set k = 2 where id = 2;
        等待5s,当使用该账号在该指定的集群中执行该具体的SQL语句update t set k = 2 where id = 2;时,会被Proxy进行拦截,而其他参数的SQL语句不受影响。拦截后显示的信息如下:
        ERROR 1141 (HY000): This SQL is rejected by SQL Firewall. Access denied for user 'xxx'@'x.x.x.x' to database 'xzh': This SQL is in blacklist bl_test.
        其中,bl_test为黑名单规则表。
      说明
      • 如果使用MySQL命令行,需要加-c选项,否则HINT命令不生效。
      • 被参数化后的SQL语句,需要等待5s才会生效。

启用或禁用黑名单规则

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 在左侧菜单栏中单击配置与管理 > 安全管理
  5. SQL防火墙页签,找到需要启用或禁用的规则,打开启/禁规则开关。
    启/禁规则
    说明 您也可以在规则列表中同时选中多个目标规则,然后单击列表下方的启用禁用按钮,批量启用或禁用规则。
  6. 在弹出的启用禁用对话框中,单击确定
说明 禁用指定模式创建的黑名单规则时,即使对应的黑名单规则被禁用,其对应数据库中的黑名单表中的SQL语句还是会被保留。如果对应的黑名单再次被启用,同账号的规则还是会生效。如果您想彻底禁用黑名单,可通过超级账号连接到对应集群的主节点,删除proxy_auditing.sql_list表中的SQL语句。删除SQL语句后,需要等待5s才会生效。且在进行删除操作时,请勿直接使用DROP命令删除表。

修改SQL黑名单规则

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 在左侧菜单栏中单击配置与管理 > 安全管理
  5. SQL防火墙页签,找到需要修改的规则,单击操作列的修改,在弹出的修改SQL防火墙规则对话框中,根据业务需要修改规则参数。规则参数的具体说明,请参见表 1
    修改SQL防火墙规则
    说明 修改规则时,不支持修改规则名称
  6. 规则修改完成后,单击确认
说明 用户自定义SQL参数化模式规则中的参数化SQL语句,以及用户自定义具体SQL模式规则中的具体SQL语句不支持在控制台修改,只能在数据库表中进行删除后重新添加。

删除黑名单规则

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 在左侧菜单栏中单击配置与管理 > 安全管理
  5. SQL防火墙页签,找到需要删除的规则,单击操作列的删除
    删除SQL防火墙规则
    说明 您也可以在规则列表中同时选中多个目标规则,然后单击列表下方的删除,批量删除规则。
  6. 在弹出的删除对话框中,单击确定
说明 删除指定模式创建的黑名单规则时,即使对应的黑名单规则被删除,其对应数据库中proxy_auditing.sql_list表中的SQL语句还是会被保留。如果您想彻底删除黑名单,可通过超级账号连接到对应集群的主节点,删除proxy_auditing.sql_list表中的SQL语句。删除SQL语句后,需要等待5s才会生效。且在进行删除操作时,请勿直接使用DROP命令删除表。

取消指定模式黑名单规则

  • 用户自定义SQL参数化模式黑名单规则。

    您可以通过以下两种方式取消用户自定义SQL参数化模式黑名单规则。

    • 通过启用或禁用黑名单规则删除黑名单规则取消用户自定义SQL参数化模式黑名单规则。
      说明 如果仅在控制台禁用该模式的黑名单规则,而没有在数据库中proxy_auditing.sql_list表里删除对应的参数化SQL语句,则在控制台再次启用对应账号的该黑名单规则时,该规则仍然会生效。
    • 通过您的超级账号连接到Endpoint主节点,删除proxy_auditing.sql_list表中相应的SQL语句。等待5s,该参数化SQL语句将不再被拦截。
      说明 在进行删除操作时,请勿直接使用DROP命令删除表。
  • 用户自定义具体SQL模式黑名单规则。

    您可以通过以下两种方式取消用户自定义具体SQL模式黑名单规则。

    • 通过启用或禁用黑名单规则删除黑名单规则取消用户自定义具体SQL模式黑名单规则。
      说明 如果仅在控制台禁用该模式的黑名单规则,而没有在数据库中proxy_auditing.org_sql_list表里删除对应的SQL语句,则在控制台再次启用对应账号的该黑名单规则时,该规则仍然会生效。
    • 通过您的超级账号连接到Endpoint主节点,删除proxy_auditing.org_sql_list表中相应的SQL语句。等待5s,该SQL语句将不再被拦截。
      说明 在进行删除操作时,请勿直接使用DROP命令删除表。