移动安全 安全管理 应用案例 网络威胁 系统安全应用安全 数据安全 云安全
当前位置: 主页 > 信息安全 > 应用安全 >

保障MySQL安然的14个最好编制

时间:2013-11-22 18:20来源:TuZhiJiaMi企业信息安全专家 点击:
MySQL数据库一贯以高机能、高可性和易用性著称,它已成为世界上最风行的开源数据库。大年夜量的小我、WEB开辟者、大年夜型公司等都在其网站、关头系统、软件包中遍及利用MySQL数据库。
Tags应用安全(1006)数据库(89)注入漏洞(26)MySQL(10)  

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

  常见的数据库安然建议都有“降落给各方的特权”这一说法。对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;

  10、移除和禁用.mysql_history文件

  在用户拜候MySQL节制台时,所有的号令汗青都被记其实~/.mysql_history中。假定报复打击者拜候这个文件,他便可以知道数据库的布局。

  $ cat ~/.mysql_history

  为了移除和禁用这个文件,应将日记发送到/dev/null。

  $export MYSQL_HISTFILE=/dev/null

  上述号令使所有的日记文件都定向到/dev/null,你该当从home文件夹移除.mysql_history:$ rm ~/.mysql_history,并成立一个到/dev/null的符号链接。

  11、安然补丁

  务必保持数据库为最新版本。因为报复打击者可以操纵上一个版本的已知缝隙来拜候企业的数据库。

  12、启用日记

  假定你的数据库办事器其实不履行任何查询,建议你启用跟踪记实,你可以经由过程在/etc/my.cnf文件的[Mysql]部门添加:log =/var/log/mylogfile。

  对出产环境中任务沉重的MySQL数据库,因为这会引发办事器的昂扬成本。

  别的,还要包管只有root和mysql可以拜候这些日记文件。

  弊端日记

  务必确保只有root和mysql可以拜候hostname.err日记文件。该文件存放在mysql数据汗青中。该文件包含着很是敏感的信息,如口令、地址、表名、存储过程名、代码等,它可被用于信息汇集,并且在某些环境下,还可以向报复打击者供给操纵数据库缝隙的信息。报复打击者还可以知道安装数据库的机械或内部的数据。

  MySQL日记

  确保只有root和mysql可以拜候logfileXY日记文件,此文件存放在mysql的汗青目次中。

  13、改变root目次

  Unix把持系统中的chroot可以改变当前正在运行的过程及其子过程的root目次。从头获得另外一个目次root权限的法度没法拜候或定名此目次以外的文件,此目次被称为“chroot监狱”。

  经由过程操纵chroot环境,你可以限制MySQL过程及其子过程的写把持,增加办事器的安然性。

  你要包管chroot环境的一个专用目次,如/chroot/mysql。别的,为了便利当用数据库的治理东西,你可以在MySQL建设文件的[client]部门改变下面的参数:

  [client]

  socket = /chroot/mysql/tmp/mysql.sock

  14、禁用LOCAL INFILE号令

  LOAD DATA LOCAL INFILE可以从文件系统中读取文件,并显示在屏幕中或保留在数据库中。假定报复打击者可以或许从利用法度找到SQL注进缝隙,这个号令就相当危险了。下面的号令可以从MySQL节制台进行把持:

  >SELECT LOAD_FILE("/etc/passwd");

  该号令列示了所有的用户。解决此标题问题标最好编制是在MySQL建设中禁用它,在CentOS中找到/etc/my.cnf或在Ubuntu中找到/etc/mysql/my.cnf,在[mysqld]部门增加下面一行:set-variable=local-infile=0。弄定。

  当然,唇亡齿冷,呵护办事器的安然对保障MySQL数据库的安然也是相当首要的。办事器的安然对数据库来讲可谓存亡攸关。

------分隔线----------------------------

推荐内容