Bo's Oracle Station

【博客文章2024】通过GPL开源plugin,向MySQL8.0社区版增加审计功能(以MySQL NDB Cluster的SQL节点为操作案例)

2024-2-20 14:45| 发布者: admin| 查看: 84| 评论: 0|原作者: Bo Tang

摘要: 本文以MySQL NDB Cluster的SQL节点为操作案例,通过GPL开源plugin,向MySQL8.0社区版增加审计日志功能。纠正许多认为可以直接拷贝Mariadb的server_audit.so的错误做法。
【博客文章2024】通过GPL开源plugin,向MySQL8.0社区版增加审计日志功能(以MySQL NDB Cluster的SQL节点为操作案例)

Author: Bo Tang

1. 社区版缺失的审计功能:


    MySQL企业版自带审计功能,但是需要付费。MySQL社区版不带审计插件。

 

MySQL  node1:3306 ssl  world2  SQL > show plugins
                                   -> ;
+----------------------------------+----------+--------------------+---------+---------+
| Name                             | Status   | Type               | Library | License |
+----------------------------------+----------+--------------------+---------+---------+
| binlog                           | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password            | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| sha256_password                  | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| caching_sha2_password            | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| sha2_cache_cleaner               | ACTIVE   | AUDIT              | NULL    | GPL     |
| daemon_keyring_proxy_plugin      | ACTIVE   | DAEMON             | NULL    | GPL     |
| CSV                              | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MEMORY                           | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| InnoDB                           | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| INNODB_TRX                       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP                       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_RESET                 | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM                    | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM_RESET              | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_PER_INDEX             | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_PER_INDEX_RESET       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_PAGE               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_PAGE_LRU           | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_POOL_STATS         | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TEMP_TABLE_INFO           | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_METRICS                   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_DEFAULT_STOPWORD       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_DELETED                | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_BEING_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_CONFIG                 | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_INDEX_CACHE            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_FT_INDEX_TABLE            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TABLES                    | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TABLESTATS                | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_INDEXES                   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TABLESPACES               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_COLUMNS                   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_VIRTUAL                   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CACHED_INDEXES            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES  | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| MyISAM                           | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MRG_MYISAM                       | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| PERFORMANCE_SCHEMA               | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| TempTable                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| ARCHIVE                          | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| BLACKHOLE                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| FEDERATED                        | DISABLED | STORAGE ENGINE     | NULL    | GPL     |
| ndbcluster                       | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| ndbinfo                          | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| ndb_transid_mysql_connection_map | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| ngram                            | ACTIVE   | FTPARSER           | NULL    | GPL     |
| mysqlx_cache_cleaner             | ACTIVE   | AUDIT              | NULL    | GPL     |
| mysqlx                           | ACTIVE   | DAEMON             | NULL    | GPL     |
+----------------------------------+----------+--------------------+---------+---------+
48 rows in set (0.0012 sec)


    MySQL企业版的审计插件的名称是:audit.log.soMariadb审计插件的名称是server_audit.so;McAfee审计插件的名称libaudit_plugin.so。Mariadb审计插件和McAfee审计插件遵守GPL。


2. 针对MySQL5.7及之前版本,通常采用的解决办法:

   在MySQL5.7及之前版本环境,Mariadb的server_audit.so插件往往能够被无缝应用于MySQL中以实现审计功能。
   比如:Mariadb的10.1.x/10.2.x版本的server_audit.so插件可直接兼容于MySQL5.7 版本。 具体做法:先从https://mariadb.com/下载 Mariadb对应版本的二进制包。然后将其解压缩,把解压缩后的plugins目录下的server_audit.so 审计插件直接拷贝出来,放置于MySQL5.7版本的插件目录下:

mysql> show global variables like 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value                        |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+


    拷贝sever_audit.so到/usr/lib64/mysql/plugin/后,就可以安装该Mariadb的插件到MySQL数据库:

