mysql如何查看审计_如何审计MySQL 8.0中的分类数据查询?

本文介绍了如何在MySQL 8.0中针对含有敏感数据的查询进行审计,通过示例展示了如何利用audit_api_message_emit_UDF函数在审计日志中记录特定级别的数据选择,确保合规性需求得到满足。
摘要由CSDN通过智能技术生成

作者:Mike Frank 译:徐轶韬

面临的挑战

通常,涉及到敏感信息时用户需要使用审计日志。不仅仅是在表上运行Select,还包括访问表中的特定单元格。通常,这类数据将包含一个分类级别作为行的一部分,定义如何处理、审计等策略。

诸如此类的敏感数据可能被标记为–高度敏感

最高机密

分类

受限制的

需要清除

高度机密

受保护的

以某种方式分类或标记的数据通常会被合规要求所涵盖。合规性要求审计数据库中发生在这类数据上的事件。特别是对于可能具有数据访问权限,但不应查看某些数据的管理员。

敏感数据可以与带有标签的数据穿插在一起,例如公开

未分类

其他

当然,您可以在MySQL Audit中打开常规的选择/读取审计。但是,您无法判断是否选择了敏感数据,仅可以看到在表上运行了一个Select,以及Select的SQL文。

一个解决方案

虽然不是很明显,但是有多种方法可以根据所选择的数据来完成数据审计。下面是一个例子。

我们的示例表非常简单,id,name,desc,以及sec_level列。我们要审计Select语句里sec_level为H的行。CREATE SCHEMA test_sel_audit;

CREATE TABLE `test_sel_audit`.`info_cat_test` (

`id` INT NOT NULL,

`name` VARCHAR(20) NULL,

`desc` VARCHAR(20) NULL,

`sec_level` CHAR(1) NULL,

PRIMARY KEY (`id`));

让我们添加几行数据。INSERT INTO `test_sel_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('1', 'fred', 'engineer', 'H');

INSERT INTO `test_sel_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('2', 'jill', 'program manager', 'M');

INSERT INTO `test_sel_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('3', 'joe', 'maintenance', 'L');

启用EE审计(需要使用MySQL企业版 –使用shell连接显示MySQL的版本。

> mysqlshmysqlsh> \connect newuser@localhost

Server version: 8.0.21-commercial MySQL Enterprise Server – Commercial

或者执行mysql> select @@version;

如何安装审计插件的详细“操作方法”

https://dev.mysql.com/doc/refman/8.0/en/audit-log-installation.html

如何安装审计发行组件的详细信息

https://dev.mysql.com/doc/refman/8.0/en/audit-api-message-emit.html

> bin/mysql -u root -pINSTALL COMPONENT "file://component_audit_api_message_emit";

在[mysqld]中设置启动时开启审计功能并设置选项。例如:

>vi etc/my.cnfplugin-load-add=audit_log.so

audit-log=FORCE_PLUS_PERMANENT

audit-log-format=JSON

audit-log-strategy=SYNCHRONOUS

有关审计选项和变量的更多详细信息,请参考审计日志手册。

https://dev.mysql.com/doc/mysql-security-excerpt/8.0/en/audit-log-reference.html

重新启动MySQL服务器。

注意:有多种方法可以启用审计而无需重新启动。上面是强制执行审计的操作方式。

首先,我将编写一个简单的函数,其中包含我想在审计跟踪中拥有的审计元数据。

我将创建一个简单的封装函数DELIMITER $$

CREATE FUNCTION audit_api_message_emit_FN(name CHAR(20))

RETURNS VARCHAR(2)

DETERMINISTIC

BEGIN

DECLARE aud_msg VARCHAR(255);

select audit_api_message_emit_udf('sec_level_selected',

'audit_selected',

'Sensitive Data Selected',

'FOR ', name

) into aud_msg;

RETURN('OK');

END$$

DELIMITER ;

让我们运行一次select来演示如何构建select审计。SELECT

`info_cat_test`.`id`,

`info_cat_test`.`name`,

`info_cat_test`.`desc`,

`info_cat_test`.`sec_level`,

IF(`info_cat_test`.`sec_level` = 'H',

AUDIT_API_MESSAGE_EMIT_FN(name),

CAST('NA' AS CHAR))

FROM

`test_trigger`.`info_cat_test`;

9c3cb229ecb206405242f42870f38050.png

如您所见,当sec_level为'H'时,有一个IF调用udit_api_message_emit_ud。OK显示了选择了H级别。

现在,我们可以在审计日志中看到它。>sudo cat usr/local/mysql/data/audit.log | egrep "H level sec data retrieved" | egrep fred{ "timestamp": "2020-08-24 18:42:46", "id": 10, "class":

"message", "event": "user", "connection_id": 10, "account": {

"user": "root", "host": "localhost" }, "login": { "user": "root",

"os": "", "ip": "::1", "proxy": "" }, "message_data": {

"component": "sec_level_selected", "producer": "SELECT Audit",

"message": " H level sec data retrieved", "map": { "FOR ": "fred"

} } },

如果我运行select * from FROM `test_sel_audit`.`info_cat_test`;

如果我为这种类型的SQL事件(读)设置了一个审计过滤器,我可以看到表数据被访问了——但是正如您所看到的,我不知道fred是否被选中了。{ "timestamp": "2020-08-24 18:47:07", "id": 2, "class": "general",

"event": "status", "connection_id": 10, "account": { "user":

"root", "host": "localhost" }, "login": { "user": "root", "os":

"", "ip": "::1", "proxy": "" }, "general_data": { "command":

"Query", "sql_command": "select", "query": "select * FROM

`test_sel_audit`.`info_cat_test`\nLIMIT 0, 1000", "status": 0 } },

当然,我并不想让用户看到审计调用。因此,让我们创建一个简单的视图,并将emit审计函数移动到select的where部分,从而使其透明。create view audit_cat_test as SELECT `info_cat_test`.`id`,

`info_cat_test`.`name`,

`info_cat_test`.`desc`,

`info_cat_test`.`sec_level`

FROM `test_trigger`.`info_cat_test`

where

length(IF(`info_cat_test`.`sec_level`= 'H',

audit_api_message_emit_FN(name),

CAST('NA' as CHAR))) = 2;

保持视图简单,以确保WHERE子句执行audit_api_message_emit_FN函数。

现在我可以运行视图select * from audit_cat_test;

快速查看审计日志,我发现可以访问Fred。{ "timestamp": "2020-08-25 13:58:11", "id": 2, "class": "message",

"event": "user", "connection_id": 10, "account": { "user": "root",

"host": "localhost" }, "login": { "user": "root", "os": "", "ip":

"localhost", "proxy": "" }, "message_data": { "component":

"sec_level", "producer": "audit_selected", "message": "Sensitive

Data Selected", "map": { "FOR ": "fred" } } },

结论

还有其他方法可以将audit_api_message_emit_udf()中的选定数据推送到MySQL审计流中。这只是一种可能且简单的方法。

在后续博客中,我将提供一个简单的示例来审计表上敏感机密数据的更改(更新,插入和删除)。

与往常一样,感谢您使用MySQL。

感谢您关注“MySQL解决方案工程师”!

26a27f8d007630c2ce1e1669450abcb9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值