🍁 作者:微枫
Micromaple
💒 主页:欢迎关注Micromaple
📌 简介:Java程序员、后端全栈工程师
🔗 点赞👍➕收藏⭐➕留言📝 您的支持就是我前进的动力💪💪💪
大家好,我是微枫
Micromaple
,下面是我的
Mycat
系列专栏(持续更新ing),有喜欢的小伙伴欢迎订阅学习呀
🚀 深入学习Mycat
✨ Mycat系列专栏:点我学习
🔥 Mycat主从搭建、读写分离:点我学习
🔥 Mycat实现分库分表:点我学习
🔥 Mycat实现单库水平分表、按月分表:点我学习
🔥 Mycat高可用方案-HAProxy+Keepalived:点我学习
目录
一、🚩权限配置
1.1、user标签权限控制
目前
Mycat
对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过
server.xml
的
user
标签进行配置。
server.xml
的
user
部分标签例子:
<username="mycat"defaultAccount="true"><propertyname="password">123456</property><propertyname="schemas">TESTDB</property><propertyname="defaultSchema">TESTDB</property></user><username="user"><propertyname="password">user</property><propertyname="schemas">TESTDB</property><propertyname="readOnly">true</property><propertyname="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|+--------+------------+-------------+-----------+10rowsinset(0.09 sec)
- 执行插入数据
SQL``````insertinto orders(id,order_type,customer_id,amount)values(7,101,101,10000);
- 可以看到运行结果,插入失败,用户只有只读权限,如下:
mysql>insertinto 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|+--------+------------+-------------+-----------+10rowsinset(0.01 sec)
- 执行插入数据
SQL``````insertinto orders(id,order_type,customer_id,amount)values(7,101,101,10000);
- 可看到运行结果,插入成功,如下:
mysql>insertinto orders(id,order_type,customer_id,amount)values(7,101,101,10000);Query OK,1row 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
表没有增删改查权限
<username="mycat"defaultAccount="true"><propertyname="password">123456</property><propertyname="schemas">TESTDB</property><propertyname="defaultSchema">TESTDB</property><!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --><!-- 表级 DML 权限设置 --><privilegescheck="true"><schemaname="TESTDB"dml="1111"><tablename="orders"dml="0000"></table><!-- <table name="tb02" dml="1111"></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 checkisnot passed, reject foruser'mycat'
- 执行插入数据
SQL
,如下:insertinto orders(id,order_type,customer_id,amount)values(8,101,101,10000);
- 可看到运行结果,禁止该用户插入数据,如下:
mysql>insertinto orders(id,order_type,customer_id,amount)values(8,101,101,10000);ERROR 3012(HY000): The statement DML privilege checkisnot passed, reject foruser'mycat'
案例二
使用
mycat
用户,
privileges
配置
orders
表权限为可以增删改查(
dml="1111"
),验证是否可以查询出数据,验证是否可以写入数据。
- 修改配置文件
server.xml
的name
为mycat
的user
标签部分。内容如下:<username="mycat"defaultAccount="true"><propertyname="password">123456</property><propertyname="schemas">TESTDB</property><propertyname="defaultSchema">TESTDB</property><!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --><!-- 表级 DML 权限设置 --><privilegescheck="true"><schemaname="TESTDB"dml="1111"><tablename="orders"dml="1111"></table><!-- <table name="tb02" 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|+--------+------------+-------------+-----------+11rowsinset(0.07 sec)
- 执行插入数据
SQL
,如下:insertinto orders(id,order_type,customer_id,amount)values(8,101,101,10000);
- 可看到运行结果,插入成功,如下:
mysql>insertinto orders(id,order_type,customer_id,amount)values(8,101,101,10000);Query OK,1row 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|+--------+------------+-------------+-----------+12rowsinset(0.00 sec)
二、🚧SQL 拦截
firewall
标签用来定义防火墙;
firewall
下
whitehost
标签用来定义
IP
白名单 ,
blacklist
用来定义
SQL
黑名单。
2.1、白名单
可以通过设置白名单,实现某主机某用户可以访问
Mycat
,而其他主机用户禁止访问。
设置白名单步骤如下:
- 修改
server.xml
配置文件firewall
标签。配置只有192.168.110.146
主机可以通过mycat
用户访问<firewall><whitehost><hosthost="192.168.110.146"user="mycat"/></whitehost></firewall>
-host
:IP
白名单-user
:允许访问的用户 - 重启
Mycat
后,在192.168.110.146
主机使用mycat
用户访问,可以正常访问。如下:# <font color="#808000;">查看IP地址root@ubuntu-mysql-master:~# <font color="#808000;">ip addr show ens332: 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# <font color="#808000;">mycat用户登录Mycatroot@ubuntu-mysql-master:~# <font color="#808000;">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
用户登录,禁止访问。如下:# <font color="#808000;">查看IP地址root@ubuntu-mysql-master:~# <font color="#808000;">ip addr show ens332: 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# <font color="#808000;">user用户登录Mycatroot@ubuntu-mysql-master:~# <font color="#808000;">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
用户访问,禁止访问。如下:# <font color="#808000;">查看IP地址root@ubuntu-mysql-master2:~# <font color="#808000;">ip addr show ens332: 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# <font color="#808000;">mycat用户登录Mycatroot@ubuntu-mysql-master2:~# <font color="#808000;">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><hosthost="192.168.110.146"user="mycat"/></whitehost><blacklistcheck="true"><propertyname="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;
- 执行删除语句
deletefrom orders where id=7;
- 运行后发现禁止删除数据,如下:
mysql>deletefrom orders where id=7;ERROR 3012(HY000): The statement is unsafe SQL, reject foruser'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
,期待你的关注💪💪💪
版权归原作者 micromaple 所有, 如有侵权,请联系我们删除。