mysql> INSTALL PLUGIN server_audit soname 'server_audit.so';
Query OK, 0 rows affected (0.01 sec)


3. MySQL8.0使用之前解决办法时,会遇到的问题:

    MySQL8.0使用之前解决办法会遇到问题。比如:使用RedHat Linux8.3自带的Mariadb(3:10.3.17-1.module+el8.1.0+3974+90eded84)的server_audit.so,安装其在MySQL8.0时会出现如下错误:
 

mysql> install plugin audit_log  soname 'server_audit.so';
ERROR 1126 (HY000): Can't open shared library '/usr/lib64/mysql/plugin/server_audit.so' (errno: 2 /usr/lib64/mysql/plugin/server_audit.so: undefined symbol: fn_format)


    使用从https://mariadb.com/下载来的10.11.7-GA版本的Mariadb的server_audit.so,安装其在MySQL8.0时也会出现如上的相同错误。而如果使用从https://mariadb.com/下载来的11.3.2-GA版本的Mariadb的server_audit.so,安装其在MySQL8.0时又会出现新的错误:
 

mysql> INSTALL PLUGIN audit_log SONAME 'server_audit.so';
ERROR 1126 (HY000): Can't open shared library '/usr/lib64/mysql/plugin/server_audit.so' (errno: 2 /usr/lib64/mysql/plugin/server_audit.so: undefined symbol: PSI_server)


4. 通过cmake编译的开源的plugin,向MySQL8.0社区版增加审计功能:

    亚马逊RDS for MySQL的开发团队在GPL宣言的框架下对Mariadb的审计插件源代码进行了二次开发,确保其与MySQL 8 API完全兼容。该插件的源代码在Github上公开发布。作为对MySQL社区的一项服务,MySQL社区版的用户可以在以下的网址下载整个源代码的zip包:https://github.com/Vettabase/audit-plugin-for-mysql


    下载的包名叫:audit-plugin-for-mysql-mysql-8.0.zip。下面以MySQL NDB Cluster的SQL节点为操作案例,来演示:
    解压缩audit-plugin-for-mysql-mysql-8.0.zip后,在其中搜索已经编译出来的server_audit.so,并将其拷贝到MySQL8.0插件所在的目录(这里拷贝到MySQL NDB Cluster的一个SQL节点):
 

[root@node0 mysql-cluster-gpl-8.0.36]# find ./ -name server_audit.so
./audit-plugin-for-mysql-mysql-8.0/build/server_audit.so
[root@node0 mysql-cluster-gpl-8.0.36]# scp ./audit-plugin-for-mysql-mysql-8.0/build/server_audit.so  node1:/usr/lib64/mysql/plugin/
root@node1's password:
server_audit.so                                                                                      100%  596KB 107.7MB/s   00:00   


    这个二进制编译成品也适用于MySQL 8.0.x的所有非集群版本和所有NDB集群版本,本文也提供server_audit.so下载。
    接下来就看安装插件时会不会出现错误:

mysql> INSTALL PLUGIN server_audit soname 'server_audit.so';
Query OK, 0 rows affected (0.01 sec)


    说明安装成功。安装插件成功后,我们登录数据库(MySQL NDB Cluster的一个SQL节点)查看:
 

