数据库(mysql)审计二(自带审计功能)

一、概述:

    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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值