Mycat安全设置

Mycat安全设置Mycat 安全配置 用户权限控制 SQL 拦截配置 设置黑名单和白名单

? 作者:微枫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"> 
     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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 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 -p -h 192.168.110.145 -P8066 
  • 切换到TESTDB数据库
    use TESTDB; 
  • 查询orders数据
    mysql> select * from orders; +--------+------------+-------------+-----------+ | id | order_type | customer_id | amount | +--------+------------+-------------+-----------+ | 1 | 101 | 100 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 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"> 
     property> <property name="schemas">TESTDB 
      property> <property name="defaultSchema">TESTDB 
       property>  
        
       <privileges check="true"> <schema name="TESTDB" dml="1111" > <table name="orders" dml="0000"> 
        table>  
         
         schema>  
          privileges>  
           user> 

参数配置说明:

  • check:是否开启
  • DML权限设置配置说明如下
DML权限 增加(insert) 更新(update) 查询(select) 删除(delete)
0000
0010
1110
1111

测试案例

案例一

使用mycat用户,privileges配置orders表权限为禁止增删改查(dml="0000"),验证是否可以查询出数据,验证是否可以写入数据。

  • 重启Mycat,使用mycat用户登录,命令如下:
    mysql -umycat -p -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"> 
           property> <property name="schemas">TESTDB 
            property> <property name="defaultSchema">TESTDB 
             property>  
              
             <privileges check="true"> <schema name="TESTDB" dml="1111" > <table name="orders" dml="1111"> 
              table>  
               
               schema>  
                privileges>  
                 user> 
  • 重启Mycat,使用mycat用户登录,命令如下:
    mysql -umycat -p -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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | 7 | 101 | 101 | 10000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 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 | .00 | | 2 | 101 | 100 | .00 | | 6 | 102 | 100 | .00 | | 3 | 101 | 101 | .00 | | 4 | 101 | 101 | .00 | | 5 | 102 | 101 | .00 | | 7 | 101 | 101 | 10000.00 | | 8 | 101 | 101 | 10000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 102 | 101 | 1000.00 | |  | 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:~# 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 -p -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-810 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 -p -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 -p -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 拦截功能属性列表

配置项 默认值 描述
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://javaforall.net/202560.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:51
下一篇 2026年3月19日 下午11:51


相关推荐

  • 路由器有线桥接的两种方式异同

    路由器有线桥接的两种方式异同根据这篇文章 http www gezila com tutorials 46010 html 我小结下两种方式之要点及异同另主路由器为路由器 A 副路由器为路由器 B 方式一 LAN WAN1 A 的 LAN 口接到 B 的 WAN 口 2 B 的以太网接入方式 WAN 口接入类型 选择动态 ip 这个 ip 实质是由 A 的 DHCP 服务分配的 如图 可见 A 给 B 分配的 ip 地

    2025年6月17日
    9
  • 同学你好,2025科大讯飞AI开发者大赛星火杯开赛了!

    同学你好,2025科大讯飞AI开发者大赛星火杯开赛了!

    2026年3月14日
    3
  • qtav—-ffmeg在ubuntu和win10上的编译和运行

    qtav—-ffmeg在ubuntu和win10上的编译和运行最近在windows上和ubuntu上都安装了qtav并且通过了编译测试,实测播放中英文的视频文件功能正常,有图像有声音。大致情况是,操作系统ubuntu:wkr@sea-X550JK:~$cat/etc/os-releaseNAME=”Ubuntu”VERSION=”16.04.4LTS(XenialXerus)”ID=ubuntuID_LIKE=debianPRETTY_…

    2025年12月2日
    4
  • oracle 查询ddl语句吗,oracle如何获取DDL语句

    oracle 查询ddl语句吗,oracle如何获取DDL语句1 dbms metadata get ddlsetpagesi ddl sqlselectdbm metadata get ddl TABLE tablename username fromdual selectdbms metadata get ddl VIE

    2026年3月17日
    1
  • navicat导出longtext类型数据乱码的解决方案

    navicat导出longtext类型数据乱码的解决方案一、先使用sql查询出需要导出的内容,将longtext类型使用cast转化成char类型SELECT company_id, wechat_mp_appid, CAST(survey_risk_tips_orgASchar)ASsurvey_risk_tips_org, CAST(survey_disclaimerASchar)ASsurvey_disclaimer, CAS…

    2022年5月14日
    49
  • python屏幕文字识别_python识别图片文字

    python屏幕文字识别_python识别图片文字因为学校要求要刷一门叫《包装世界》的网课,而课程里有200多道选择题,而且只能在手机完成,网页版无法做题,而看视频是不可能看视频的,这辈子都不可能看…所以写了几行代码来进行百度搜答案。思路如下:手机屏幕投影到电脑上;截图并识别图片文字;调用百度来进行搜索;提取html关键字。环境配置:python3.6、第三方库:pyautogui、PIL、pytesseract、识别引擎tesseract-…

    2022年6月6日
    77

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号