MySQL  node1:3306 ssl  testlocal  SQL > show plugins;
+----------------------------------+----------+--------------------+-----------------+---------+
| Name                             | Status   | Type               | Library         | License |
+----------------------------------+----------+--------------------+-----------------+---------+
| binlog                           | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| mysql_native_password            | ACTIVE   | AUTHENTICATION     | NULL            | GPL     |
| sha256_password                  | ACTIVE   | AUTHENTICATION     | NULL            | GPL     |
| caching_sha2_password            | ACTIVE   | AUTHENTICATION     | NULL            | GPL     |
| sha2_cache_cleaner               | ACTIVE   | AUDIT              | NULL            | GPL     |
| daemon_keyring_proxy_plugin      | ACTIVE   | DAEMON             | NULL            | GPL     |
| CSV                              | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| MEMORY                           | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| InnoDB                           | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| INNODB_TRX                       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP                       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP_RESET                 | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMPMEM                    | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMPMEM_RESET              | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP_PER_INDEX             | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP_PER_INDEX_RESET       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_PAGE               | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_PAGE_LRU           | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_POOL_STATS         | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_TEMP_TABLE_INFO           | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_METRICS                   | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_DEFAULT_STOPWORD       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_DELETED                | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_BEING_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_CONFIG                 | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_INDEX_CACHE            | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_FT_INDEX_TABLE            | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_TABLES                    | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_TABLESTATS                | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_INDEXES                   | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_TABLESPACES               | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_COLUMNS                   | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_VIRTUAL                   | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CACHED_INDEXES            | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES  | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| MyISAM                           | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| MRG_MYISAM                       | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| PERFORMANCE_SCHEMA               | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| TempTable                        | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| ARCHIVE                          | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| BLACKHOLE                        | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| FEDERATED                        | DISABLED | STORAGE ENGINE     | NULL            | GPL     |
| ndbcluster                       | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| ndbinfo                          | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| ndb_transid_mysql_connection_map | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| ngram                            | ACTIVE   | FTPARSER           | NULL            | GPL     |
| mysqlx_cache_cleaner             | ACTIVE   | AUDIT              | NULL            | GPL     |
| mysqlx                           | ACTIVE   | DAEMON             | NULL            | GPL     |
| SERVER_AUDIT                     | ACTIVE   | AUDIT              | server_audit.so | GPL     |
+----------------------------------+----------+--------------------+-----------------+---------+
49 rows in set (0.00 sec)


    安装完插件后,就会在MySQL数据库中出现如下这些Dynamic变量(我对这些参数进行了注释):
 

MySQL  node1:3306 ssl  world2  SQL > show variables like '%audit%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           |                       |

该参数设置需要保存哪些类型的SQL语句,可以保存的类型有:CONNECT, QUERY, TABLE, QUERY_DDL, QUERY_DML, QUERY_DCL, QUERY_DML_NO_SELECT。如果没有设置该参数,将记录所有类型的SQL语句


| server_audit_excl_users       |                       |
用户列表,设置后表示该列表的用户行为将不会被记录,相当于一个黑名单。


| server_audit_file_path        | server_audit.log      |
server_audit_output_type设置为file时,审计日志记录到/var/lib/mysql/server_audit.log。



| server_audit_file_rotate_now  | OFF                   |
强制日志文件切换,切换后原日志文件被命名为:server_audit.log.1


| server_audit_file_rotate_size | 1000000               |

限制单个审计日志文件大小为1000000字节。超过这个大小将进行日志切换。


| server_audit_file_rotations   | 9                     |
日志切换后保留多少个审计日志,默认为9表示保留server_audit.log.[1-9]。第10次切换时,会覆盖server_audit.log.1


| server_audit_incl_users       |                       |
用户列表,设置后表示哪些用户的操作需要被记录,优先级高于 server_audit_excl_users 参数列表


| server_audit_loc_info         |                       |
开发调试使用的参数,用户可忽略


| server_audit_logging          | OFF                   |

打开或者关闭审计功能,这是最重要的审计参数


| server_audit_output_type      | file                  |

指定日志输出类型,可为SYSLOG或FILE,默认和推荐使用的模式都是FILE 模式,记录到/var/lib/mysql/server_audit.log;如果设置成SYSLOG,则记录到Linux的/var/log/message。


| server_audit_query_log_limit  | 1024                  |

限制审计日志记录中字符串长度,默认为 1024。


| server_audit_syslog_facility  | LOG_USER              |

如果server_audit_output_type=SYSLOG,那么配合Linux的日志系统,设置rsyslog的记录范围


| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |

