审计对存储在MySQL 8.0中的分类数据的更改

做者:Mike Frank  译:徐轶韬

面临的挑战

使用敏感信息时您须要拥有审计日志。一般,此类数据将包含一个分类级别做为行的一部分,定义如何处理、审计等策略。在以前的博客中,我讨论了如何审计分类数据查询。本篇将介绍如何审计对机密数据所作的数据更改。javascript


敏感数据可能被标记为–css

  •  高度敏感java

  •  最高机密mysql

  •  分类sql

  •  受限制的shell

  •  须要清除数据库

  •  高度机密api

  •  受保护的服务器

合规要求一般会要求以某种方式对数据进行分类或标记,并审计该数据上数据库中的事件。特别是对于可能具备数据访问权限但一般不该查看某些数据的管理员。微信

敏感数据能够与带有标签的数据穿插在一块儿,例如

  • 公开

  • 未分类

  • 其余

固然,您能够在MySQL Audit中打开常规的插入/更新/选择审计可是在这种状况下,您将审计全部的更改。若是您只想审计敏感数据是否已更改,下面是您能够执行的一种方法。

一个解决方法

本示例使用MySQL触发器来审计数据更改。

咱们的示例表很简单,包含id,name,desc,而且还有一个用于sec_level的附加列。咱们要审计sec_level高的行– H,H–表示已插入,更新为H或从H更新或删除。

CREATE SCHEMA test_datachange_audit;CREATE TABLE `test_datachange_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_datachange_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('1', 'fred', 'engineer', 'H');INSERT INTO `test_datachange_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('2', 'jill', 'program manager', 'M');INSERT INTO `test_datachange_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('3', 'joe', 'maintenance', 'L');

启用EE审计(要求使用企业版 –若是须要使用 MySQL shell链接显示版本信息。–您将须要MySQL EE 8.0.17或更高版本–截至本文撰写时,最新版本为8.0.22)

> mysqlsh

mysql> select @@version;

> bin/mysql -u root -p

INSTALL COMPONENT "file://component_audit_api_message_emit";

在[mysqld]中启用启动时的审计并设置选项。例如:

vi /etc/my.cnf

plugin-load-add=audit_log.soaudit-log=FORCE_PLUS_PERMANENTaudit-log-format=JSONaudit-log-strategy=SYNCHRONOUS

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

从新启动MySQL服务器。

注意:有多种方法能够启用审计而无需从新启动。可是您要强制执行审计-所以,上面是您的操做方式。

如下简单过程将用于写入我想在个人审计跟踪中拥有的审计元数据。FOR和ACTION是写入审计日志的元数据标签。在这种状况下,FOR将具备要更改其级别数据的名称,而ACTION将是在更新(以前和以后),插入或删除时使用的名称。

DELIMITER $$
CREATE PROCEDURE test_datachange_audit.audit_api_message_emit_sp(name CHAR(20), ttype CHAR(3))BEGIN DECLARE aud_msg VARCHAR(255); select audit_api_message_emit_udf('sec_level_trigger', 'TRIGGER audit_change_attempt', 'Change H level sec data', 'FOR ', name, 'ACTION',ttype ) into aud_msg;END$$DELIMITER ;

接下来,咱们须要在表格上建立触发器

DELIMITER $$
CREATE TRIGGER test_datachange_audit.audit_delete BEFORE DELETE ON `test_datachange_audit`.`info_cat_test` FOR EACH ROWBEGIN IF OLD.sec_level = 'H' THEN CALL audit_api_message_emit_sp(OLD.name,'DEL' ); END IF;END$$DELIMITER ;
DELIMITER $$CREATE TRIGGER test_datachange_audit.audit_insert BEFORE INSERT ON `test_datachange_audit`.`info_cat_test` FOR EACH ROWBEGIN IF NEW.sec_level = 'H' THEN CALL audit_api_message_emit_sp(NEW.name,'INS'); END IF;END$$DELIMITER ;
DELIMITER $$
CREATE TRIGGER test_datachange_audit.audit_update BEFORE UPDATE ON `test_datachange_audit`.`info_cat_test` FOR EACH ROWBEGIN IF OLD.sec_level = 'H' THEN CALL audit_api_message_emit_sp(OLD.name,'UPO'); END IF; IF NEW.sec_level = 'H' THEN CALL audit_api_message_emit_sp(NEW.name, 'UPN'); END IF;END$$DELIMITER ;

接下来运行在“ H”级或“ M”和“ L”级更改

请记住,只有对“ H” sec_level列进行更改时,触发器才会审计。

DELETE from `test_datachange_audit`.`info_cat_test` where id=1;
INSERT INTO `test_datachange_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('5', 'joey', 'spy', 'H');
INSERT INTO `test_datachange_audit`.`info_cat_test` (`id`, `name`, `desc`, `sec_level`) VALUES ('8', 'jessie', 'engineer', 'L');
UPDATE`test_datachange_audit`.`info_cat_test` set sec_level='H' where id=2;
UPDATE`test_datachange_audit`.`info_cat_test` set sec_level='M' where id=2;


您将看到ACTION的4个不一样标签-INS,DEL,UPN(N的意思为新的–表示没有“ H”的人已更新为“ H”)和UPO(O表示旧的–带有“ H”的人从'H'进行了更新)

如今,咱们能够在审计日志中看到它

注意:使用位置–默认状况下是您的“select @@datadir;

对于我而言,我将运行如下OS命令,并寻找sec_level_trigger来从日志中过滤掉这些审计事件。

>sudo cat /usr/local/mysql/data/audit.log | grep sec_level_trigger

{ "timestamp": "2020-11-17 20:04:32", "id": 13, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "DEL", "FOR ": "fred" } } },{ "timestamp": "2020-11-17 20:04:32", "id": 14, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "DEL", "FOR ": "joey" } } },{ "timestamp": "2020-11-17 20:04:35", "id": 2, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "INS", "FOR ": "fred" } } },{ "timestamp": "2020-11-17 20:04:45", "id": 2, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "DEL", "FOR ": "fred" } } },{ "timestamp": "2020-11-17 20:04:47", "id": 2, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "INS", "FOR ": "joey" } } },{ "timestamp": "2020-11-17 20:04:51", "id": 2, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "UPN", "FOR ": "jill" } } },{ "timestamp": "2020-11-17 20:04:54", "id": 2, "class": "message", "event": "user", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" }, "message_data": { "component": "sec_level_trigger", "producer": "TRIGGER audit_change_attempt", "message": "Change H level sec data", "map": { "Action": "UPO", "FOR ": "jill" } } },

结论

您可能会采用这种方法。这只是一个例子。一般审计其特性与数量的关系。以及有关评估审计日志内容的信息-这样您就能够发现任何滥用状况。

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


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



本文分享自微信公众号 - MySQL解决方案工程师(mysqlse)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。