使用 MySQL 数据库审核

本主题介绍如何启用和使用 Cloud SQL for MySQL 审核插件。 如需查看概览,请参阅 MySQL 数据库审核。如需详细了解 MySQL 插件,请参阅 MySQL 插件加载

准备工作

数据访问审核日志

启用并配置数据访问审核日志。请参阅配置数据访问审核日志

审核用户所需的特权

您必须对审核存储过程具有 EXECUTE 权限才能运行它们。如果管理员需要更改审核人员对审核存储过程的访问权限,则应在 mysql 客户端中使用 GRANTREVOKE 命令。如需详细了解用户权限,请参阅 MySQL 用户权限。例如,如果管理员想要向名为 user 的审核人员授予访问权限以管理审核规则,他们可以使用以下语句授予权限:

CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT EXECUTE ON PROCEDURE mysql.cloudsql_list_audit_rule TO 'user'@'%';

如果该管理员以后想要撤消审核人员的访问权限,可以使用以下语句来撤消权限:

REVOKE ALL ON PROCEDURE mysql.cloudql_list_audit_rule FROM 'user'@'%';

默认情况下,使用 Cloud SQL 创建的用户(IAM 用户除外)是拥有除 FILESUPER 以外的所有权限(包括针对审核存储过程的所有权限)的管理员。IAM 数据库用户默认没有权限。

启用 Cloud SQL for MySQL 审核插件

Cloud SQL for MySQL 审核插件 (cloudsql_mysql_audit) 控制给定数据库实例的审核行为。要使用该插件,必须先在 Cloud SQL 实例上启用它。

要启用 cloudsql_mysql_audit 插件,请使用以下选项之一:

  • --cloudsql_mysql_audit=ON

    告知服务器启用插件。如果插件无法初始化,则服务器会在停用插件的情况下运行。

  • --cloudsql_mysql_audit=FORCE

    告知服务器启用插件,但如果插件初始化失败,则服务器无法启动。换句话说,此选项会强制服务器在启用或完全不启用插件的情况下运行。

  • --cloudsql_mysql_audit=FORCE_PLUS_PERMANENT

    与 FORCE 类似,但还可以防止插件在运行时卸载。如果用户尝试使用 UNINSTALL PLUGIN 卸载插件,则会出现错误。

插件激活状态显示在 INFORMATION_SCHEMA.PLUGINS 表的 PLUGIN_STATUS 列中。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开实例,然后点击修改
  3. 向下滚动至标志部分。
  4. 要在实例上设置先前未设置的标志,请点击添加标志,从下拉菜单中选择 cloudsql_mysql_audit,并将其值设置为 ON
  5. 点击保存以保存更改。
  6. 概览页的标志下确认更改。

gcloud

替换以下内容:

  • INSTANCE_NAME:您要设置标志的实例的名称。
gcloud sql instances patch INSTANCE_NAME \
           --database-flags cloudsql_mysql_audit=ON

此命令会覆盖之前设置的所有数据库标志。如需保留这些标志并添加新标志,请为您要在实例上设置的所有标志添加值;任何未明确添加的标志都会设置为默认值。对于不带值的标志,请指定标志名称并后接一个等号 (=)。

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

Cloud SQL for MySQL 审核插件设置

