Mysql默认设置的危险性分析

时间:2022-04-28 09:45:06

默认安装的mysql服务不安全因素涉及的内容有:

一.mysql默认的授权表

二.缺乏日志能力

三.my.ini文件泄露口令

四.服务默认被绑定全部的网络接口上

五.默认安装路径下的mysql目录权限

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一.mysql默认的授权表

由于mysql对身份验证是基于mysql这个数据库的,也叫授权表。所有的权限设置都在这里了。

我们只讨论最为重要的一个表 user表。它控制的是接受或拒绝连接。

先看一下

select host,user,password,Delete_priv from user;

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

| % | root | | Y |

| localhost | | | Y |

| % | | | N |

+-----------+------+------------------+-------------+

现在新的版本,安装完毕都会出现一个快速设置窗口,用于设置口令。

以上,就是user表里的内容(略了点)看看有什么问题?

我们知道mysql的验证方式是比较特殊的,它基于两个2个信息来进行的

1.从那里连接

2.用户名

第一条没什么问题,当然口令必须是安全的。

第二条从任何主机,以用户root,不需要口令都可以连接,权限为所有的权限。(注:这里的权限是全局权限)

第三条从本地主机,任何用户名(注:user为空白,不表示不需要用户名),不需要口令,都可以连接,所有的权限

第四条从任何主机,任何用户名,不需要口令,都可以连接,无任何权限。

可以看出,2\3\4都是不安全的,如何攻击这里就不说了,请参看资料文库。

如果你mysql只允许本地连接,删除host的%和user中的nul(表示空)

delete from user where host='% ';

delete from host where user=' ';

最后的user表,看起来因该是这个样子

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

+-----------+------+------------------+-------------+

最后需要刷新授权表,使其立刻生效

flush privileges;

如果你的mysql需要被远程使用,需要为%段中的root帐号,加上一个安全的密码

update user set password=password(‘youpass‘) where host=‘%‘;

其中youpass,就是口令

mysql> select host,user,password,Delete_priv from user;

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

| % | root | 77c590fa148bc9fb | Y |

+-----------+------+------------------+-------------+

更好的做法是,对远程主机的连接,指定为特定的

修改host中的%为允许连接的主机,比如:

192.168.0.% 允许一个特定的子网

www.zzvips.com允许一个特定的主机

帐号默认的名字也是担心的问题。有可能导致被暴力破解

update user set user=‘localadmin‘ where host=‘localhost‘;

update user set user=‘remoteadmin‘ where host=‘%‘;

最后的user表看起来像是这个样子

mysql> select host,user,password,Delete_priv from user;

+-----------+-------------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+-------------+------------------+-------------+

| localhost | localadmin | 67457e226a1a15bd | Y |

| % | remoteadmin | 77c590fa148bc9fb | Y |

+-----------+-------------+------------------+-------------+

更为详细的资料,请去参考晏子的《MySQL中文参考手册》。随便那都有下

二.缺乏日志能力

mysql安装完成以后,会在%SystemRoot%目录下产生my.ini的设置文件

默认的内容如下:

——————————————————————————————

basedir=C:/mysql

#bind-address=192.168.0.1

datadir=C:/mysql/data

#language=C:/mysql/share/your language directory

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

[WinMySQLadmin]

Server=C:/mysql/bin/mysqld-nt.exe

user=root

password=root

———————————————————————————————

注意log#=这个

它没有被定义,且被注销掉了。

更改为一个适合的路径,比如:

log=c:/mysql/logs/mysql.log

三.my.ini文件泄露口令

我们看到my.ini最后,有这两句

user=root

password=root

如果,你安装完成时,使用了mysql所提供的快速设置功能,(较新的版本)你的帐号和口令将被写到my.ini文件中。

这也是mysql写到启动组里的winmysqladmin.exe工具,运行时需要读取的。它提供的mysql服务

的一些监视功能。这样winmysqladmin.exe才能获得mysql服务的状态信息。

其实,这个也不算漏洞,我们看看my.ini默认的权限,它可以被user组用户读取。

从而导致口令被泄露

解决方法:

从新设定my.ini文件的权限.

从新设定帐号及口令

不使用快速设置

四.服务默认被绑定全部的网络接口上

服务被绑定到了所有的网络接口上,比如,你只需要一个运行在内网的mysql服务,但是你的机器有

外网的接口,mysql也会被绑定上,从而带来一些不必要的麻烦和威胁。

在my.ini里的这句

#bind-address=192.168.0.1

它默认被注销掉了

应该打开它

如果,只是本地使用,更改为

bind-address=127.0.0.1

如果是其它情况,应该选者一个合适的网络接口

五.默认安装路径下的mysql目录权限

mysql默认的安装路径为c:\mysql,基本上都难得改,要改的话也是麻烦,还要去改my.ini。

但,这样就有个问题

通常c:\的权限是everyone组-所有的权限。这是默认的,由于继承性,导致mysql下的data目录

也是everyone组-所有的权限。导致被随意访问、读取、删除,可能泄露和破坏数据。

更改mysql目录到一个合适,安全的访问权限。