MySQL数据库一贯以高性能、高可性和易用性著称,它已经成为世界上最流行的开源数据库。大量的个人、WEB开发者、大型公司等都在其网站、关键系统、软件包中广泛使用MySQL数据库。
通常,许多企业在部署一种产品时,安全性常常得不到应有的重视。企业最关心的是使其可以尽快地运行,企业由此也可以尽快赢利。
但有的企业在安装MySQL时用的是默认选项,由此造成其数据不安全,且服务器也面临被入侵的风险,并有可能在短时间内就出现性能问题。下面将提供保障MySQL安全的最佳方法。
1、避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权
直接通过本地网络之外的计算机改变生产环境中的数据库是异常危险的。有时,管理员会打开主机对数据库的访问:
> GRANT ALL ON *.* TO 'root'@'%';
这其实是完全放开了对root的访问。所以,把重要的操作限制给特定主机非常重要:
> GRANT ALL ON *.* TO 'root'@'localhost';
> GRANT ALL ON *.* TO 'root'@'myip.athome'
> FLUSH PRIVILEGES
此时,你仍有完全的访问,但只有指定的IP(不管其是否静态)可以访问。
2、定期备份数据库
任何系统都有可能发生灾难。服务器、MySQL也会崩溃,也有可能遭受入侵,数据有可能被删除。只有为最糟糕的情况做好了充分的准备,才能够在事后快速地从灾难中恢复。企业最好把备份过程作为服务器的一项日常工作。
3、禁用或限制远程访问
前面说过,如果使用了远程访问,要确保只有定义的主机才可以访问服务器。这一般是通过TCP wrappers、iptables或任何其它的防火墙软件或硬件实现的。
为限制打开网络socket,管理员应当在my.cnf或my.ini的[mysqld]部分增加下面的参数:
skip-networking
这些文件位于windows的C:\Program Files\MySQL\MySQL Server 5.1文件夹中,或在Linux中,my.cnf位于/etc/,或位于/etc/mysql/。这行命令在MySQL启动期间,禁用了网络连接的初始化。请注意,在这里仍可以建立与MySQL服务器的本地连接。
另一个可行的方案是,强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:
bind-address=127.0.0.1
如果企业的用户从自己的机器连接到服务器或安装到另一台机器上的web服务器,你可能不太愿意禁用网络访问。此时,不妨考虑下面的有限许可访问:
mysql> GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
这里,你要把someuser换成用户名,把somehost换成相应的主机。
4、设置root用户的口令并改变其登录名
在linux中,root用户拥有对所有数据库的完全访问权。因而,在Linux的安装过程中,一定要设置root口令。当然,要改变默认的空口令,其方法如下:
Access MySQL控制台:$ mysql -u root -p
在MySQL控制台中执行:
> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
在实际操作中,只需将上面一行的new_password换成实际的口令即可。
在Linux控制台中更改root口令的另一种方法是使用mysqladmin工具:
$ mysqladmin -u root password new_password
此时,也是将上面一行的new_password换成实际的口令即可。
当然,这是需要使用强口令来避免强力攻击。
为了更有效地改进root用户的安全性,另一种好方法是为其改名。为此,你必须更新表用户中的mySQL数据库。在MySQL控制台中进行操作:
> USE mysql;
> UPDATE user SET user="another_username" WHERE user="root";
> FLUSH PRIVILEGES;
然后,通过Linux访问MySQL控制台就要使用新用户名了:
$ mysql -u another_username -p
5、移除测试(test)数据库
在默认安装的MySQL中,匿名用户可以访问test数据库。我们可以移除任何无用的数据库,以避免在不可预料的情况下访问了数据库。因而,在MySQL控制台中,执行:
> DROP DATABASE test;
6、禁用LOCAL INFILE
另一项改变是禁用”LOAD DATA LOCAL INFILE”命令,这有助于防止非授权用户访问本地文件。在PHP应用程序中发现有新的SQL注入漏洞时,这样做尤其重要。
此外,在某些情况下,LOCAL INFILE命令可被用于访问操作系统上的其它文件(如/etc/passwd),应使用下现的命令:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
更简单的方法是:
mysql> SELECT load_file("/etc/passwd")
为禁用LOCAL INFILE命令,应当在MySQL配置文件的[mysqld]部分增加下面的参数:
set-variable=local-infile=0
7、移除匿名账户和废弃的账户
有些MySQL数据库的匿名用户的口令为空。因而,任何人都可以连接到这些数据库。可以用下面的命令进行检查:
mysql> select * from mysql.user where user="";
在安全的系统中,不会返回什么信息。另一种方法是:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
如果grants存在,那么任何人都可以访问数据库,至少可以使用默认的数据库“test”。其检查方法如下:
shell> mysql -u blablabla
如果要移除账户,则执行命令:
mysql> DROP USER "";
从MySQL的5.0版开始支持DROP USER命令。如果你使用的老版本的MySQL,你可以像下面这样移除账户:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
8、降低系统特权