一、概述:
MariaDB和MySQL使用广泛,如果需要记录用户访问以符合公司的审计规则,那么以前必须使用其他数据库审计解决方案。然而为了满足这一需求,MariaDB开发了MariaDB审计插件。虽然MariaDB审计插件有一些仅适用于MariaDB的独特特性,但它也可以与MySQL一起使用。MariaDB审计插件的目的是记录服务器的活动。对于每个客户端会话,它记录谁连接到服务器(即用户名和主机)、执行了哪些查询、访问了哪些表以及更改了哪些服务器变量。此信息存储在日志文件中,也可以发送到本地syslogd。 MariaDB审计插件与MariaDB、MySQL(截至5.5.34和10.0.7版本)和PerconaServer一起工作。默认情况下,MariaDB开始包括10.0.10和5.5.37版本的审计插件,并且可以安装在MariaDB 5.5.20的任何版本中。
查看插件的目录,进入目录可查看到已安装的插件
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| plugin_dir | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.02 sec)
二、安装审计插件及介绍
MariaDB [(none)]> INSTALL PLUGIN server_audit
-> SONAME 'server_audit.so';
Query OK, 0 rows affected (0.14 sec)
在首次加载插件之前,服务器将不知道插件将要使用的变量(参见配置)。如果在审计插件至少加载一次之前在配置文件中设置了这些变量,则数据库服务器将无法成功启动。
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'server_audit%';
SHOW GLOBAL VARIABLES LIKE 'server_audit%'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | server_audit_events | CONNECT,QUERY,TABLE | | server_audit_excl_users | | | server_audit_file_path | server_audit.log | | server_audit_file_rotate_now | OFF | | server_audit_file_rotate_size | 1000000 | | server_audit_file_rotations | 9 | | server_audit_incl_users | | | server_audit_logging | ON | | server_audit_mode | 0 | | server_audit_output_type | file | | server_audit_query_log_limit | 1024 | | server_audit_syslog_facility | LOG_USER | | server_audit_syslog_ident | mysql-server_auditing | | server_audit_syslog_info | | | server_audit_syslog_priority | LOG_INFO | +-------------------------------+-----------------------+ |
参数说明:
server_audit_output_type:指定日志输出类型,可为SYSLOG或FILE
server_audit_logging:启动或关闭审计
server_audit_events:指定记录事件的类型,可以用逗号分隔的多个值(connect,query,table),如果开启了查询缓存(query cache),查询直接从查询缓存返回数据,将没有table记录
server_audit_file_path:如server_audit_output_type为FILE,使用该变量设置存储日志的文件,可以指定目录,默认存放在数据目录的server_audit.log文件中
server_audit_file_rotate_size:限制日志文件的大小
server_audit_file_rotations:指定日志文件的数量,如果为0日志将从不轮转
server_audit_file_rotate_now:强制日志文件轮转
server_audit_incl_users:指定哪些用户的活动将记录,connect将不受此变量影响,该变量比server_audit_excl_users 优先级高
server_audit_syslog_facility:默认为LOG_USER,指定facility
server_audit_syslog_ident:设置ident,作为每个syslog记录的一部分
server_audit_syslog_info:指定的info字符串将添加到syslog记录
server_audit_syslog_priority:定义记录日志的syslogd priority
server_audit_excl_users:该列表的用户行为将不记录,connect将不受该设置影响
server_audit_mode:标识版本,用于开发测试
可以在my.cnf、my.ini或者创建/etc/my.cnf.d/server.cnf添加如下内容;建议在server.cnf中进行
[mysqld] plugin_load=server_audit=server_audit.so server_audit_events=connect,query server_audit_logging = on |
由MariaDB审计插件记录的事件通常被分组为不同的类型:连接、查询和表事件,若要基于这些类型的事件进行日志记录,请将变量SERVER_AUDIT_Events设置为连接、查询或表。要让审计插件日志有多个类型的事件,请将它们放在逗号分隔的列表中,如下所示:
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE’;
MariaDB [(none)]> SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';
Query OK, 0 rows affected (0.00 sec)
默认情况下,日志被设置为关闭,启用设置server_audit_logging为on。
请注意:如果启用了查询缓存,并且从查询缓存中返回了查询,则不会出现表记录,因为服务器没有打开或访问任何表,而依赖于缓存的结果。因此可能禁用查询缓存。
实际上有几种类型的事件可能被记录,而不仅仅是上面提到的三种常见事件。相关的系统变量列表以server_audit系统变量和状态变量的详细页面,对本文档的server_audit状态变量页面。下面着重介绍其中的一些主要问题(摘自官方):
三、数据库审计详解
由于除了DDL和DML之外,还有其他类型的查询,因此将query_dl和query_dml选项一起使用并不等同于使用查询。从审计插件的1.3.0版本开始,有用于记录DCL类型查询的查询_DCL选项(例如,GRANT和REVOKE语句)。在同一版本中,添加了SERVER_AUDIT_QUERY_LOG_LAND变量,以便能够设置日志记录的长度。以前由于查询字符串较长,日志条目将被截断。
3.1、日志连接事件
如果已将审核插件配置为记录连接事件,则它将记录连接、断开连接和失败连接。对于失败的连接,日志包含错误代码,可以定义一个用户列表,其中的事件可以被排除或包括在跟踪他们的数据库活动中。但是对于连接事件的日志记录,此列表将被忽略。这是因为审计区分了技术用户和物理用户。所有类型的用户都需要记录连接;只有物理用户才需要记录对对象的访问。
3.2、日志查询事件
如果启用了查询事件日志记录,则将为定义的用户记录执行的查询。查询将在执行时以纯文本形式记录下来。这是一个安全漏洞:任何访问日志文件的人都可以读取查询。因此请确保只有受信任的用户才能访问日志文件,并且文件位于受保护的位置。另一种方法不是使用查询事件日志,而是只使用表事件日志记录。 如果查询不能执行,如果查询不成功,也会记录查询。例如由于语法错误或用户没有访问对象所需的权限、查询将被记录。这些查询可以由日志中提供的错误代码进行解析。 可能会发现失败的查询:它们可能暴露应用程序的问题(例如应用程序中的SQL语句与当前模式不匹配)。它们还可以显示恶意用户是否正在猜测表和列的名称,以尝试访问数据。 下面是一个示例,其中用户试图在他没有权限的表上执行UPDATE语句:
UPDATE employees SET salary = salary * 1.2 WHERE emp_id = 18236; ERROR 1142 (42000): UPDATE command denied to user 'bob'@'localhost' for table 'employees' |
当进入数据库进行操作时,所有的查询、修改、删除等操作都被记录到/var/lib/mysql/server_audit.log文件中,审计日志记录如下:
20240118 18:58:02,ctc-bjlg-snorby,,,5,0,DISCONNECT,,,0 20240118 18:58:02,ctc-bjlg-snorby,,,43,0,DISCONNECT,,,0 20240118 18:58:05,ctc-bjlg-snorby,UNKNOWN_MYSQL_US,localhost,1,0,FAILED_CONNECT,,,1045 20240118 18:58:05,ctc-bjlg-snorby,,,1,0,DISCONNECT,,,0 20240118 18:58:22,ctc-bjlg-snorby,root,localhost,2,0,CONNECT,,,0 20240118 18:58:22,ctc-bjlg-snorby,root,localhost,2,2,QUERY,,'show global status like \'%audit%\'',0 20240118 18:58:39,ctc-bjlg-snorby,,,2,0,DISCONNECT,,,0 20240118 18:58:54,ctc-bjlg-snorby,root,localhost,3,0,CONNECT,,,0 20240118 18:58:54,ctc-bjlg-snorby,root,localhost,3,4,QUERY,,'select @@version_comment limit 1',0 20240118 18:59:02,ctc-bjlg-snorby,root,localhost,3,5,QUERY,,'show databases',0 20240118 18:59:09,ctc-bjlg-snorby,root,localhost,3,6,QUERY,,'SELECT DATABASE()',0 20240118 18:59:09,ctc-bjlg-snorby,root,localhost,3,8,QUERY,snorby,'show databases',0 20240118 18:59:09,ctc-bjlg-snorby,root,localhost,3,9,QUERY,snorby,'show tables',0 20240118 18:59:13,ctc-bjlg-snorby,root,localhost,3,41,QUERY,snorby,'show tables',0 20240118 18:59:18,ctc-bjlg-snorby,root,localhost,3,42,QUERY,snorby,'select * from users',0 20240118 19:00:14,ctc-bjlg-snorby,root,localhost,3,43,QUERY,snorby,'SHOW GLOBAL VARIABLES LIKE \'server_audit%\'',0 |
3.3、记录用户活动
审核插件将记录所有用户的数据库活动,或仅记录您指定的用户。数据库活动定义为查询事件或表事件。所有用户都记录连接事件。
可以指定要包括在与server_audit_incl_users变量日志或排除用户与用户server_audit_excl_users变量。如果您希望记录条目,但对受信任应用程序的条目不感兴趣,并希望将它们从日志中排除,这将非常有用。
通常可以使用server_audit_incl_users变量或server_audit_excl_users变量。不过可以使用这两个变量。如果用户名是不经意间配置了这两变量,该用户将被记录因为server_audit_incl_users优先数据库活动。
虽然MariaDB认为用户的用户名和主机名的结合,只有基于用户日志审计插件。MariaDB同时使用用户名和主机名、授予权限的用户的位置有关。特权用户对于跟踪对数据库对象的访问是不相关的。主机名仍然记录在日志中,但日志记录不是基于该信息确定的。
下面的示例演示如何向server_audit_incl_users变量添加一个新的用户名不删除以前的用户名:
SET GLOBAL server_audit_incl_users = CONCAT(@@global.server_audit_incl_users, ',Maria');
记得添加任何新的用户将被包括在日志MariaDB配置文件相同的变量。否则当服务器重新启动时,它的相关配置将不生效。
3.4、排除审计用户或指定审计用户
默认情况下,所有用户的事件都会被记录下来,但是某些用户可以通过使用server_AUDIT_EXL_USERS变量被排除在日志记录之外。例如为了排除用户valerianus和ROCK记录他们的事件:
[mariadb]
server_audit_excl_users=valerianus,rocky
此选项主要用于排除受信任应用程序的活动。 或者server_AUDIT_INCL_USERS可用于专门包含用户。这两个变量都可以使用,但是如果一个用户出现在两个列表中,server_audd_incl_user具有更高的优先级,并且他们的活动将被记录下来。 注意所有用户都会记录连接事件,无论这两个设置如何。日志记录也只基于用户名,而不是MariaDB用来确定权限的用户名和主机名组合。
这些变量的值可以由具有超级特权的管理员使用SET语句更改。下面是如何禁用审计日志记录的示例:
SET GLOBAL server_audit_logging=OFF;
3.5、卸载审计插件相关
卸载插件语句可用于卸载审计插件:UNINSTALL PLUGIN server_audit;
有时为了审计可能需要禁止卸载审核插件,为此可以在插件加载一次之后将以下行添加到配置文件中:
[mysqld]
...
plugin_load=server_audit=server_audit.so
server_audit=FORCE_PLUS_PERMANENT
一旦将上面的选项添加到服务器的配置文件并重新启动数据库,如果有人试图卸载审计插件,则会返回错误消息。下面是一个错误消息的示例:
UNINSTALL PLUGIN server_audit;
ERROR 1702 (HY000):
Plugin 'server_audit' is force_plus_permanent and can not be unloaded
参考链接:
https://mariadb.com/kb/en/library/mariadb-audit-plugin-installation/