mysql8审计_审计对存储在MySQL 8.0中的分类数据的更改
作者:Mike Frank ?譯:徐軼韜
面臨的挑戰
使用敏感信息時您需要擁有審計日志。通常,此類數據將包含一個分類級別作為行的一部分,定義如何處理、審計等策略。在之前的博客中,我討論了如何審計分類數據查詢。本篇將介紹如何審計對機密數據所做的數據更改。
敏感數據可能被標記為–高度敏感
最高機密
分類
受限制的
需要清除
高度機密
受保護的
合規要求通常會要求以某種方式對數據進行分類或標記,并審計該數據上數據庫中的事件。特別是對于可能具有數據訪問權限但通常不應查看某些數據的管理員。
敏感數據可以與帶有標簽的數據穿插在一起,例如公開
未分類
其他
當然,您可以在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)
> mysqlshmysql> select @@version;
> 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
有關審計選項和變量的更多詳細信息,請參考審計日志手冊。
重新啟動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 ROW
BEGIN
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 ROW
BEGIN
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 ROW
BEGIN
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解決方案工程師”!
總結
以上是生活随笔為你收集整理的mysql8审计_审计对存储在MySQL 8.0中的分类数据的更改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql php释放内存_php my
- 下一篇: 八数码c语言编程深度搜索,广度优先搜索解