Mycat安全设置

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

🍁 作者微枫Micromaple

💒 主页欢迎关注Micromaple

📌 简介Java程序员、后端全栈工程师

🔗 点赞👍➕收藏⭐➕留言📝 您的支持就是我前进的动力💪💪💪

大家好我是微枫Micromaple下面是我的Mycat系列专栏(持续更新ing)有喜欢的小伙伴欢迎订阅学习呀

🚀 深入学习Mycat

Mycat系列专栏点我学习

🔥 Mycat主从搭建、读写分离点我学习

🔥 Mycat实现分库分表点我学习

🔥 Mycat实现单库水平分表、按月分表点我学习

🔥 Mycat高可用方案-HAProxy+Keepalived点我学习

目录

一、🚩权限配置

1.1、user标签权限控制

目前 Mycat 对于中间件的连接控制并没有做太复杂的控制目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xmluser 标签进行配置。

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.xmlnamemycatuser标签部分。内容如下

    <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>
    
    • hostIP白名单
    • 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;
    
  • 运行后发现禁止删除数据如下

    mysql> delete from orders where id=7;
    ERROR 3012 (HY000): The statement is unsafe SQL, reject for user 'mycat'
    

黑名单 SQL 拦截功能属性列表

配置项默认值描述
selelctAllowtrue是否允许执行 SELECT 语句
deleteAllowtrue是否允许执行 DELETE 语句
updateAllowtrue是否允许执行 UPDATE 语句
insertAllowtrue是否允许执行 INSERT 语句
createTableAllowtrue是否允许创建表
setAllowtrue是否允许使用 SET 语法
alterTableAllowtrue是否允许执行 Alter Table 语句
dropTableAllowtrue是否允许修改表
commitAllowtrue是否允许执行 commit 操作
rollbackAllowtrue是否允许执行 roll back 操作

读到这里想必你对Mycat安全设置的认识清晰了不少别忘了三连支持博主呀我是微枫micromaple期待你的关注💪💪💪

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6