MySQL 数据库审核

本主题介绍 Cloud SQL for MySQL 数据库审核和 Cloud SQL for MySQL 审核插件。如需立即使用数据库审核,请参阅使用 MySQL 数据库审核

什么是数据库审核?

借助数据库审核,您可以跟踪数据库中的特定用户操作,例如表更新、读取查询、用户特权授予等。数据库审核对于出于安全原因需要跟踪用户活动或者遵守各种财务、政府和 ISO 法规的组织非常有用。Cloud SQL for MySQL 5.7 和 8.0 支持数据库审核。

Cloud SQL for MySQL 审核插件

数据库审核由 Cloud SQL for MySQL 审核插件或 cloudsql_mysql_audit 启用。此插件使用开放式 MySQL 审核 API 来监控和记录 MySQL 中的活动。该插件会将日志发送到 Cloud Logging 数据访问审核日志。数据访问审核日志默认处于停用状态,因为审核日志可能非常大。您必须明确启用日志才能使用该插件。

当插件处于活跃状态时,系统会应用您创建的现有审核日志为数据库生成审核日志。停用该插件后,则不会生成审核日志。

如需详细了解 MySQL 插件,请参阅 MySQL 服务器插件

谁使用数据库审核?

参与数据库审核的用户有三种类型:

  • 管理员 - 管理数据库的用户。管理员是负责对实例启用和停用审核以及创建新用户的审核用户。他们还会为审核人员授予审核权限。管理员还可以创建、删除和更新审核规则。
  • 审核人员 - 有权创建、删除和更新审核规则的用户。这些角色由管理员授予访问权限。
  • 客户端 - 活动通过审核规则进行审核但不是审核用户,并且本身没有管理或审核权限的用户。他们的访问权限由管理员管理。

管理员和审核人员也称为审核用户。

审核规则

数据库审核使用审核规则来定义应该触发审核日志创建的用户、数据库、对象、操作和状态的组合。审核规则包含以下信息:

  • ID - 字母数字规则标识符。在创建规则时,系统会自动为每个审核规则分配一个审核 ID。审核 ID 一经创建便无法更改。
  • 用户名 - 以英文逗号分隔的用户和/或通配符模式列表。您可以将星号 (*) 用作用户和主机的通配符。使用星号作为后缀和/或前缀。 此外,用户只能对主机使用通配符 %。最多使用 2048 个字符。
  • Dbname - 以英文逗号分隔的数据库名称和/或通配符模式列表。您可以将星号 (*) 用作用户和主机的通配符。使用星号作为后缀和/或前缀。最多使用 2048 个字符。
  • 对象:以英文逗号分隔的数据库对象(表、函数、存储过程等)名称和/或通配符模式列表。您可以将星号 (*) 用作用户和主机的通配符。使用星号作为后缀和/或前缀。最多使用 2048 个字符。
  • Operation - 以英文逗号分隔的数据库操作列表。插件支持所有操作(例如 DDL、DML 等)、单个操作(如更新、删除等)和通配符 (*)。请参阅支持的操作的完整列表。 该插件还支持可用于审核一组操作的操作组。最多使用 2048 个字符。
  • Op_result - 操作的结果。

    • S(对于审核成功的操作)
    • U(对于审核失败的操作)
    • B,表示跟踪成功和失败的操作
    • E,表示创建排除规则

操作类型

操作类型是您可以在数据库中审核的多种活动或操作:

  • DQL - 从数据库中读取数据(即 SELECT 语句)
  • DML - 添加、删除或修改数据
  • DDL - 创建或修改数据库中数据库对象的结构
  • DCL - 管理数据库中用户的权限
  • Show - 描述数据库镜像或提供数据库状态
  • Call - 调用存储过程

影响审核日志的注意事项

备份

从备份或时间点恢复 (PITR) 恢复实例时,审核规则也会回滚到备份或 PITR 的时间。这是因为审核规则是存储在数据库中的数据的一部分,规则正在审核的目标(用户和对象)也是如此。

