作者:微枫
Micromaple
主页:欢迎关注Micromaple
简介:Java程序员、后端全栈工程师
点赞➕收藏⭐➕留言 您的支持就是我前进的动力
大家好,我是微枫
Micromaple
,下面是我的Mycat
系列专栏(持续更新ing),有喜欢的小伙伴欢迎订阅学习呀深入学习Mycat
✨ Mycat系列专栏:点我学习
Mycat主从搭建、读写分离:点我学习
Mycat实现分库分表:点我学习
Mycat实现单库水平分表、按月分表:点我学习
Mycat高可用方案-HAProxy+Keepalived:点我学习
目录
- 一、权限配置
- 1.1、user标签权限控制
- 测试案例
- 案例一
- 案例二
- 1.2、privileges 标签权限控制
- 测试案例
- 案例一
- 案例二
- 二、SQL 拦截
- 2.1、白名单
- 2.2、黑名单
- 黑名单 SQL 拦截功能属性列表
一、权限配置
1.1、user标签权限控制
目前 Mycat
对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xml
的 user
标签进行配置。
server.xml
的 user
部分标签例子:
<user name="mycat" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property><property name="defaultSchema">TESTDB</property></user><user name="user"><property name="password">user</property><property name="schemas">TESTDB</property><property name="readOnly">true</property><property name="defaultSchema">TESTDB</property></user>
配置说明
name
:应用连接中间件逻辑库的用户名password
:该用户名对应的密码schemas
:应用当前连接的逻辑库中所对应的逻辑表。可以配置一个或多个,多个使用,
分开readOnly
:是否只读
测试案例
案例一
使用user
用户,权限为只读,即readOnly: true
。验证是否可以查询和写入数据。
使用
user
用户登录,运行命令如下mysql -uuser -puser -h 192.168.110.145 -P8066
切换到
TESTDB
数据库use TESTDB;
查询
orders
数据mysql> select * from orders;+--------+------------+-------------+-----------+| id | order_type | customer_id | amount|+--------+------------+-------------+-----------+|1 |101 | 100 | 100100.00 ||2 |101 | 100 | 100300.00 ||6 |102 | 100 | 100020.00 ||3 |101 | 101 | 120000.00 ||4 |101 | 101 | 103000.00 ||5 |102 | 101 | 100400.00 || 400100 |102 | 101 | 1000.00 || 400101 |102 | 101 | 1000.00 || 400200 |102 | 101 | 1000.00 || 400201 |102 | 101 | 1000.00 |+--------+------------+-------------+-----------+10 rows in set (0.09 sec)
执行插入数据
SQL
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
可以看到运行结果,插入失败,用户只有只读权限,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);ERROR 1495 (HY000): User readonly
案例二
使用mycat
用户,权限为可读可写,即readOnly: false
。验证是否可以查询和写入数据。
使用
mycat
用户登录,运行命令如下mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到
TESTDB
数据库use TESTDB;
查询
orders
数据mysql> select * from orders;+--------+------------+-------------+-----------+| id | order_type | customer_id | amount|+--------+------------+-------------+-----------+|1 |101 | 100 | 100100.00 ||2 |101 | 100 | 100300.00 ||6 |102 | 100 | 100020.00 ||3 |101 | 101 | 120000.00 ||4 |101 | 101 | 103000.00 ||5 |102 | 101 | 100400.00 || 400100 |102 | 101 | 1000.00 || 400101 |102 | 101 | 1000.00 || 400200 |102 | 101 | 1000.00 || 400201 |102 | 101 | 1000.00 |+--------+------------+-------------+-----------+10 rows in set (0.01 sec)
执行插入数据
SQL
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
可看到运行结果,插入成功,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);Query OK, 1 row affected (0.02 sec)
1.2、privileges 标签权限控制
在 user
标签下的 privileges
标签可以对逻辑库(schema
)、表(table
)进行精细化的 DML
权限控制。
privileges
标签下的 check
属性,如为 true
开启权限检查,为 false
不开启,默认为 false
。
由于 Mycat
一个用户的 schemas
属性可配置多个逻辑库(schema
) ,所以 privileges
的下级节点 schema
节点同样可配置多个,对多库多表进行细粒度的 DML
权限控制。
server.xml
的 privileges
部分标签,进行配置orders
表没有增删改查权限
<user name="mycat" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property><property name="defaultSchema">TESTDB</property><privileges check="true"><schema name="TESTDB" dml="1111" ><table name="orders" dml="0000"></table><!--
--></schema></privileges></user>
参数配置说明:
check
:是否开启DML
权限设置配置说明如下
DML 权限 | 增加(insert) | 更新(update) | 查询(select) | 删除(delete) |
---|---|---|---|---|
0000 | ❌ | ❌ | ❌ | ❌ |
0010 | ❌ | ❌ | ⭕ | ❌ |
1110 | ⭕ | ❌ | ❌ | ❌ |
1111 | ⭕ | ⭕ | ⭕ | ⭕ |
测试案例
案例一
使用mycat
用户,privileges
配置orders
表权限为禁止增删改查(dml="0000"
),验证是否可以查询出数据,验证是否可以写入数据。
重启
Mycat
,使用mycat
用户登录,命令如下:mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到
TESTDB
数据库use TESTDB;
查询
orders
数据select * from orders;
可以看到禁止该用户查询数据,如下:
mysql> select * from orders;ERROR 3012 (HY000): The statement DML privilege check is not passed, reject for user 'mycat'
执行插入数据
SQL
,如下:insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
可看到运行结果,禁止该用户插入数据,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);ERROR 3012 (HY000): The statement DML privilege check is not passed, reject for user 'mycat'
案例二
使用mycat
用户,privileges
配置orders
表权限为可以增删改查(dml="1111"
),验证是否可以查询出数据,验证是否可以写入数据。
修改配置文件
server.xml
的name
为mycat
的user
标签部分。内容如下:<user name="mycat" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property><property name="defaultSchema">TESTDB</property><privileges check="true"><schema name="TESTDB" dml="1111" ><table name="orders" dml="1111"></table><!--
--></schema></privileges></user>
重启
Mycat
,使用mycat
用户登录,命令如下:mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到
TESTDB
数据库use TESTDB;
查询
orders
数据select * from orders;
可以看到查询数据,如下:
mysql> select * from orders;+--------+------------+-------------+-----------+| id | order_type | customer_id | amount|+--------+------------+-------------+-----------+|1 |101 | 100 | 100100.00 ||2 |101 | 100 | 100300.00 ||6 |102 | 100 | 100020.00 ||3 |101 | 101 | 120000.00 ||4 |101 | 101 | 103000.00 ||5 |102 | 101 | 100400.00 ||7 |101 | 101 |10000.00 || 400100 |102 | 101 | 1000.00 || 400101 |102 | 101 | 1000.00 || 400200 |102 | 101 | 1000.00 || 400201 |102 | 101 | 1000.00 |+--------+------------+-------------+-----------+11 rows in set (0.07 sec)
执行插入数据
SQL
,如下:insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
可看到运行结果,插入成功,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);Query OK, 1 row affected (0.01 sec)mysql> select * from orders;+--------+------------+-------------+-----------+| id | order_type | customer_id | amount|+--------+------------+-------------+-----------+|1 |101 | 100 | 100100.00 ||2 |101 | 100 | 100300.00 ||6 |102 | 100 | 100020.00 ||3 |101 | 101 | 120000.00 ||4 |101 | 101 | 103000.00 ||5 |102 | 101 | 100400.00 ||7 |101 | 101 |10000.00 ||8 |101 | 101 |10000.00 || 400100 |102 | 101 | 1000.00 || 400101 |102 | 101 | 1000.00 || 400200 |102 | 101 | 1000.00 || 400201 |102 | 101 | 1000.00 |+--------+------------+-------------+-----------+12 rows in set (0.00 sec)
二、SQL 拦截
firewall
标签用来定义防火墙;firewall
下 whitehost
标签用来定义 IP
白名单 ,blacklist
用来定义SQL
黑名单。
2.1、白名单
可以通过设置白名单,实现某主机某用户可以访问 Mycat
,而其他主机用户禁止访问。
设置白名单步骤如下:
修改
server.xml
配置文件firewall
标签。配置只有192.168.110.146
主机可以通过mycat
用户访问<firewall><whitehost><host host="192.168.110.146" user="mycat"/></whitehost></firewall>
host
:IP
白名单user
:允许访问的用户
重启
Mycat
后,在192.168.110.146
主机使用mycat
用户访问,可以正常访问。如下:# 查看IP地址root@ubuntu-mysql-master:~# ip addr show ens332: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ffinet 192.168.110.146/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe30:ff90/64 scope linkvalid_lft forever preferred_lft forever# mycat用户登录Mycatroot@ubuntu-mysql-master:~# mysql -umycat -p123456 -h 192.168.110.145 -P8066mysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor.Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.6.29-mycat-1.6.7.6-release-20220524173810 MyCat Server (OpenCloudDB)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
在此主机换
user
用户登录,禁止访问。如下:# 查看IP地址root@ubuntu-mysql-master:~# ip addr show ens332: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ffinet 192.168.110.146/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe30:ff90/64 scope linkvalid_lft forever preferred_lft forever# user用户登录Mycatroot@ubuntu-mysql-master:~# mysql -uuser -puser -h 192.168.110.145 -P8066mysql: [Warning] Using a password on the command line interface can be insecure.ERROR 1045 (HY000): Access denied for user 'user' with host '192.168.110.146'
在
192.168.110.148
主机使用mycat
用户访问,禁止访问。如下:# 查看IP地址root@ubuntu-mysql-master2:~# ip addr show ens332: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:c6:3f:01 brd ff:ff:ff:ff:ff:ffinet 192.168.110.148/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec6:3f01/64 scope linkvalid_lft forever preferred_lft forever# mycat用户登录Mycatroot@ubuntu-mysql-master2:~# mysql -umycat -p123456 -h 192.168.110.145 -P8066mysql: [Warning] Using a password on the command line interface can be insecure.ERROR 1045 (HY000): Access denied for user 'mycat' with host '192.168.110.148'
2.2、黑名单
可以通过设置黑名单,实现 Mycat
对具体 SQL
操作的拦截,如增删改查等操作的拦截。
设置黑名单步骤如下:
修改
server.xml
配置文件firewall
标签。配置禁止mycat
用户进行删除操作。<firewall><whitehost><host host="192.168.110.146" user="mycat"/></whitehost><blacklist check="true"><property name="deleteAllow">false</property></blacklist></firewall>
check
:是否开启白名单deleteAllow
:是否允许执行DELETE
语句
重启
Mycat
后,在192.168.110.146
主机使用mycat
用户访问。mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到
TESTDB
数据库use TESTDB;
执行删除语句
delete from orders where id=7;
运行后发现禁止删除数据,如下:
mysql> delete from orders where id=7;ERROR 3012 (HY000): The statement is unsafe SQL, reject for user 'mycat'
黑名单 SQL 拦截功能属性列表
配置项 | 默认值 | 描述 |
---|---|---|
selelctAllow | true | 是否允许执行 SELECT 语句 |
deleteAllow | true | 是否允许执行 DELETE 语句 |
updateAllow | true | 是否允许执行 UPDATE 语句 |
insertAllow | true | 是否允许执行 INSERT 语句 |
createTableAllow | true | 是否允许创建表 |
setAllow | true | 是否允许使用 SET 语法 |
alterTableAllow | true | 是否允许执行 Alter Table 语句 |
dropTableAllow | true | 是否允许修改表 |
commitAllow | true | 是否允许执行 commit 操作 |
rollbackAllow | true | 是否允许执行 roll back 操作 |
读到这里,想必你对
Mycat
安全设置的认识清晰了不少,别忘了三连支持博主呀,我是微枫micromaple
,期待你的关注