如果server_audit_output_type=SYSLOG,那么配合Linux的日志系统,设置rsyslog的记录等级
+-------------------------------+-----------------------+
15 rows in set (0.0047 sec)



5. 审计功能测试:

    变量server_audit_logging默认为OFF,设置为ON表示打开审计日志记录。我们准备测试审计1.用户的连接;2.用户的查询:

mysql>set global server_audit_logging=on
mysql>server_audit_events=connect,query


    让用户执行查询,它对应的审计日志将用红色标出:
 

[root@node1 etc]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.36-cluster MySQL Cluster Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database foo;
Query OK, 1 row affected (0.16 sec)

mysql> drop database foo;
Query OK, 0 rows affected (0.12 sec)

mysql> exit
Bye


    让用户执行连接,它对应的审计日志将用蓝色标出:

 MySQL  JS > \connect root@node1:3306
Creating a session to 'root@node1:3306'
Please provide the password for 'root@node1:3306': *********
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 13
Server version: 8.0.36-cluster MySQL Cluster Community Server - GPL
No default schema selected; type \use to set one.
 MySQL  node1:3306 ssl  JS >


    /var/lib/mysql/server_audit.log的格式是:时间戳,记录审计日志的主机,用户名,发生审计事件的主机,连接ID,查询ID,操作类型,数据库,对象,返回值。
 

[root@node1 mysql]# tail -n 30 -f server_audit.log
20240219 09:12:45,node1.example.com,root,localhost,9,0,CONNECT,,,0,SOCKET
20240219 09:12:45,node1.example.com,root,localhost,9,5,QUERY,,'select @@version_comment limit 1',0,,
20240219 09:17:59,node1.example.com,root,localhost,9,6,QUERY,,'create database foo',0,,
20240219 09:18:12,node1.example.com,root,localhost,9,7,QUERY,,'drop database foo',0,,

20240219 09:18:12,node1.example.com,root,localhost,9,8,QUERY,,'SELECT DATABASE()',0,,
20240219 09:22:16,node1.example.com,root,localhost,9,0,DISCONNECT,,,0,SOCKET

20240219 09:22:20,node1.example.com,root,localhost,10,0,CONNECT,,,0,SOCKET
20240219 09:22:20,node1.example.com,root,localhost,10,10,QUERY,,'select @@version_comment limit 1',0,,
20240219 09:22:43,node1.example.com,root,node0.example.com,11,0,CONNECT,world2,,0,SSL
20240219 09:22:43,node1.example.com,root,node0.example.com,11,11,QUERY,world2,'select schema()',0,,
20240219 09:22:51,node1.example.com,root,node0.example.com,11,0,DISCONNECT,world2,,0,SSL
20240219 09:23:47,node1.example.com,,node0.example.com,12,0,FAILED_CONNECT,,,1156,TCP/IP
20240219 09:23:47,node1.example.com,root,node0.example.com,13,0,CONNECT,,,0,SSL
20240219 09:23:47,node1.example.com,root,node0.example.com,13,16,QUERY,,'show schemas',0,,
20240219 09:23:47,node1.example.com,root,node0.example.com,13,17,QUERY,,'select concat(@@version, \' \', @@version_comment)',0,,
20240219 09:23:47,node1.example.com,root,node0.example.com,13,18,QUERY,,'select schema()',0,,

20240220 01:34:02,node1.example.com,root,localhost,10,0,DISCONNECT,,,0,SOCKET
20240220 01:34:02,node1.example.com,root,node0.example.com,13,0,DISCONNECT,,,0,SSL


    它还会记录一些失败的连接(黄色表示)。

附录. 其他解决社区版增加审计功能的解决方案:

    MySQL社区版还可以使用McAfee提供的开源软件mysql Audit Pluging。项目地址:https://github.com/trellix-enterprise/mysql-audit,插件名称为libaudit_plugin.so。




路过

雷人

握手

鲜花

鸡蛋

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-2-21 22:01 , Processed in 0.037922 second(s), 21 queries .

返回顶部