MySQL企业版之Audit(审计)初体验

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL企业版之Audit(审计)初体验

MySQL企业版的优势在于有原厂技术支持,以及几个相当不错的功能插件,例如Transparent Data Encryption (TDE)(透明数据加密)、Audit(审计)、thread pool(线程池)、firewall(防火墙)、Data Masking(数据打码)等功能,还有企业级高可用、备份、监控等工具套件。

在企业级应用中,通常需要记录关键操作行为,以及满足合规审计需求,所以会用到审计功能。

本文带着大家一起体验企业版审计插件(Audit Plugin)。

1. 安装插件

安装审计插件比较简单,只要执行安装目录下的脚本即可

mysql -f < path-to-basedir/share/audit_log_filter_linux_install.sql
[root@yejr.run]> show plugins;
+---------------------------------+----------+--------------------+--------------+-------------+
| Name                            | Status   | Type               | Library      | License     |
+---------------------------------+----------+--------------------+--------------+-------------+
...
| audit_log                       | ACTIVE   | AUDIT              | audit_log.so | PROPRIETARY |
+---------------------------------+----------+--------------------+--------------+-------------+

此外,datadir目录下还会生成对应的日志文件 audit.log

2. 审计插件设置

和审计插件相关的配置参数有17个,但我认为需要关注的参数主要有下面几个:

[root@yejr.run]> show global variables like 'audi%';
+--------------------------------------+--------------+
| Variable_name                        | Value        |
+--------------------------------------+--------------+
...
| audit_log_buffer_size                | 8388608      |
| audit_log_rotate_on_size             | 67108864     |
| audit_log_strategy                   | ASYNCHRONOUS |
...
+--------------------------------------+--------------+
  • audit_log_buffer_size,在写入日志文件前,可以放在buffer里的日志大小。
  • audit_log_rotate_on_size,日志文件超过64MB后,会生成一个新的,更方便管理。
  • audit_log_strategy,日志写入策略,采用默认的ASYNCHRONOUS(异步)即可。

企业版的审计功能,可以针对以下不同事件类型进行审计:a. 指定某些账户,或者排除某些账号。b. 针对某些事件类型(event class),例如:connection(连接)、general(常规操作)、tableaccess(表访问)。c. 在上述类型的基础上,还可以指定某些子类型(event subclass),例如:针对连接中的changeuser行为,或者针对表访问的delete行为等。d. 事件日志中包含指定关键字,例如可以记录针对某个关键业务表的删除行为(防止误操作或恶意破坏)。

审计策略规则存储在 mysql.audit_log_filtermysql.audit_log_user两个表中,前者存储具体的规则策略,后者存储策略=>账户的对应关系。

