警告:本文仅适用于
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
字段分别是 localhost
、127.0.0.1
、::1
、主机名
。他们的区别就是 localhost
不经过防火墙;127.0.0.1
经过防火墙;::1
是 IPv6 的 127.0.0.1,也经过防火墙;主机名就不知道了。
想要只保留 Host
为 localhost
的 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