专栏首页FreeBuf通过MySQL-Proxy实现MySQL数据库的认证、授权与审计

通过MySQL-Proxy实现MySQL数据库的认证、授权与审计

0x00 前言

年初的时候从猪厂圆满毕业,入职了一家小公司组建“一个人的信息安全部”。正如同市面上大多数小公司一样,没有专职的DBA来抓数据库的工作,因此会有一批人时不时地突然跑过来求爷爷告奶奶似的要访问XX数据库。(本文代码略多,可阅读原文更方便查看)

这种状况一次两次勉强可以接受,总来的话数据库里面的账号就会越来越多,账号授权也是一个蛋疼的工作。特别是还会有“mysql从删库到跑路”的问题,员工离职删除账号也会十分的麻烦。对于财大气粗的财阀来说这个问题很好解决,买一套设备就好了,但是对于创业公司要力争做到“零元党”,不然也没办法完全体现出自己的价值。

0x01 调研

最初的想法是对开源mysql的代理工具做一次二次开发,于是乎开始搜集类似工具的资料。无意中发现mysql-proxy居然预留了6个钩子允许用户通过Lua脚本去调用他们,也就是说我们可以自行编写Lua脚本来掌握“用户的命运”。

connect_server() 当代理服务器接受到客户端连接请求时会调用该函数 read_handshake() 当mysql服务器返回握手相应时会被调用 read_auth() 当客户端发送认证信息时会被调用 read_auth_result(aut) 当mysql返回认证结果时会被调用 read_query(packet) 当客户端提交一个sql语句时会被调用 read_query_result(inj) 当mysql返回查询结果时会被调用

显然,通过上述的read_auth和read_query两个钩子函数,我们可以实现对mysql数据库的认证、授权和审计的工作。

0x02 设计

我们的目标是认证、授权和审计,那么read_auth函数可以实现认证和授权,read_query可以实现审计的功能。read_query比较容易实现,只需要get到用户发来的sql语句写到消息队列里就好了,我这里就简单地写到redis的list中。

read_auth函数就要相对复杂些,不仅需要对用户提交的一次性password进行校验,还需要读取授权信息,让用户登录到mysql的时候华丽的变身成为我们指定的身份。

1.用户访问Openresty,后端的lua脚本会调用公司内部使用的im软件的消息接口,将生成的一次性口令发送给用户。与此同时,也会将该口令写入redis。

2.用户使用mysql客户端连接指定的mysql-proxy,此时进入read_auth钩子函数,先对用户提交的口令进行确认。然后会去redis请求当前数据库对应developer、master、owner三个role的授权名单,查看三个名单中是否含有当前用户,如果有则将用户以其对应的role跳转到数据库上。

3.当认证授权成功结束后,用户通过上一步授权的role来访问后端mysql,并且执行的所有sql语句都会进入read_query钩子函数被记录到redis的队列中。

0x03 代码

0x04 效果

显然,使用用户名test登录mysql-proxy,最终跳转到mysql上时用户已经变为developer。

0x05 总结

用于非业务场景连接数据库,比如开发运维人员在公司连接数据库。

管理脚本需要监控每个mysql-proxy进程的状态,负责他们的启动和停止,以及将他们的域名解析为ip存入redis中。

授权脚本读取一个yaml文件,将文件中的授权规则同步到redis中。

每个数据库中都只需要新建developer、master、owner三个账号,yaml配置文件中的内容决定用户使用以上哪种role登录到mysql。

mysql-proxy需要使用源码编译安装。

启动mysql-proxy的命令为:

参考文章

http://www.mamicode.com/info-detail-1377900.html https://blog.csdn.net/newzzorg/article/details/8743775?utm_source=tuicool

* 本文作者:SixSixSix,转载注明来自FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Docker构建安全的虚拟空间

    *本文作者:Li4n06,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

    FB客服
  • SHA1碰撞衍生出的BitErrant攻击

    本文将给大家介绍BitErrant攻击,这是由SHA1碰撞衍生出来的一种攻击技术,当SHA1碰撞成为现实,一切皆有可能发生。 ? BitErrant是一种非常有...

    FB客服
  • 西部数据NAS设备被曝存在硬编码后门和未授权文件上传高危漏洞

    近日,GulfTech公司安全研究员James Bercegay发现,西部数据(Western Digital)旗下多个MyCloud系列网络存储设备(WDMy...

    FB客服
  • 在容器中部署mysql与数据持久化

    通过上一节的学习,我们知道了如何部署一个不带数据库的静态nginx页面;但一般的web应用中,还需要部署mysql数据库,本节我们将学习如何使用容器部署mysq...

    企鹅号小编
  • CentOS下的Mysql的安装和使用

    1.使用安装命令 :yum -y install mysql mysql-server mysql-devel 安装完成却发现Myserver安装缺失,在网上找...

    庞小明
  • MySQL 5.7 常用命令

    $ mysql -uroot -p mysql>set password=password('your_passord');

    bsbforever
  • mysqlbinlog命令详解MySQL 5.7 常用命令

    $ mysql -uroot -p mysql>set password=password('your_passord');

    bsbforever
  • MySQL Galera Cluster全解析 Part 5 Galera Cluster软件安装

    MySQL Galera Clusters全解析 Part 1 Galera Cluster 简介

    bsbforever
  • 在docker中使用MySQL数据库

    我是一直想把所有的程序都跑在docker里面,这样一方面是为了便于管理,另外一方面也可以增强自己对docker的理解,所以今天我就想学习一下最重要的数据库部分

    bboysoul
  • mysql基本操作以及python控制mysql(1)–环境安装

    学习了虫师的博文,最近准备将人脸识别器提升到网站阅读签到信息的状态。所以打算将识别器获取的签到信息再放到数据库中,so。。加油么么哒。。

    十四君

扫码关注云+社区

领取腾讯云代金券