🍁 作者:微枫
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">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>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="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 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> <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --> <!-- 表级 DML 权限设置 --> <privileges check="true"> <schema name="TESTDB" dml="1111" > <table name="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 | +--------+------------+-------------+-----------+ 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:~# <font color="#808000;">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 -p123456 -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-20220524173810 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 -p123456 -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 -p123456 -h 192.168.110.145 -P8066
-
切换到
TESTDB
数据库use TESTDB;
-
执行删除语句
delete from orders where id=7;
-
运行后发现禁止删除数据,如下:文章来源:https://www.toymoban.com/news/detail-814693.html
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://www.toymoban.com/news/detail-814693.html
到了这里,关于Mycat安全设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!