您可以使用以下标志调整 Cloud SQL for MySQL 审核插件的行为。可以在不重启数据库的情况下更改所有标志。如需了解如何管理标志,请参阅配置数据库标志

  • cloudsql_mysql_audit_data_masking_regex

    用于与 Perl 兼容正则表达式 (PCRE) 兼容的数据遮盖的正则表达式。

    默认情况下,在输出审核日志中,用户密码 (<psw>) 将替换为 *** 的密码掩码。

    正则表达式仅适用于使用 cloudsql_mysql_audit_data_masking_cmds 指定的命令类型的语句。使用 gcloud 时,您必须使用标志文件来设置具有复杂特殊字符的值。

    此标志的默认值:

    
    identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|
    \s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?[
    '|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)
    (?<!\\)['|"]
    
    

    请参阅以下示例。

    • 如果没有 cloudsql_mysql_audit_data_masking_regex,则描述 create user 命令的审核日志条目将如下所示:

      {..."cmd":"create_user","query":"create user user1@'localhost' identified
      by 'pw'"}
      
    • 如果默认值为 cloudsql_mysql_audit_data_masking_regex,则同一审核日志将更改为:

      {..."cmd":"create_user","query":"create user user1@'localhost' identified by
      '***'"}
      
    • 如果将 cloudsql_mysql_audit_data_masking_regex 设置为 (?<psw>.*),则 Cloud SQL 可以过滤所有查询内容。

      {..."cmd":"create_user","query":"***"}
      
  • cloudsql_mysql_audit_data_masking_cmds

    应用数据遮盖正则表达式 (cloudsql_mysql_audit_data_masking_regex) 的逗号分隔命令列表。设置空字符串 ("") 可停止过滤。使用 gcloud 时,您必须使用标志文件来设置逗号分隔列表。默认值包括带有以下密码子句的 MySQL 命令:

    create_user,alter_user,grant,update
    
  • cloudsql_mysql_audit_max_query_length

    控制在审核日志中记录的查询长度上限。如果您不需要查看查询的详细信息,可以使用 0,这意味着查询不会记录在审核日志中。这样可以节省日志的存储空间,从而降低费用。-1 表示无限制。默认值为 -1

  • cloudsql_mysql_audit_log_write_period

    日志写入周期,即写入者线程在达到您为此标志选项设置的毫秒数之后或者当缓冲区已满时,将缓冲区内容写入磁盘。如果将此标志选项设置为 0,则用户线程必须等待写入者线程发出的写入已完成的通知。默认值为 500(毫秒)。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开实例,然后点击修改
  3. 向下滚动至标志部分。
  4. 要在实例上设置先前未设置的标志,请点击添加标志,从下拉菜单中选择上述列表中的一个数据库标志,然后设置其值。
  5. 点击保存以保存更改。
  6. 概览页的标志下确认更改。

gcloud

替换以下内容:

  • INSTANCE_NAME:您要设置标志的实例的名称。
  • FLAG_NAME:配置标志的名称。
  • FLAG_VALUE:要用于标志的值。

        gcloud sql instances patch INSTANCE_NAME /
                   --database-flags FLAG_NAME=FLAG_VALUE
    

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

配置数据库审核

管理审核规则

Cloud SQL 使用一组存储过程来管理 Cloud SQL for MySQL 审核插件审核规则。有四个存储过程可用于创建、列出、更新和删除审核规则。

每个存储过程返回两个变量:@outval@outmsg。这些变量分别表示存储过程的状态代码和错误消息。您可以使用星号 (*) 作为通配符来搜索用户、主机、数据库和表名称。使用星号作为后缀和/或前缀。此外,您只能对主机使用通配符字符 %。您可以使用反引号 (`) 来指示应按字面量使用字符串。例如,`ta*ble` 按字面量进行匹配。

要使新更改生效,您应该使用输入参数 reload_mode=1 运行存储过程,或调用 mysql.cloudsql_reload_audit_rule(1) 以使新更改生效。

创建审核规则

您可以使用 mysql.cloudsql_create_audit_rule 创建新的审核规则。

如需在一次调用中创建审核规则并重新加载,请使用以下语句:

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',1, @outval,@outmsg);
SELECT @outval, @outmsg;

要创建规则并在单独的调用中重新加载,请使用以下语句:

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',0, @outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

上一条命令允许您创建多条规则,然后同时重新加载所有更改。

下表展示了上一条命令的输入和输出参数。

输入参数
名称 类型 说明 示例
user@hostuser@ip 字符串 要审核的数据库用户的英文逗号分隔列表。使用 user@hostuser@ip 格式。

user1@localhost
user1@*
user1@%
user@ip
db 字符串 要审核的数据库的英文逗号分隔列表。 db1,db2,db3*
obj 字符串 要审核的数据库对象的英文逗号分隔列表。 table1,table2,table3*
ops 字符串 要审核的数据库操作的英文逗号分隔列表。 select,delete,insert
op_result 字符串 审核成功 (S)、不成功 (U) 或者既有成功又有不成功 (B) 的操作。 SUB
reload_mode 整数 0 表示不重新加载规则,1 表示重新加载。 01
输出参数
名称 类型 说明 示例
@outval 整数 存储过程的状态代码。 0 表示成功,1 表示失败。
@outmsg 字符串 存储过程的错误消息。

审核规则具有以下限制:

限制
userdbobjops 的长度。 大小上限为 2048 个字符。
userdbobjops 的组合数量。 最多 1000 个组合。例如,审核 user1,user2db1, db2table1,table2select,delete 的审核规则会生成 2 x 2 x 2 x 2 = 16 个组合。

列出审核规则

审核人员可以使用 mysql.cloudsql_list_audit_rule 列出现有审核规则。

要列出审核规则 1 和 2,请使用以下命令:

CALL mysql.cloudsql_list_audit_rule('1,2',@outval,@outmsg);
SELECT @outval, @outmsg;

要列出所有审核规则,请执行以下操作:

CALL mysql.cloudsql_list_audit_rule('*',@outval,@outmsg);
SELECT @outval, @outmsg;

下表展示了上一条命令的输入和输出参数。

输入参数
名称 类型 说明 示例
rule_id 字符串 要移除的规则 ID 的英文逗号分隔列表。 1,2,3
输出参数
名称 类型 说明 示例
@outval 整数 存储过程的状态代码。 0 表示成功,1 表示失败。
@outmsg 字符串 存储过程的错误消息。

更新审核规则

您可以使用 mysql.cloudsql_update_audit_rule 更新现有审核规则。

如需在一次调用中更新审核规则并重新加载,请使用以下语句:

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',1,@outval,@outmsg);
SELECT @outval, @outmsg;

您可能希望在重新加载规则之前在一个会话中更新多个审核规则。您可以使用以下存储过程在一个步骤中更新规则,然后在后续步骤中重新加载这些规则。

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

下表展示了上一条命令的输入和输出参数。

输入参数
名称 类型 说明 示例
rule_id 整数 要更新的规则的 ID。 5
user@host 字符串 要审核的数据库用户的英文逗号分隔列表。请使用格式 user@host。

user1@localhost,user1@*
user1@%
db 字符串 要审核的数据库的英文逗号分隔列表。 db1,db2,db3*
obj 字符串 要审核的数据库对象的英文逗号分隔列表。 table1,table2,table3*
ops 字符串 要审核的数据库操作的英文逗号分隔列表。 SELECT,DELETE,INSERT
op_result 字符串 审核成功 (S)、不成功 (U) 或者既有成功又有不成功 (B) 的操作。 SUB
reload_mode 整数 0 表示不重新加载规则,1 表示重新加载。 01
输出参数
名称 类型 说明 示例
@outval 整数 存储过程的状态代码。 0 表示成功,1 表示失败。
@outmsg 字符串 存储过程的错误消息。

审核规则具有以下限制:

限制
userdbobjops 的长度。 大小上限为 2048 个字符。
userdbobjops 的组合数量。 最多 1000 个组合。例如,审核 user1,user2db1, db2table1,table2select,delete 的审核规则会生成 2 x 2 x 2 x 2 = 16 个组合。

删除审核规则

您可以使用 mysql.cloudsql_delete_audit_rule 删除现有审核规则。

如需在一次调用中删除审核规则并重新加载,请使用以下语句:

CALL mysql.cloudsql_delete_audit_rule('1,2',1,@outval,@outmsg);
SELECT @outval, @outmsg;

如需删除规则并在单独的调用中重新加载,请使用以下语句:

CALL mysql.cloudsql_delete_audit_rule('1,2',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL cloudsql_reload_audit_rule(1);

上一条命令允许您删除多条规则,然后同时重新加载所有更改。

下表展示了上一条命令的输入和输出参数。

输入参数
名称 类型 说明 示例
rule_id 字符串 要移除的规则 ID 的英文逗号分隔列表。 1,2,3
reload_mode 整数 0 表示不重新加载规则,1 表示重新加载。 01
输出参数
名称 类型 说明 示例
@outval 整数 存储过程的状态代码。 0 表示成功,1 表示失败。
@outmsg 字符串 存储过程的错误消息。

操作组

Cloud SQL for MySQL 审核插件支持在规则定义中使用操作组来审核活动的集合。您可以使用以下操作组来简化审核规则创建。

操作组 包含的操作
dql select
dml delete,delete_multi, insert, insert_select, load, replace, replace_select, truncate, update, update_multi,
ddl alter_db, alter_event, alter_function, alter_procedure, alter_table, alter_user, create_db, create_event, create_function, create_index, create_procedure, create_table, create_trigger, create_user, create_udf, create_view, drop_db, drop_event, drop_function, drop_index, drop_procedure, drop_table, drop_trigger, drop_user, drop_view, rename_table, rename_user
dcl grant, revoke, revoke_all
show show_binlog_events, show_create_func, show_create_proc, show_procedure_code, show_create_event, show_create_trigger, show_events, show_function_code, show_grants, show_relaylog_events, show_triggers,
call call_procedure

查看 Cloud SQL 数据库审核日志

在 Cloud Logging 中查看数据库审核日志记录

要查看数据库审核日志,首先请确保您已为项目启用数据访问审核日志。针对给定实例生成的 MySQL 审核日志将作为数据访问审核日志发送到 Cloud Logging。您可以通过日志浏览器应用查看生成的 MySQL 数据库审核日志。

在日志浏览器中,您可以使用以下查询,通过高级过滤条件界面显示给定 Cloud SQL 项目的所有 MySQL 数据库审核日志,从而查看 MySQL 审核日志。

替换以下内容:

  • PROJECT_NAME:您要检查其审核日志的项目的名称。
    resource.type="cloudsql_database"
    logName="projects/PROJECT_NAME/logs/cloudaudit.googleapis.com%2Fdata_access"
    protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"

或者,您可以选择 cloudaudit.googleapis.com/data_access 日志过滤条件。

审核日志格式

审核日志包含以下字段。

字段名称 说明
msgType 表示审核日志消息类型的字符串。msgType 的唯一值为 activity
status 操作的状态,可以是 successunsuccessful
date 指示生成审核事件的时间戳。
threadId MySQL 线程的 ID。
queryId MySQL 查询的 ID。
user 表示客户端发送的用户名的字符串。这可能与 privUser 值不同。
privUser 表示服务器对客户端进行身份验证的用户的字符串。这是服务器用于权限检查的用户名。它可能与用户值不同。
gcpIamAccount 表示 GCP IAM 账号或服务账号的字符串。
ip 表示客户端 IP 地址的字符串。
host 表示客户端主机名的字符串。
errCode 失败操作的 MySQL 错误代码。请参阅 MySQL 服务器错误消息参考文档
cmd 指明要使用的 SQL 语句(操作类型)的字符串。例如 INSERTUPDATEDELETE
objects 审核对象。通常是表。此字段包含对象的以下信息:

db 表示默认数据库名称的字符串。
name 表示对象名称的字符串。通常是表名称。
objType 表示对象类型的字符串。 通常为 TABLE
query SQL 语句(直接执行)。
chunkCount 如果审核日志查询大小超过 cloudsql_mysql_audit_event_split_threshold (90k),则为分块总数。
chunkIndex 数据块的索引。chunk_index 从 1 开始。
@type 类型始终为 type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry

以下是审核日志条目示例。

{
"msgType":"activity",
"status":"unsuccessful",
"date":"2021-11-11T06:16:16.163603Z",
"threadId":"750",
"queryId":"26763",
"user":"root",
"priv_user":"root",
"ip":"",
"host":"localhost",
"errCode":"1146",
"cmd":"select",
"objects":[{"db":"test","name":"t4","obj_type":"TABLE"}],
"query":"select * from test.t4",
"chunkCount":2,
"chunkIndex":2,
"@type":"type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"
}

停用数据库审核

要停用 Cloud SQL for MySQL 审核插件,您可以将数据库标志 cloudsql_mysql_audit 设置为 OFF 或移除该标志。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开实例,然后点击修改
  3. 向下滚动至标志部分。
  4. 要在实例上设置先前未设置的标志,请点击添加标志,从下拉菜单中选择 cloudsql_mysql_audit,并将其值设置为 OFF
  5. 点击保存以保存更改。
  6. 概览页的标志下确认更改。

gcloud

替换以下内容:

  • INSTANCE_NAME:您要设置标志的实例的名称。

    gcloud sql instances patch INSTANCE_NAME \
               --database-flags cloudsql_mysql_audit=OFF
    

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

审核规则示例

  1. 审核所有用户的所有活动:

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','B',1,@outval,@outmsg);
    
  2. 审核单个用户 user1 的所有活动:

    CALL mysql.cloudsql_create_audit_rule('user1@*','*','*','*','B',1,@outval,@outmsg);
    
  3. 审核所有以 user 开头的用户的所有活动:

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','B',1, @outval,@outmsg);
    
  4. 审核所有用户的所有 DML 操作:

    CALL mysql.cloudsql_create_audit_rule('*','*','*','dml','B',1,@outval,@outmsg);
    
  5. 审核特殊数据库 db1 的选择操作:

    CALL mysql.cloudsql_create_audit_rule('*','db1','*','select','B',1,@outval,@outmsg);
    
  6. 审核具有特殊字符 db~1 的数据库的所有活动:

    CALL mysql.cloudsql_create_audit_rule('*','`db~1`','*','*','B',1,@outval,@outmsg);
    
  7. 审核表 db1.table1 的选择和删除操作:

    CALL mysql.cloudsql_create_audit_rule('*','db1','table1','select,delete','B',1,@outval,@outmsg);
    
  8. 审核所有成功的操作:

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','S',1,@outval,@outmsg);
    
  9. 不审核所有以 user 开头的用户的所有活动:

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','E',1, @outval,@outmsg);
    

问题排查

问题 问题排查
我在调用以下命令时看不到 cloudsql_mysql_audit

SHOW (global) variables
cloudsql_mysql_audit 是插件的名称。要检查是否处于活跃状态,请使用以下命令:


SHOW PLUGINS

然后检查 status 条目。
为什么我启用 cloudsql_mysql_audit 后看不到 mysql 审核日志? 您必须启用数据访问审核日志(如配置数据访问审核日志中所述)。此外,Cloud SQL for MySQL 审核插件需要审核规则来审核所需的审核日志。将存储过程与 `reload_mode=1` 结合使用来创建审核规则,或者运行以下命令或重启数据库以使新添加的审核规则发挥作用:


CALL mysql.cloudsql_reload_audit_rule(1)
更新数据库标志时出现以下错误:

错误 1193:未知系统变量 'cloudsql_mysql_audit_xxx'
cloudsql_mysql_audit_xxx 标志仅在审核插件处于活跃状态时有效。从实例中移除任何现有 cloudsql_mysql_audit_xxx 标志,然后在更新 cloudsql_mysql_audit_xxx 标志之前使用以下命令启用插件:


cloudsql_mysql_audit=ON
即使我没有设置任何审核规则,也可以查看生成的审核日志。 默认情况下,系统会记录对审核规则表(mysql.audit_log_rulesmysql.audit_log_rules_expanded)和审核存储过程 (mysql.cloudsql_xxxx_audit_rule) 的更改。
对主实例进行更改后,我无法在副本实例上看到审核日志。 系统不会记录复制线程和崩溃恢复线程。 Cloud SQL 会审核主实例上的活动,但不会审核副本实例上的活动。
我尝试使用以下命令设置逗号分隔列表中的值,但不起作用。

gcloud instances patch --database-flags
如果使用 gcloud 命令指定以英文逗号分隔的标志值列表,请使用 --flags-file 参数。首先,您需要创建一个包含以下信息的文件:


--database-flags:
general_log: OFF
cloudsql_mysql_audit_max_query_length: '20'
cloudsql_mysql_audit_data_masking_cmds: select,update

然后运行以下命令:


gcloud sql instances patch --flags-file=flagfile
以下命令会返回错误:

CALL mysql.cloudsql_create_canonical_rules
这是预期表现。mysql.cloudsql_create_canonical_rules 只能由 mysql.cloudsql_create_audit_rule mysql.cloudsql_update_audit_rule 在内部调用。
我可以审核哪些操作? 支持的操作的完整列表中列出了支持的操作。某些操作(例如以下操作)不会进行审核,因为它们不会影响数据库:


USE db_name





SHOW VARIABLES


在某些情况下,您无法将函数作为对象进行审核(不支持的功能)。
我想审核特定表上的所有操作,因此我创建了以下审核规则:

mysql.cloudsql_create_audit_rule("user@*","db", "table","*","B",1,@1,@2);
但我可以看到与该表无关的审核日志,例如 disconnectconnect
某些操作(例如断开连接或连接)被视为全局操作。它们会忽略输入 dbobject 字段。
使用存储过程创建、更新或删除审核规则时,我看到以下错误。

MySQL 服务器正在使用 read-only 选项运行,因此无法执行此语句。
Cloud SQL 无法更改只读实例上的存储过程。如果实例是主实例,请移除 read_only 标志。如果实例为副本实例,请在主实例上进行更改。将规则的更改复制到副本实例后,在副本实例上运行以下命令将规则重新加载到副本中:

CALL mysql.cloudsql_reload_audit_rule(1)
创建、更新或删除审核规则时,即使更改成功,我也会看到以下错误。

0 rows affected
0 rows affected 响应适用于存储过程中执行的最后一个语句,而非表。如需查看审核规则是否已更改,请使用以下命令:


mysql.cloudsql_list_audit_rule
我无法使用 gcloud 设置 cloudsql_mysql_audit_data_masking_cmdscloudsql_mysql_audit_data_masking_regexp gcloud 要求使用 --flags-file 参数来设置复杂的标志值(包含特殊字符的标志)。
我使用 CREATE USER 语句创建了存储过程,但并未遮盖密码。 默认情况下,遮盖仅适用于 cmds(操作),例如:

CREATE_USERALTER_USERGRANTUPDATE

如需在创建存储过程时过滤密码,请将 create_procedure 添加到 cloudsql_mysql_audit_data_masking_cmds
在尝试创建、更新或删除审核规则时,我收到了锁等待超时错误。 通常,当两个或多个会话同时尝试修改审核规则时,会导致此错误。如果这种情况经常发生,请增加 innodb_lock_wait_timeout 变量的值。它可以全局增加(使用数据库标志),也可以仅为会话增加,例如使用以下命令:

SET innodb_lock_wait_timeout=120
.

后续步骤