[root@yejr.run] [mysql]>select NAME, FILTER from audit_log_filter;
+--------------------+--------------------------+
| NAME               | FILTER                   |
+--------------------+--------------------------+
| abort_yejr_t1_del  | {"filter": {"class": ... |
| log_yejr_all_query | {"filter": {"class": ... |
+--------------------+--------------------------+
[root@yejr.run] [mysql]>select * from audit_log_user;
+------+------+-------------------+
| USER | HOST | FILTERNAME        |
+------+------+-------------------+
| yejr | %    | abort_yejr_t1_del |
+------+------+-------------------+

初始化完毕后,还要执行下面的SQL以升级相关的表结构(主要是校验集):

ALTER TABLE mysql.audit_log_user
  DROP FOREIGN KEY audit_log_user_ibfk_1;
ALTER TABLE mysql.audit_log_filter
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
  MODIFY COLUMN USER VARCHAR(32);
ALTER TABLE mysql.audit_log_user
ADD FOREIGN KEY (FILTERNAME) REFERENCES mysql.audit_log_filter(NAME);

3. 审计规则使用案例

举几个审计规则的案例。规则1:记录账户 "yejr@'%'" 全部Query请求,除此外不记录其他请求,包括像连接、断开的请求。

# 创建一个新规则,名为 log_yejr_all_query
[yejr@yejr.run]> select audit_log_filter_set_filter('log_yejr_all_query', '{
  "filter": {
    "class": {
    "name": "general",
      "event": {
        "name": "status",
        "log": {
          "field": { "name": "general_command.str", "value": "Query" }
        }
      }
    }
  }
}');
# 将这个新规则指派给账号 yejr@%
[yejr@yejr.run]> select audit_log_filter_set_user('yejr@%', 'log_yejr_all_query');

规则2:记录 "root@localhost" 账户的全部请求,万一超级账户误操作可以看日志

[yejr@yejr.run]> select audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
[yejr@yejr.run]> select audit_log_filter_set_user('root@localhost', 'log_all');

规则3:阻止 "jack@'%'" 删除 "yejr.t1" 表中的数据

[yejr@yejr.run]> select audit_log_filter_set_filter('abort_yejr_t1_del', '{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "delete" ],
        "abort": {
          "and": [
            { "field": { "name": "table_database.str", "value": "yejr" } },
            { "field": { "name": "table_name.str", "value": "t1" } }
          ]
        }
      }
    }
  }
}
');
[yejr@yejr.run]> select audit_log_filter_set_user('jack@%', 'abort_yejr_t1_del');

最后,可以手动刷新策略使其立即生效。

[yejr@yejr.run]> select audit_log_filter_flush();

如果执行完后,这个规则还没理解生效,有几种方法:

  1. 在客户端的话,可以手动执行命令 connect,使其重新建立连接,就可以生效了。
  2. 应用程序断开重新连接。
  3. 如果用C API的话,可以调用 mysql_change_user() 函数即可。

上面案例中的第三条规则刷新后,如果执行删除请求,就会报告下面的错误提示:

[yejr@yejr.run] [yejr]> delete from t1 where id = 3306;
ERROR 1045 (28000): Statement was aborted by an audit log filter

并且审计日志中会有这样一条记录:

 <AUDIT_RECORD>
  <TIMESTAMP>2020-06-02T08:51:25 UTC</TIMESTAMP>
  <RECORD_ID>14_2020-06-02T08:32:44</RECORD_ID>
  <NAME>TableDelete</NAME>
  <CONNECTION_ID>33</CONNECTION_ID>
  <USER>yejr[yejr] @ localhost []</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP/>
  <COMMAND_CLASS>delete</COMMAND_CLASS>
  <SQLTEXT>delete from t1 where id = 514</SQLTEXT>
  <DB>yejr</DB>
  <TABLE>t1</TABLE>
 </AUDIT_RECORD>

此外,关于审计策略的使用还有以下几点:

a. 规则中可以是包含或排除某些策略。b. 还可以在规则中设定阻止(忽略)某些SQL的执行。c. 可以定义多条规则,并指派给多个账户。d. 还可以定义一些默认的规则。e. 开启AUDIT后,势必会有一定程度的性能损失。

更多复杂的策略可以参考手册内容。对比看了下MariDB的AUDIT插件功能,相对于Oracle MySQL企业版还是简单了些,就不做对比测试了。

最后亲切友情提醒:MySQL企业版下载后只能试用一个月,试用完毕后记得删除卸载哟,土豪的话直接无脑付费即可哟

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
AnalyticDB MySQL新购页面升级,现推出企业版和基础版,不再区分湖仓版和数仓版。企业版(集群模式)和基础版(单机模式)融合了弹性模式和预留模式的功能,提供资源隔离、弹性扩展及高性能查询,适合开发测试和生产环境,而基础版适用于小规模测试,不推荐用于生产环境。
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
|
Oracle 关系型数据库 MySQL
OceanBase 数据库的企业版提供了 Oracle 到 MySQL 的迁移工具
OceanBase 数据库的企业版提供了 Oracle 到 MySQL 的迁移工具
151 2
|
6月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL企业版与标准版功能对比:如何选择适合您的版本?
随着数字化时代的到来,企业对于数据处理的需求越来越高,而数据库作为数据处理的核心,其性能和成本成为了企业关注的焦点。阿里云全新推出的PolarDB MySQL企业版和标准版,以全新的架构和优化,为企业提供了高性能、低成本的数据库解决方案。但在功能上,这两个版本有很多差异,我们该如何选择呢?
157 2
|
6月前
|
Cloud Native 关系型数据库 MySQL
PolarDB MySQL企业版:云原生架构,超高性能与可靠性的完美结合
在数字化时代,数据已成为企业的核心资产。对于现代企业来说,选择一款高性能、高可靠性、高性价比的数据库至关重要。阿里巴巴自研的云原生HTAP数据库——PolarDB MySQL企业版,正是这样一款满足企业需求的理想选择。
424 1
|
6月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL企业版产品系列:满足不同场景需求的解决方案
PolarDB MySQL企业版产品系列:满足不同场景需求的解决方案 在数字化时代,企业对于数据处理的需求越来越多样化,对于数据库的选择也更为谨慎。PolarDB MySQL版为了满足不同场景的需求,提供了单节点、集群版、高压缩引擎(X-Engine)和多主集群(库表)4种不同的产品系列。下面我们将对这4种产品系列进行简要介绍,以帮助您更好地了解它们的特点和适用场景。
183 1
|
6月前
|
关系型数据库 MySQL 分布式数据库
什么是PolarDB MySQL企业版
PolarDB MySQL版是阿里巴巴自研的云原生HTAP数据库。PolarDB MySQL版100%兼容原生MySQL的多个版本,包括MySQL 5.6、MySQL 5.7和MySQL 8.0。PolarDB MySQL版的企业版基于云原生架构、计算存储分离、软硬件一体化设计,为用户提供具备超高弹性和性能、高可用和高可靠保障、高性价比的数据库服务。 产品架构
222 0
|
存储 运维 监控
mysql开启审计日志
mysql开启审计日志
398 0
|
Oracle 关系型数据库 MySQL
迁移MariaDB审计插件(Audit Plugin)到MySQL 5.7---发表到爱可生开源社区
Oracle的MySQL社区版本不带审计插件(Audit Plugin),要想使用审计功能,你可以用Enterprise的版本,不过这需要银子。业界还有一些GPL协议的审计插件,这里我们选择MariaDB的审计插件。
235 0
|
3天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
14 4
|
26天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
58 3
Mysql(4)—数据库索引

热门文章

最新文章

下一篇
无影云桌面