MySQL datamasking using ProxySQL
前言
操作环境一览:
- 操作系统: CentOS7
- MySQL: 5.5
- ProxySQL: 1.4.9
- ProxySQL主机IP: 192.168.48.100
- MySQL主库IP: 192.168.48.120
场景
描述
- 一张带有信用卡信息(faked)等敏感信息的顾客表,
- 开发、测试用户并不真正需要信用卡号的等敏感信息。
需求
- 开发测试用户能够通过ProxySQL访问数据
- 开发测试用户能够访问所有列,但是带有敏感信息的需要隐藏
- 开发测试用户不能在特定表上执行SELECT *操作
顾客表示例:
1 | +----+-----------+-------------+------------+------------------+----------+ |
我们可以在后端mysql主库上(192.168.48.120)创建该测试顾客表:
- 创建账号
1 | CREATE USER 'proxysql'@'192.168.48.120' IDENTIFIED BY '123456'; |
- 创建表
1 | create database test; |
- 授权
1 | GRANT ALL ON test.customers TO 'proxysql'@'192.168.48.120'; |
ProxySQL
安装ProxySQL
1 | proxysql需要依赖一些perl库,所以使用yum安装 |
启动ProxySQL
1 | /etc/init.d/proxysql start |
添加后端的mysql主机
将mysql服务器ip换成你的mysql服务器ip
1 | ProxySQL> INSERT INTO mysql_servers(hostgroup_id,hostname,port) |
添加可以访问后端主机的账号
在mysql主库(192.168.48.120)中添加账号proxysql及密码,以及授权
1 | GRANT ALL ON *.* TO 'proxysql'@'192.168.48.120' IDENTIFIED BY '123456'; |
在proxysql主机的mysql_users表中添加刚才创建的账号,proxysql客户端需要使用这个账号来访问数据库。
- default_hostgroup默认组设置为写组,也就是1
- 当读写分离的路由规则不符合时,会访问默认组的数据库
- 将刚才我们修改的数据加载至RUNTIME中(参考ProxySQL的多层配置结构):
1 | load mysql users to runtime; |
DataMasking
ProxySQL有查询重写(Query Rewrite)功能,如果你想要重写查询,你必匹配查询的原始语句(使用match_pattern),因为原始查询语句需要被重写。
添加查询规则
1 | ProxySQL> INSERT INTO mysql_query_rules (rule_id,active,username,match_pattern,error_msg) |
- 另开一个终端,以6033端口(数据端口)登录:
1 | mysql -uproxysql -p123456 -h 192.168.48.100 -P 6033 |
- 执行SELECT *操作:
1 | mysql> select * from test.customers; |
Yeah!我们根据配置的mysql_query_rules成功阻断了对customers表上的SELECT*
操作.
- 我们再在管理连接中插入如下一条查询规则:
1 | ProxySQL> INSERT INTO mysql_query_rules (rule_id,active,username,match_pattern,replace_pattern,apply) |
WOOhoo!我们成功实现了只显示卡号后4位!
- 保存规则到磁盘
1 | ProxySQL> SAVE MYSQL QUERY RULES TO DISK; |
更多
我们需要对更多的表和字段做更多的datamasking(例如姓名字段做隐藏等),我们就需要编写更多的查询规则(mysql_query_rules),并在管理连接中添加到mysql_query_rules表中.