面临的挑战

通常,涉及到敏感信息时用户需要使用审计日志。不仅仅是在表上运行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的版本。

mysqlsh

mysqlsh> \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 -p

INSTALL COMPONENT "file://component_audit_api_message_emit";

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

vi /etc/my.cnf

plugin-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`;


如您所见,当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 8.0中的分类数据查询? :https://mp.weixin.qq.com/s/AjRXMhM40y8OfcE6MHz5Hg

审计MySQL 8.0中的分类数据查询相关推荐

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

    作者:Mike Frank  译:徐轶韬 面临的挑战 使用敏感信息时您需要拥有审计日志.通常,此类数据将包含一个分类级别作为行的一部分,定义如何处理.审计等策略.在之前的博客中,我讨论了如何审计分类数 ...

  2. PA 2.0 中的动态类型安全查询

    JPA 2.0 中的动态类型安全查询 如何通过 Criteria API 构建动态查询并减少运行时失败 如果编译器能够对查询执行语法正确性检查,那么对于 Java 对象而言该查询就是类型安全的.Jav ...

  3. mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  4. MySQL 8.0中的JSON增强

    点击上方"蓝字" 关注我们,享更多干货! 现在很多应用环境中都能看到JSON灵活的影子.各阶段数据层次的递归层次,能很好的分辨.一直对MySQL的JSON很期待的,最近才有时间研究 ...

  5. 演讲实录:MySQL 8.0 中的复制技术

    在近期的第七届数据技术嘉年华上,甲骨文MySQL研发工程师宋利兵做了"MySQL-8.0中的复制技术"为主题的演讲,介绍了MySQL-8.0中异步复制和Group Replicat ...

  6. mysql 8.0空间索引_牛逼!MySQL 8.0 中的索引可以隐藏了…

    MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...

  7. mysql屏蔽_MySQL中的企业数据屏蔽

    mysql屏蔽 In this article, I am going to explain Data Masking feature in MySQL. The data masking is th ...

  8. docker mysql8.0挂载_Docker安装MySQL 8.0.17 并挂载数据及配置文件,修改时区

    一般来说是不需要手动指定MySQL挂载卷,因为mysql会自动挂载, 通过 dokcer inspect 你的容器名称 可以查看容器已挂载的路径 /var/lib/docker/volumes/855 ...

  9. MySQL 8.0 执行 insert 插入数据非常缓慢的问题及解决方法

    同样的代码,在MySQL5.7上表现非常不错,到了8.0就慢得难以接受.原因是MySQL 8.0一些设置是默认开启的(5.7是默认关闭的),而这些设置有可能会严重影响数据库性能. 本题中,影响插入效率 ...

最新文章

  1. 大型网站架构系列:缓存在分布式系统中的应用(一)
  2. TLD文件中body-content四种类型(能力工场)
  3. IDEA中无法import自己工程中类的问题解决方法
  4. python画图三维-Python三维绘图之Matplotlib库的使用方法
  5. 回归Dos操作的快感,进入PowerShell世界 (转)
  6. Java bitset转string_JAVA 假如String01010 我要怎样把它转成bitset?
  7. mac 上开发需要的软件
  8. response 200是什么意思 python_鹿晨晖一组做了200次坐姿腿屈伸,他什么意思?
  9. java中提示peerbytes_Java中synchronized详解
  10. Luogu P2068 统计和
  11. Servlet--ListenerFilter
  12. c++语言 进行验证码识别,C++ 借助 Tesseract-OCR 识别乐讯新版验证码
  13. excel制作简单账本
  14. 应届毕业生,只会抄代码,该怎么办?
  15. 新东方托福词汇(List 01 ~ List 05)
  16. 经典的日语歌曲被翻唱成国语
  17. html作业介绍家乡,dreamweaver网页大作业 我的家乡
  18. Line 10: Char 40: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in ty
  19. 【机器学习】之 主成分分析PCA
  20. android手机主流机型

热门文章

  1. 新手福音,机器学习工具Sklearn 中文文档 0.19版(最新)
  2. python计算一定期间的涨幅_python数据分析与挖掘(十一)--- ndarray运算
  3. u盘读写测试_aigo U395固态U盘评测,速度可能会吓到你,价格很良心
  4. centos8安装mysql5.5_CentOS 6.8 编译安装MySQL5.5.32 (二 多实例)
  5. abb工业机器人电压不稳_ABB工业机器人应用常见故障九问九答
  6. 数据结构排序系列详解之四 快速排序
  7. shell脚本作为保证PHP脚本不挂掉的守护进程实例
  8. Oracle Data Guard (RAC+DG) 归档删除策略及脚本
  9. HttpURLConnection上传文件(图片)小试
  10. c语言蓝桥删除多余的括号,蓝桥杯 括号问题