警告:本文仅适用于 MySQL 5.6 及以下版本进行安全设置!!!

 

MySQL 安装完会产生测试用的数据库以及不安全的用户,本文将介绍 MySQL 安全设置的方法。此安全设置方法基于《编译安装LAMP:MySQL篇》

 

一、为 root 用户设置密码(必须)

安装的 MySQL 的 root 用户默认是空密码,为了安全起见,需要把密码修改为强密码(包含数字、字母大小写、特殊字符,长度大于 8 个字符)。

常用修改方法有如下两种,建议选择第二种:

第一种:

#不建议使用该方法的原因是这种方法只会更新Host为localhost的root用户的密码,还需要登陆后同步密码到所有root用户

mysqladmin -u root password ttionya
#上面的ttionya为root用户的密码,请更改密码为强密码

update user set password=password('ttionya') where user='root';
#登陆后同步密码到所有root用户,ttionya请改为root用户的密码

第二种:

mysql << EOF
use mysql;
update user set password=password('ttionya') where user='root';
flush privileges;
EOF
#上面的ttionya为root用户的密码,请更改密码为强密码

 

二、登录 MySQL(必须)

后面的命令就直接可以在 mysql 下操作了,省得每次都要登陆一遍。

mysql -uroot -p
#输入第一步设置的密码,此时不会有任何显示

 

三、删除默认数据库及用户(必须)

MySQL 初始化后会自动生成空用户和 test 库,以进行安装时的测试,这些都是不需要的,有安全隐患,所以需要将他们全部删除。

此时只保留 root 用户,当然以后可以根据需要增加用户和数据库。方法如下:

#以下在mysql内执行
drop database if exists test;
use mysql;
delete from db;
delete from user where not (user='root');
flush privileges;

 

其实这一步可以通过运行 /usr/local/mysql/bin/mysql_secure_installation 命令实现的,但是我还是喜欢自己配置,通过 mysql_secure_installation 命令的配置方法见这里

 

四、只允许 localhost 连接(建议)

经过前几步的设置,user 表中只有 3 – 4 个 root 用户了,他们唯一的区别就是 Host 字段不同,博主的数据库中有 4 个 root 用户,Host 字段分别是 localhost127.0.0.1::1主机名。他们的区别就是 localhost 不经过防火墙;127.0.0.1 经过防火墙;::1 是 IPv6 的 127.0.0.1,也经过防火墙;主机名就不知道了。

想要只保留 Hostlocalhost 的 root 用户,可以执行以下内容:

#以下在mysql内执行
delete from user where not (host='localhost' and user='root');
flush privileges;

 

五、更改 root 用户名(建议)

MySQL 默认权限最高的用户是 root,由于其权限高,所以也是黑客最喜欢攻击的用户名,建议把 root 用户名改成其他复杂的用户名,例如 cymyxjj 之类的?

#以下在mysql内执行
use mysql;
update user set user='ttionya' where user='root';
flush privileges;
#第三行的ttionya为你想更改为的用户名,不建议取与域名之类有关的词

 

六、新建一个无权限的 root 用户(娱乐向)

这步基于第五步的基础上,即你把 root 用户的用户名改为了其他用户名,这样你就可以新建一个无权限的 root 用户,黑客即使登陆上去也什么都做不了,耍耍黑客。

#以下在mysql内执行
create user 'root' identified by 'ttionya';
flush privileges;
exit
#第二行的ttionya为无权限的root用户的密码
#后面的操作都不需要在mysql内执行了,所以退出mysql

 

七、关闭 MySQL 对本地文件的读取(建议)

MySQL 提供对本地文件的读取,使用的是 load data local infile 命令,该选项是默认打开的,在从本地导入数据库时会经常被用到。

该操作令会利用 MySQL 把本地文件读到数据库中,若黑客读取 /etc/passwd 文件将非常危险。

假如你不需要读取本地文件,请关闭它。如果想打开它,请将 /etc/my.cnf 中的 local-infile=0 删除。

sed -i '/^\[mysqld\]/a\
local-infile=0' /etc/my.cnf
#写入关键词
/etc/init.d/mysqld restart
#重新启动MySQL服务

 

八、关闭远程连接(建议)

在没有把 Web Server 和 Database Server 分离的情况下,MySQL 不需要使用远程连接。若只是本机使用 php 等脚本进行连接,为了安全完全可以把远程连接给关闭,这样就不会监听 3306 端口了。

以下为打开远程连接和关闭远程连接的方法

关闭远程连接:

sed -i '/^\[mysqld\]/a\
skip-networking' /etc/my.cnf
#写入关键词
/etc/init.d/mysqld restart
#重新启动MySQL服务
iptables -D INPUT `/etc/init.d/iptables status|grep -w 3306|grep -o "^[0-9]\+"`
/etc/init.d/iptables save
/etc/init.d/iptables restart
#删除3306端口的防火墙规则并重启防火墙

打开远程连接:

sed -i '/^skip-networking/'d /etc/my.cnf
#将关键词移除
/etc/init.d/mysqld restart
#重新启动MySQL服务
sed -i '/^-A INPUT\(.*\) 22 \(.*\)/a\
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT' /etc/sysconfig/iptables
/etc/init.d/iptables restart
#对3306端口添加防火墙规则,上面的22表示在ssh的22端口下面添加这条规则,如果改变了ssh端口,请把22改成你的ssh端口,不然会无法添加

 

注意:为避免出现没有添加到防火墙规则的情况出现,这里执行完以后请再执行一下 cat /etc/sysconfig/iptables 命令,看里面有没有 -A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT 这句规则,若没有,请使用 vim /etc/sysconfig/iptables 命令进入 vim,在连接 SSH 的端口下另起一行添加 -A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT 这条规则。

 

九、删除history(必须)

我们使用过的 shell 命令,都会保存在 ~/.bash_history 里,通过 history 命令可以获得当前用户最近输入的 1000 条命令。虽然前面我们登陆数据库没有直接使用密码,但是以防万一,还是建议清空 ~/.bash_history 文件。

history -c
#清除还未写入.bash_history文件的history记录
rm -f ~/.bash_history
#删除root用户的.bash_history文件
rm -f ~/.mysql_history
#删除MySQL的记录

 

通过 mysql -uroot -p 登陆 MySQL 是一个良好的习惯。

 

如果你觉得 history 会记录的历史命令太多,可以改变 .bash_history 记录的历史条数。

sed -i '/^HISTSIZE=\(.*\)/'d /etc/profile
sed -i '/^HISTFILESIZE=\(.*\)/'d /etc/profile
#删除/etc/profile文件里关于history的内容,HISTSIZE是history命令输出的条数,HISTFILESIZE是.bash_history文件储存的命令条数
echo "HISTSIZE=100" >> /etc/profile
echo "HISTFILESIZE=200" >> /etc/profile
#设置输出条数和储存条数,100和200可自行更改
source /etc/profile
#使更改生效
echo "rm -f $HOME/.bash_history" >> ~/.bash_logout
echo "rm -f $HOME/.mysql_history" >> ~/.bash_logout
echo "rm -f $HOME/.bash_history" >> /etc/skel/.bash_logout
echo "rm -f $HOME/.mysql_history" >> /etc/skel/.bash_logout
#前两个是使root用户在注销时都删除.bash_history和.mysql_history两个文件,后两个是改变模板文件,以后新建的每个用户都会在注销时删除这两个文件

到这里,MySQL 的安全配置就结束了,以后在新建 MySQL 用户时,要注意用户的权限。


原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-482.html