Mysql/Mariadb 如何伪装版本?

December 05, 2022 作者: yijianhao 分类: 数据库 浏览: 182 评论: 0

版本号伪装

在mariadb官方文档中,是可以给出了伪装的方法的:
从MariaDB 10.2.1版本开始,可以在配置文件中增加version配置去伪装版本:

[mysqld]
version=unkonwn

重启后,使用telnet就看不出相关版本号了。

而在MYSQL8中,是不能这样操作的,因为这个是个常量:

image-1670240221951

但是,民间给出了解决方案,就是直接修改mysqld文件(假设版本号为8.0.27):

cp /usr/bin/mysqld /usr/bin/mysqld.bak
sed -i 's/8.0.27/fakevs/' /usr/bin/mysqld

上面的命令会将版本号8.0.27修改为fakevs

经过测试,如果8.0.27的长度不等于fakevs的长度,那服务器就无法启动,所以修改二进制文件是很危险的

其次,如果使用上述方式去修改版本号,MYSQL的主从同步很可能无法继续:

设定: A 为主, B为从

A修改了版本号为’fakevs’, 在从机中使用show slave status\G;命令,会发现从机无法识别主机的版本信息:

 ...  ...
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
 ... ...
                 Last_IO_Error: Fatal error: Master reported unrecognized MySQL version
 ... ...

这就意味着,版本号不能随意修改,否则很可能会在你意想不到的地方报错,因为这个版本信息是MYSQL通信协议的一部分。(Mariadb相关的测试在下面)

最后一种就是自己修改源码了,这个就不讲了

Mariadb伪装测试

mariadb 版本号修改后主从测试,使用docker可以轻松进行测试。

  1. 以下为测试的docker-compose.yaml文件
version: '3.1'

services:
  main:
    image: mariadb:10.10.2
    #restart: always
    environment:
      MARIADB_ROOT_PASSWORD: 123456
      MARIADB_DATABASE: customs
      MARIADB_USER: backup
      MARIADB_PASSWORD: backup
    volumes:
      - ./init1:/docker-entrypoint-initdb.d
      - ./my1.cnf:/etc/my.cnf
    ports:
      - 4306:3306
  slave:
    image: mariadb:10.10.2
    environment:
      MARIADB_ROOT_PASSWORD: 123456
      MARIADB_DATABASE: customs
      MARIADB_USER: backup
      MARIADB_PASSWORD: backup
    volumes:
      - ./init2:/docker-entrypoint-initdb.d
      - ./my2.cnf:/etc/my.cnf
    ports:
      - 4307:3306
  1. my.cnf文件(my1.cnf和my2.cnf)
[mysqld]
version=<修改的版本号>
log-bin=mysql-bin
binlog_format=mixed
server-id=1              # 主机写1,从机写2
#需要备份的数据库名
binlog-do-db=customs
auto-increment-increment=2
auto-increment-offset=1   # 主机写1,从机写2
slave-skip-errors=all
sync_binlog=1

可以通过这个配置文件的version配置进行伪装版本号

  1. 版本号修改为unkonwn

修改后并启用主从备份之后,数据库无法启动,报错信息为:

hotbackup-main-1   | 2022-12-15  3:42:54 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
hotbackup-main-1   | 2022-12-15  3:42:54 0 [Note] InnoDB: log sequence number 46590; transaction id 14
hotbackup-main-1   | 2022-12-15  3:42:54 0 [Note] Plugin 'FEEDBACK' is disabled.
hotbackup-main-1   | 2022-12-15  3:42:54 0 [ERROR] Could not use mysql-bin for logging (error 2). Turning logging off for the whole duration of the MariaDB server process. To turn it on again: fix the cause, shutdown the MariaDB server and restart it.
hotbackup-main-1   | 2022-12-15  3:42:54 0 [ERROR] Aborting

  1. 版本号修改为20.10.2(不存在的版本号)

主从配置步骤就略过了,结果为主从复制成功(Slave_IO_Running和Slave_SQL_Running都为yes):

MySQL []> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 172.20.1.53
                   Master_User: backup
                   Master_Port: 4307
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000003
           Read_Master_Log_Pos: 517
                Relay_Log_File: mysqld-relay-bin.000002
                 Relay_Log_Pos: 730
         Relay_Master_Log_File: mysql-bin.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
           ... ...

参考:
mariadb文档:https://mariadb.com/kb/en/server-system-variables/#version
mysql文档:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_versionhttps://dev.mysql.com/doc/refman/8.0/en/server-option-variable-reference.html
民间方案:MySQL修改版本号教程

#mysql(2)

评论