技术开发 频道

保障MySQL数据库安全的14个非常好的方法

  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、降低系统特权

  常见的数据库安全建议都有“降低给各方的特权”这一说法。对于MySQL也是如此。一般情况下,开发人员会使用最大的许可,不像安全管理一样考虑许可原则,而这样做会将数据库暴露在巨大的风险中。

  为保护数据库,务必保证真正存储MySQL数据库的文件目录是由”mysql” 用户和” mysql”组所拥有的。

  shell>ls -l /var/lib/mysql

  此外,还要确保仅有用户”mysql”和root用户可以访问/var/lib/mysql目录。

  Mysql的二进制文件存在于/usr/bin/目录中,它应当由root用户或特定的”mysql”用户所拥有。对这些文件,其它用户不应当拥有“写”的访问权:

  shell>ls -l /usr/bin/my*

  9、降低用户的数据库特权

  有些应用程序是通过一个特定数据库表的用户名和口令连接到MySQL的,安全人员不应当给予这个用户完全的访问权。

  如果攻击者获得了这个拥有完全访问权的用户,他也就拥有了所有的数据库。查看一个用户许可的方法是在MySQL控制台中使用命令SHOW GRANT

  >SHOW GRANTS FOR ';user'@'localhost'

  为定义用户的访问权,使用GRANT命令。在下面的例子中,user1仅能从dianshang数据库的billing表中选择:

  > GRANT SELECT ON billing.dianshang TO 'user1'@'localhost';

  
> FLUSH PRIVILEGES;

  如此一来,user1用户就无法改变数据库中这个表和其它表的任何数据。

  另一方面,如果你要从一个用户移除访问权,就应使用一个与GRANT命令类似的REVOKE命令:

  > REVOKE SELECT ON billing.ecommerce FROM 'user1'@'localhost';

  
> FLUSH PRIVILEGES;

  

0
相关文章