只读副本

审核规则会自动从主实例复制到其读取副本。客户无法在读取副本中添加、移除或修改审核规则。如果要更改副本的审核规则,您需要更新主实例的审核规则。

如果要更新主实例上的审核日志规则,您需要重新加载副本的审核规则,以确保同时在读取副本更新新的审核规则。以下命令将重新加载审核规则:

CALL mysql.cloudsql_reload_audit_rule(1)

用户可以对主实例启用副本的审核日志记录。在主实例上进行更改后,您需要运行重新加载命令或重启副本实例,才能使审核日志规则生效。

审核日志失败期间的数据库可用性

如果审核操作失败,Cloud SQL 不会停止数据库活动。例如,当实例的磁盘空间不足,且 Cloud SQL 无法生成审核日志时,数据库仍会允许用户执行读取查询,即使此操作通常会生成审核日志也是如此。

只读实例

如果实例的 read_only 标志设置为 true,则您无法添加或更新审核规则,因为它们存储在表中。您需要先移除 read_only 标志,然后才能创建、更新或删除规则。

限制和已知问题

应用二进制日志

Cloud SQL for MySQL 审核插件与实例上的二进制日志不兼容。

在某些情况下,如果您在启用 Cloud SQL for MySQL 审核插件时尝试应用二进制日志,则可能导致数据库实例崩溃。

如果要使用 mysqlbinlog 实用程序应用二进制日志,则需要先设置 cloudsql_mysql_audit=OFF 来停用数据库审核。

日志提取速率

在 Cloud SQL 将审核日志发送到 Cloud Logging 之前,它们会使用磁盘空间临时写入实例的磁盘。日志以 4 MB 的速率上传到 Cloud Logging 并从磁盘中移除。当日志生成的负载超过上传速率时,实例会增加磁盘使用量,从而导致数据库耗尽并崩溃。即使启用了自动磁盘存储增加,磁盘使用率的增加也会增加费用。

使用此功能时,我们建议您:

  • 启用存储空间自动扩容功能
  • 监控总体磁盘使用情况。您无法单独监控日志生成时的负载。在 Metrics Explorer 中使用 cloudsql.googleapis.com/database/disk/utilization 指标。
  • 如有必要,您可以通过限制数据库活动或减少审核来降低日志生成速率。

审核失败的操作

如果您的审核规则包括不成功操作审核(op_result 设置为失败操作设置为 U,或者设置为 B 失败操作和成功操作),一些用户可能会过载通过审核日志来执行持续失败的操作。如果日志生成速度超出日志提取速率,可能会发生不必要的磁盘使用率增长,从而耗尽磁盘空间。相反,在审核失败的操作时:

  • 实例级层控制访问权限。
  • 设置监控或提醒系统,以检测失败操作日志的异常增加。

审核规则

每个数据库实例创建的审核规则组合总数不得超过 1000 个。审核规则组合是一组唯一的用户、数据库、对象和操作。例如,审核 user1,user2db1,db2table1,table2select,delete 的审核规则会生成 2 x 2 x 2 x 2 = 16 个组合。 如果审核规则总数超过 1000,则创建或更新审核规则失败。

不支持的操作

目前不支持以下操作。

  • 以下函数不受支持:

    • 在包含 UNIONINTERSECTWHERE 子句、嵌套查询、子查询等的 SELECT 查询中。
    • UPDATEDELETEINSERTREPLACE 语句中。

    例如,如果您有一个审核规则来审核对象 func1,则系统不会审核以下内容:

    • SELECT func1() FROM table;
    • SELECT * FROM table WHERE a = func1();
    • SELECT func1() != 0;
    • SELECT func1() > 0;
    • SET @x = func1();

    SELECT 直接调用但没有任何运算符且没有 WHERE 子句的函数将被审核:

    • SELECT func1();
    • SELECT db.func1();
  • 目前不支持按 IP 地址过滤。

后续步骤