? 作者:微枫
Micromaple? 主页:欢迎关注Micromaple
? 简介:Java程序员、后端全栈工程师
? 点赞?➕收藏⭐➕留言? 您的支持就是我前进的动力???
大家好,我是微枫
Micromaple,下面是我的Mycat系列专栏(持续更新ing),有喜欢的小伙伴欢迎订阅学习呀? 深入学习Mycat
✨ Mycat系列专栏:点我学习
? Mycat主从搭建、读写分离:点我学习
? Mycat实现分库分表:点我学习
? Mycat实现单库水平分表、按月分表:点我学习
? Mycat高可用方案-HAProxy+Keepalived:点我学习
目录
一、?权限配置
1.1、user标签权限控制
目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xml 的 user 标签进行配置。
server.xml的 user部分标签例子:
<user name="mycat" defaultAccount="true"> <property name="password">
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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | +--------+------------+-------------+-----------+ 10 rows in set (0.09 sec) - 执行插入数据
SQLinsert 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 -p -h 192.168.110.145 -P8066 - 切换到
TESTDB数据库use TESTDB; - 查询
orders数据mysql> select * from orders; +--------+------------+-------------+-----------+ | id | order_type | customer_id | amount | +--------+------------+-------------+-----------+ | 1 | 101 | 100 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | +--------+------------+-------------+-----------+ 10 rows in set (0.01 sec) - 执行插入数据
SQLinsert 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">
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 -p -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"> 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 -p -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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | 7 | 101 | 101 | 10000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | 7 | 101 | 101 | 10000.00 | | 8 | 101 | 101 | 10000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 102 | 101 | 1000.00 | | | 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 ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ff inet 192.168.110.146/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe30:ff90/64 scope link valid_lft forever preferred_lft forever # mycat用户登录Mycat root@ubuntu-mysql-master:~# mysql -umycat -p -h 192.168.110.145 -P8066 mysql: [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 1 Server version: 5.6.29-mycat-1.6.7.6-release-810 MyCat Server (OpenCloudDB) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> - 在此主机换
user用户登录,禁止访问。如下:# 查看IP地址 root@ubuntu-mysql-master:~# ip addr show ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ff inet 192.168.110.146/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe30:ff90/64 scope link valid_lft forever preferred_lft forever # user用户登录Mycat root@ubuntu-mysql-master:~# mysql -uuser -puser -h 192.168.110.145 -P8066 mysql: [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 ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c6:3f:01 brd ff:ff:ff:ff:ff:ff inet 192.168.110.148/24 brd 192.168.110.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fec6:3f01/64 scope link valid_lft forever preferred_lft forever # mycat用户登录Mycat root@ubuntu-mysql-master2:~# mysql -umycat -p -h 192.168.110.145 -P8066 mysql: [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 -p -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,期待你的关注???
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202560.html原文链接:https://javaforall.net
