本主题介绍 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,user2
、db1,db2
、table1,table2
、select,delete
的审核规则会生成 2 x 2 x 2 x 2 = 16 个组合。
如果审核规则总数超过 1000,则创建或更新审核规则失败。
不支持的操作
目前不支持以下操作。
以下函数不受支持:
- 在包含
UNION
、INTERSECT
、WHERE
子句、嵌套查询、子查询等的SELECT
查询中。 - 在
UPDATE
、DELETE
、INSERT
、REPLACE
语句中。
例如,如果您有一个审核规则来审核对象
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 地址过滤。
后续步骤
- 了解如何使用 MySQL 数据库审核。