MySQL安全配置

1、MySQL简介


MySQL原本是一个开放源代码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。

MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google和Facebook等网站。非常流行的开源软件组合LAMP中的“M”指的就是MySQL。

但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社区们对于Oracle是否还会持续支持MySQL社区版(MySQL之中唯一的免费版本)有所隐忧,因此原先一些使用MySQL的开源软件逐渐转向其它的数据库。例如维基百科已于2013年正式宣布将从MySQL迁移到MariaDB数据库。

2、MySQL服务器架设


Mysql安装mysql官方下载地址中下载最新的release包。

tar zxf mysql.tar.gz //编译源码
 
为mysql的运行建立mysql用户和mysql用户组
groupadd mysql 
useradd -g mysql mysql
 
//进行mysql安装
 ./configure --prefix=/usr/local/mysql
make
make install
 
cp support-files/my-medium.cnf /etc/my.cf //复制配置示例文件为配置文件
mysql_install_db --user=mysql //用mysql生成初始数据库,出现类似thank for using mysql 证明初始化数据库成功。
//用户目录权限限制
chown -R root /mysql/  //修改mysql目录有者为root
chown -R mysql /mysql/var //修改var目录所有者为mysql
chgrp -R mysql //修改当前目录所属组为mysql
bin/mysqld_safe --user=mysql & //启动mysql
bin/mysql –u root //连接mysql
 
//修改root密码,此处示例将密码改成了"password"
mysql> use mysql;
mysql> update user set password=password('password') where user='root';
mysql> flush privileges; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
 
 
//也可以使用 mysqladmin进行修改
mysqladmin -u root password "upassword" //使用mysqladmin
 
//删除默认数据库和数据库用户
mysql> show databases; //显示所有数据库
mysql> drop database test; //删除默认数据库test
use mysql; //进入mysql数据库
delete from db; //删除存放数据库的表信息,因为还没有数据库信息。
mysql> delete from user where not (user='root') ; // 删除初始非root的用户
mysql> delete from user where user='root' and password=''; //删除空密码的root
mysql> flush privileges; //强制刷新内存授权表。
 
//修改默认管理员账户
mysql> update user set user="newroot" where user="root"; //将默认管理员root改成newroot
mysql> flush privileges;
 
//使用mysql用户启动mysql
mysqld_safe --user=mysql & //启动时指定用mysql用户启动(每次启动都要设置用mysql用户启动)
//对my.cnf中的mysqld进行设置,如下:
[mysqld]
user=mysql
 
//禁止远程连接数据库
//在my.cf中将#skip-networking的注释去掉
mysqladmin -u root -p shutdown //停止数据库
mysqld_safe --user=mysql & //用mysql用户启动mysql
 
//删除命令历史记录,建议在修改用户密码之后都要进行一次
rm .bash_history .mysql_history  //删除历史记录
ln -s /dev/null .bash_history   //将shell记录文件置空
ln -s /dev/null .mysql_history  //将mysql记录文件置空
 
//禁止MySQL对本地文件存取
//在my.cnf中添加local-infile=0,或者在启动mysql时加参数local-infile=0
mysqld_safe --user=mysql --local-infile=0 &
 
//管理用户权限
mysql>show grant //显示授权
mysql>revoke delete on *.* from 'root' //移除root用户的delete权限

Mysql的用户权限设置可参考Mysql安全配置根据实际需要给予所需的最低权限。

3、错误配置及利用


Mysql配置导致的漏洞往往都是多个因素共同造成的,最常见的就是网站中存在phpmyadmin等数据库管理工具或者Mysql允许远程连接,加上Mysql没有修改掉默认的用户或者使用了弱口令。这导致了攻击者使用其得到的用户权限进行数据库操作。若在配置Mysql时对用户权限进行了限制,则可大大减少因此遭受的损失。

在攻击者获取到Mysql数据库操作权限后,若服务器没有禁止MySQL对本地文件存取,那么攻击者可以通过写入shell,最终完全控制服务器。示例是将

<?php eval($_REQUEST[cmd]);?>

写入到/www/shell.php文件中。

mysql> select 0x3c3f706870206576616c28245f524551554553545b636d645d293b3f3e  into outfile '/www/shell.php'

4、实际案例

5、修复方案


及时更新Mysql到最新版本,可在mysql官方下载地址找到下载地址。

若Mysql配置中存在问题可参考本条目Mysql服务器架设

6、漏洞扫描及发现


Mysql默认端口为3306,当数据库允许远程连接时该端口会对外开放。 通过对3306端口进行扫描就可以找到对外开放的Mysql服务器。

//扫描
nmap -n --open -p 3306 X.X.X.X/24
 
//使用root用户和空口令连接Mysql服务器
mysql -h X.X.X.X -u root

通过nmap扫描mysql相关的漏洞

//检测mysql空口令
nmap -p3306 --script=mysql-empty-password.nse 192.168.5.1
 
//检测nmap中支持扫描的所有MYSQL漏洞
nmap -p3306 --script=mysql* 192.168.5.1

7、相关资源