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数据库的安全也是至关重要的。服务器的安全对于数据库来说可谓生死攸关。

保障MySQL安全的14个最佳方法的更多相关文章

  1. mysql 5.7.14 安装配置方法图文教程(转)

    http://www.jb51.net/article/90259.htm ******************************** 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如 ...

  2. mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)(转)

    http://www.jb51.net/article/90302.htm ******************************* 这篇文章主要为大家分享了MySQL 5.7以上缩版本安装配置 ...

  3. [MySQL Reference Manual]14 InnoDB存储引擎

    14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...

  4. CentOS 6.4 编译安装Mysql 5.6.14

    概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...

  5. LNMP搭建01 -- 编译安装MySQL 5.6.14 和 LNMP相关的区别

    [编译安装MySQL 5.6.14] [http://www.cnblogs.com/xiongpq/p/3384681.html ]  [mysql-5.6.14.tar.gz 下载] http:/ ...

  6. MySQL服务器线程数的查看方法详解

    本文实例讲述了MySQL服务器线程数的查看方法.分享给大家供大家参考,具体如下: mysql重启命令: ? 1 /etc/init.d/mysql restart MySQL服务器的线程数需要在一个合 ...

  7. MySQL 5.7 的SSL加密方法

    MySQL 5.7 的SSL加密方法 MySQL 5.7.6或以上版本 (1)创建证书开启SSL验证--安装opensslyum install -y opensslopenssl versionOp ...

  8. 14条最佳JS代码编写技巧

    http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...

  9. CentOS 6.4下编译安装MySQL 5.6.14 (转)

    CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm ...

随机推荐

  1. Python学习笔记:05类

    类 Python是面向对象的语言,面向对象最重要的三个优点有: 多态:多态使对象具备不同的行为方式.(可以认为声明了接口,但是实现方式可能多样) 封装:封装是对全局作用域中隐藏多余信息的原则(创建对象 ...

  2. The Managed Metadata Service or Connection is currently not available

    Does the following error message looks familiar to you?  when you go to site Actions -> Site Sett ...

  3. 运行Capture.exe找不到cdn_sfl401as.dll

    今天运行capture Orcad16.6显示缺少cdn_sfl401as.dll,昨天运行时并没有发现这种情况,回想今天安装了modelsim之后才发生这种情况,于是将modelsim卸载掉,再次启 ...

  4. System.Web.Http.Tracing 在webapi里面应用

    最近想写log.再接口里面 所以就想到了.net 4.0提供的这个类. 整好.配合asp.net api好使用 ,而且 本地调试会在 vs Output 里面输出. 1.开启这个Tracing con ...

  5. COJ 0885 LCS???

    LCS??? 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入两个字符串A.B,输出他们的最长连续公共子串长度. 输入 第一 ...

  6. JavaScript权威指南学习笔记6

    这两天主要翻看了书中的第18-22章,重点看了第17章:事件化处理,其它几章节主要是翻了下书知道有相关的概念,没有真正理解其中的内容,或者没有考虑究竟如何能把里面的内容应用到实际的项目中.说的讽刺一点 ...

  7. 在Excel中将数字设置成文本格式的技巧

    在Excel中将数字设置成文本格式的技巧 一个简单的方法,利用[数据]菜单的[分列]功能来将数字设置为文本格式.具体操作步骤为: 1.选中所有需要处理的数字单元格. 2.选择[数据]菜单[分列]功能. ...

  8. vs2010旗舰版产品密钥

    Microsoft Visual Studio 2010(VS2010)正式版 CDKEY / SN: YCFHQ-9DWCY-DKV88-T2TMH-G7BHP 企业版.旗舰版都适用

  9. HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)

    Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错 ...

  10. 解读sample1

    说明 理解被测试代码 理解测试代码 TEST宏 EXPECT_*断言和ASSERT_*断言 检查数值比较结果的断言 检查布尔值的断言 说明 被测试代码文件 sample1.h.sample1.cc 测 ...