文档章节

mysql 安全改造说明--借用人家的

罗文浩
 罗文浩
发布于 2016/06/14 15:57
字数 2693
阅读 29
收藏 4
点赞 0
评论 0

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

© 著作权归作者所有

共有 人打赏支持
罗文浩
粉丝 21
博文 133
码字总数 215937
作品 0
海淀
架构师
foryoufeng/ecfinal

ecfinal 我想先吐槽一下,你可以先看看这个 项目简要说明 INSTALL 项目要求 apache开启url重写 PHP版本 >=5.4 && PHP版本 <7 (原因:使用到了php的新特性 trait,所以要5.4以上,7以下是因为...

foryoufeng
2016/11/27
0
0
Percona Server 5.5.43-37.2 发布

Percona Server 5.5.43-37.2 发布,此版本基于 MySQL 5.5.43,包括其所有 bug 修复,是当前 5.5 系列的安全版本。 更新内容: Bugs 修复 A server binary as distributed in binary tarball...

oschina
2015/05/09
1K
5
Oracle 宣布 MySQL 5.6 正式版发布

在 MySQL 5.5 发布两年后,Oracle 宣布 MySQL 5.6 正式版发布,首个正式版版本号为 5.6.10。在 MySQL 5.5 中使用的是 InnoDB 作为默认的存储引擎,而 5.6 则对 InnoDB 引擎进行了改造,提供全...

oschina
2013/02/06
11.7K
40
如何绕过微信公众账号白名单数量限制(微信支付密钥借用教程)

这篇文章比较长,但仔细看完可保你微信支付调试成功 作为一名普通程序员,想体验一把自己开发的微信支付,并不是一件容易的事。 可以从 公众号接口权限说明 发现,只有企业资质认证的服务号才...

廖师兄
05/28
0
0
解决sqlalchemy线程安全问题

sqlalchemy是一个非常强大的python orm库,功能完善,BUG少,版本发布频繁,缺点就是代码的可读性略差,我估计过不了pep8、pylint的检查 ORM的好处 帮忙解决sql注入的问题 将操作SQL语句变成...

Jun_Wong
2017/10/24
0
0
一个运维老鸟的年终总结述职报告

整理文档,老男孩偶然发现了于大约10年前写的年终工作总结述职报告,2017年已过,2018年刚刚到来,希望这篇报告能发挥余热对大家写述职报告有帮助,希望大家2018年工资都能再翻倍,奋斗是一方...

老男孩oldboy
01/01
0
0
民生银行分布式NewSQL数据库实践

作者介绍:周鹏,现就职于中国民生银行信息科技部,负责全行数据库维护及分布式数据库平台建设等工作,具有多年的数据类系统架构设计及调优经验。对于新型分布式数据库、大数据生态系统研究具...

sunhf_csdn
05/09
0
0
Percona Server 5.1.49-rel11.3

Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的...

红薯
2010/09/11
1K
0
Percona Server 5.5.40-36.1 发布

Percona Server 5.5.40-36.1 发布,此版本是基于 MySQL 5.5.40,包括其所有 bug 修复。此版本是 5.5 系列的稳定版本,现已提供下载,同时也提供在 Percona Software Repositories。 Bugs 修复...

clouddyy
2014/10/10
1K
3
福利:上海站沙龙PPT从复旦大学快递送上!

上周日,DBAplus社群携手MSE CLUB,与5位数据库专家和一众IT小伙伴走进了百年名校复旦大学,在沪上知名学府浓厚的人文气息下,围绕架构和云展开了一场历届最青春洋溢的上海站技术沙龙,与复旦...

DBAplus社群
2016/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
21分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
29分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
52分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
42
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部