Mycat1.6 firewall configuration

1. Create a new user and authorize

CREATE USER 'test'@'%' IDENTIFIED BY 'root';

 

GRANT SELECT, INSERT, UPDATE, DELETE, SHOW DATABASES ON *.* TO 'test'@'%';

 

GRANT SELECT, INSERT, UPDATE, REFERENCES, CREATE VIEW, SHOW VIEW, LOCK TABLES ON `db3`.* TO 'test'@'%';

 

GRANT SELECT, INSERT, UPDATE, REFERENCES, CREATE VIEW, SHOW VIEW, LOCK TABLES ON `db2`.* TO 'test'@'%';

 

GRANT SELECT, INSERT, UPDATE, REFERENCES, CREATE VIEW, SHOW VIEW, LOCK TABLES ON `db1`.* TO 'test'@'%';

 

2. Modify the server.xml configuration file

<firewall> 

  <whitehost>

     <host host="192.168.1.102" user="root"/>

     <host host="192.168.1.101" user="root"/>

     <host host="127.0.0.1" user="test"/>

     <host host="192.168.1.102" user="test"/>

  </whitehost>

       <blacklist check="true">

       </blacklist>

</firewall>

 

 

<user name="test">

<property name="password">root</property>

<property name="schemas">TESTDB</property>

<property name="readOnly">true</property>

</user>

 

<user name="root">

<property name="password">root</property>

<property name="schemas">TESTDB</property>

 

<!-- Table-level DML permission settings-->

<!--

<privileges check="false">

<schema name="TESTDB" dml="0110" >

<table name="tb01" dml="0000"></table>

<table name="tb02" dml="1111"></table>

</schema>

</privileges>

-->

</user>

error solution



 

3. Program running process Debug

 

Frontend Authentication Processor FrontendAuthenticator Class

 

 public void handle(byte[] data) {

        // check quit packet

        if (data.length == QuitPacket.QUIT.length && data[4] == MySQLPacket.COM_QUIT) {

            source.close("quit packet");

            return;

        }

 

        AuthPacket auth = new AuthPacket();

        auth.read(data);

 

         if (!checkUser(auth.user, source.getHost())) {

           failure(ErrorCode.ER_ACCESS_DENIED_ERROR, "Access denied for user '" + auth.user + "' with host '" + source.getHost()+ "'");

            return;

        }

}

 

  protected boolean checkUser(String user, String host) {

        return source.getPrivileges().userExists(user, host);

    }

 

 

MycatPrivileges permission provider class

 @Override

    public boolean userExists(String user, String host) {

    //Check user and whitelist

    return checkFirewallWhiteHostPolicy(user, host);

    }

 

 

@Override

public boolean checkFirewallWhiteHostPolicy(String user, String host) {

 

MycatConfig mycatConfig = MycatServer.getInstance().getConfig();

        FirewallConfig firewallConfig = mycatConfig.getFirewall();

        

        // Firewall whitelist processing

       boolean isPassed = false;

        

        Map<String, List<UserConfig>> whitehost = firewallConfig.getWhitehost();

        if (whitehost == null || whitehost.size() == 0) {        

        Map<String, UserConfig> users = mycatConfig.getUsers();

        isPassed = users.containsKey(user);

       

        } else {        

            List<UserConfig> list = whitehost.get(host);

                if (list != null) {

                   for (UserConfig userConfig : list) {

                           if (userConfig.getName().equals(user)) {

                                 isPassed = true;

                                break;

                           }

                      }

               }        

        }

        

        if ( !isPassed ) {

        ALARM.error(new StringBuilder().append(Alarms.FIREWALL_ATTACK).append("[host=").append(host)

                     .append(",user=").append(user).append(']').toString());

        return false;

        }        

        return true;

}

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326945749&siteId=291194637