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解决方案工程师”!

93a8c21bd255309bfb5c7d6243ab297d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序读取服务器多个数组,微信小程序多层嵌套循环,二级数组遍历

小程序中的遍历循环类似于angularJS的遍历。二级数组遍历有一个坑。二级遍历wx:for循环的时候,需要注意。(代码如下)JS代码:data: {groups: [[{title: 狼图腾,cover: ../../img/mineBG.png},{title: 狼图腾,cover: ../../img/mineBG.png},],[…

mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...

这里的问题是不同MySQL服务器版本之间的语法差异。看来MySQL Workbench 8.0.12是CREATE UNIQUE INDEXMySQL服务器版本8.0的自动生成语句。在MySQL Server 8.0文档中,其语法为CREATE INDEX:CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name [index…

辐射避难所买了东西显示服务器异常,《辐射:避难所》常见问题汇总

Q:如何啪啪啪?A:首先需要一个起居室(LIVINGQUARTERS),规模等级随意,至少有一名成年男性与女性.其次之间不能有血缘关系.然后男女之间会相互对话聊天,注意看对话,如果出现nothing … with family…等字眼就是说明有血缘关系,否则一定时间后他们就会一起跳舞,再然后就是啪啪啪了…

mysql订单详情的设计_订单功能模块设计与实现

在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表,点击提交订单后,生成…

mysql放开权限控制_mysql06---权限控制-阿里云开发者社区

mysql权限管理:mysql的权限控制,首先在user表判断有没有权限连,连上后看有没有全局权限。然后看db表有哪些库级别的权限。然后看tables_priv表有哪些表级别的权限。最后还可以看有哪些列级别的权限。mysql权限检查:1.有没有权连接…

mysql php释放内存_php mysqli_free_result()函数释放结果集

mysqli_free_result()介绍php mysqli_free_result()函数用于释放查询出来的数据结果集,这样有利于及时清理内存。语法:mysqli_free_result(result);参数:参数描述result必需。数据结果集(由mysqli_query()所返回)mysqli_free_result()实例1、…

mysql乱码问题_mysql乱码问题

mysql乱码问题出现乱码的原因:因为当前的CMD客户端窗口与数据库本身及库,表的编码格式不一致导致的。所以当出现乱码的时候,请排查:* sql文件的编码格式* 当前CMD客户端窗口的编码格式* 数据库服务本身的编码格式* 数据库的编码格…

mysql的纵向扩展方案_SQL Server横向扩展方案-SODA

SQL Server横向扩展方案-SODA每次在提到SQL Server扩展性问题的时候,似乎很多的SQL Server DBA或者使用微软技术开发的朋友心里总是一整痛:SQL Server只能纵向的扩展(Scaling-Up),无法横向的扩展(Scaling-Out)。每次有人提到Oracle和SQL Serv…

python的功能名称_ML获取功能选择后的功能名称SelectPercentile,python

我已经为这件事挣扎了一段时间了。我的目标是获取一个文本特征,并从中找出5-10个最好的单词来帮助我分类。因此,我正在运行一个TfIdfVectorizer,现在选择~90最佳。然而,当我缩小了特性数量之后,我无法看到实际选择了哪…

python编程竞赛规则_用python实行羽毛球比赛规则。

羽毛球比赛规则:1、21分制,三局两胜为佳2、每球得分制3、每回合中取胜的一方的一分4、双方均为20分时,领先对方2分一方获胜5、双方均为29分时,先到达30分一方获胜6、一局比赛中获胜方在下一局率先开球代码如下:from ra…

使用python下载文件的简单示例_Python

简单的FTP下载 ,不加任何异常判断。import osfrom ftplib import FTPftp_addr 10.10.0.1fFTP(ftp_addr)f.login(anonymous)f.cwd("apk_download/")remote_file 20141223140651.apkf.retrbinary("RETR %s" % remote_file, open(remote_file, &…

mysql8.0.11启动不了_8.0.11版本Mysql遇到MySQL 服务无法启动的解决方法

转:https://blog.csdn.net/iyayaqiqi/article/details/80536110系统环境:win10(1803),64位MySQL版本:8.0.11免安装版MySQL下载地址:https://dev.mysql.com/downloads/mysql,在下载页面往下拉,选择自己的操作…

mysql 建立索引的例子_mysql建立合适的索引的例子

在mysql数据库中,其实建索引也是一门学问,一个表中,索引并不是越多越好,而是适合你的业务才最重要。那么建立索引的时候,我们应该从以下几点去考量。1. 索引字段越小越好,像varchar(10)肯定比text类型的效果…

mysql有没有类似merge_有关于Mysql的MERGE表类型

有关于Mysql的MERGE表类型他将多个表在逻辑上当作一个表来查询。他建立后有两个文件,.frm 表结构定义.mrg union表的名字清单两个基本表:CREATE TABLE TEST_MERGE_1(ID INT(5) NOT NULL,VALUE VARCHAR(100) NOT NULL,PRIMARY KEY(ID))CREATE TABLE TEST_MERGE_2(ID …

python爬虫数据可视化软件_python爬虫及数据可视化分析

1.前言本篇文章主要介绍python爬虫及对爬取的数据进行可视化分析,本次介绍所用的网站是(https://www.duanwenxue.com/jingdian/zheli/)2.数据爬取2.1定位到爬取数据打开我们要爬取的网页,右键选择检查,在窗口中单击左上角箭头,即可…

mysql同表字段前4位复制_MySQL不同表之前的字段复制

有时候,我们需要复制某个字段一整列的数据到另外一个新的字段中,这很简单,SQL可以这么写:UPDATE tb_1 SET content_target content_source;大概写法如下:Update {your_table} set {source_field} {object_field} WHE…

php mysql购物车实现原理_PHP实现购物车的思路和源码分析

这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正项目中需要添加购物车。目录说明buy.php 点击购买之后的操作car.php 购物车,显示购买的东西conn.php 数据库连接参数delete.php 删除…

java 文件目录_Java——文件及目录File操作

packagefile;importjava.io.File;/*** 删除文件和目录**/public classDeleteFileUtil {/*** 删除文件,可以是文件或文件夹**paramfileName* 要删除的文件名*return删除成功返回true,否则返回false*/public static booleandelete(String fileName) {File …

java 对象池 实现_Java对象池技术的原理及其实现

看到一片有关于java 对象基础知识,故转载一下,同时学习一下。摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式。还指出了使用对象池技术时所应注意的问题。关键词 对象池;对象池技术;Java…

java heap 参数_java heap space解决方法和JVM参数设置

因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。在网上一查可能是JAVA的堆栈设置太小的原因。跟据网上的答案大致有这两种解决方法:1、设置环境变量set JAVA_OPTS -Xms32m -Xmx512…