Mycat安全配置
1. Mycat相关文章
Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置
Linux安装Mysql8.0.20并配置主从复制(一主一从,双主双从)
Docker部署Mysql8.0.20并配置主从复制
Mycat配置分库分表(垂直分库、水平分表)、全局序列
2. 环境准备
- 服务器划分
服务器IP | 备注 |
---|---|
192.168.133.130 | 数据库-1 |
192.168.133.131 | 数据库-2 |
192.168.133.132 | Mycat |
- 表结构
数据库和表依据博客:Mycat配置分库分表(垂直分库、水平分表)、全局序列环境。其中,Mycat连接两个Mysql数据库education
的逻辑库为TESTDB
,Mysql-1中表为mycat_sequence
(Mycat全局序列表)、t_schedule
(课程表)、t_subject_dict
(课程字典表)等,Mysql-2中表为t_student
(学生表)、t_schedule
(课程表)、t_subject_dict
(课程字典表)。
3. 权限配置
- user标签权限控制
在server.xml中,进行用户级别的权限设置:
# server.xml中用户设置
<user name="root" 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>
属性说明如下:
标签属性 | 说明 |
---|---|
user > name | 连接逻辑库用户名 |
password | 连接逻辑库密码 |
schemas | 逻辑库名称:TESTDB |
defaultSchema | 默认逻辑库 |
readOnly | 该用户是否只读,默认:false |
测试: |
# 启动Mycat
# 进入Mycat的bin目录
./mycat cosole
# 测试1:user用户(只读)
# 连接Mycat
mysql -uuser -puser -h192.168.133.132 -P8066
# 切换数据库
use TESTDB;
# 查询数据(查询成功)
select * from t_schedule;
# 插入数据
# 插入失败,提示:User readonly
insert into t_student(id, username) values(1, '张三');
# 测试2:root用户(可读可写)
# 连接Mycat
mysql -uroot -p123456 -h192.168.133.132 -P8066
# 切换数据库
use TESTDB;
# 查询数据(查询成功)
select * from t_schedule;
# 插入数据(插入成功)
insert into t_student(id, username) values(1, '张三');
# 查询插入的数据
select * from t_student;
- privileges标签权限控制
在user标签下的privileges标签可以对逻辑库(schema)、表(table)进行更加精确的DML权限控制。
privileges标签的check属性为true则开启权限检查,为false则不开启权限检查,默认为false。
由于Mycat一个用户的schemas属性可配置多个逻辑库(schema),所以privileges标签的下级节点schema同样可配置多个,同时对多库多表进行精确的DML权限控制。
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="t_student" dml="0000"></table>
<table name="t_schedule" dml="1111"></table>
<table name="t_subject_dict" dml="0010"></table>
</schema>
</privileges>
</user>
DML权限说明如下:
DML权限 | 新增 | 更新 | 查询 | 删除 |
---|---|---|---|---|
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 允许 | 禁止 |
1110 | 允许 | 允许 | 允许 | 禁止 |
1111 | 允许 | 允许 | 允许 | 允许 |
... | ... | ... | ... | ... |
测试: |
# 启动Mycat
# 进入Mycat的bin目录
./mycat cosole
# 连接Mycat
mysql -uroot -p123456 -h192.168.133.132 -P8066
# 测试表t_student(0000)
# 查询报错:3012 - The statement DML privilege check is not passed, reject for user 'root'
select * from t_student;
# 新增报错:3012 - The statement DML privilege check is not passed, reject for user 'root'
insert into t_student(id, username) values(4 , '李四');
# 测试表t_schedule(1111)
# 查询正常:OK
select * from t_schedule;
# 更新正常:Affected rows: 1
update t_schedule set subject_code = 'SW' where id = 1;
# 其他权限请自行测试
4. SQL拦截
Mycat的server.xml配置文件中的firewall标签用来定义防火墙,其中firewall标签下的whitehost 标签用来定义IP白名单,firewall标签下的blacklist标签用来定义SQL黑名单。
- 白名单
通过白名单可以指定某个或某些主机可以访问Mycat,其他主机禁止访问。
白名单可以使用通配符%
或*
,这些配置情况下对于127.0.0.1都能以root账户登录。
# 例如
<host host="127.0.0.*" user="root"/>
<host host="127.0.*" user="root
<host host="127.*" user="root"/>
<host host="1*7.*" user="root"/>
配置指定IP访问:
<firewall>
<whitehost>
<host host="192.168.133.130" user="root"/>
</whitehost>
</firewall>
测试:
# 启动Mycat
# 进入Mycat的bin目录
./mycat cosole
# 其他主机连接Mycat
# root用户
# 连接失败:Access denied for user 'root' with host '192.168.133.131'
mysql -uroot -p123456 -h192.168.133.132 -P8066
# user用户
# 连接成功
mysql -uuer -puser -h192.168.133.132 -P8066
- 黑名单
通过黑名单,可以实现对SQL操作(例如增删改查等)的拦截。
server.xml配置文件下的firewall标签下的blacklist标签用来定义SQL黑名单,它的check属性标识是否开启权限拦截,true为开启,false为不开启,默认为false。
配置黑名单并开启权限检查:
<firewall>
<whitehost>
<host host="192.168.133.130" user="root"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
黑名单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
# 进入Mycat的bin目录
./mycat cosole
# 连接Mycat
mysql -uroot -p123456 -h192.168.133.132 -P8066
# 测试删除
# 删除失败:3012 - The statement is unsafe SQL, reject for user 'root'
delete from t_schedule where id = '123456';