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';
posted @ 2020-10-14 20:59  C3Stones  阅读(327)  评论(0编辑  收藏  举报