찾다
데이터 베이스MySQL 튜토리얼保障MySQL保险的14个最佳方法
保障MySQL保险的14个最佳方法Jun 07, 2016 pm 04:15 PM
mysql보험확신하다방법최적의

保障MySQL安全的14个最佳方法 MySQL数据库一贯以高性能、高可性和易用性著称,它已经成为世界上最流行的开源数据库。大量的个人、WEB开发者、大型公司等都在其网站、关键系统、软件包中广泛使用MySQL数据库。 ? 通常,许多企业在部署一种产品时,安全性常常得

保障MySQL安全的14个最佳方法

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

1 楼 elan1986 2013-11-23   mark!!! 2 楼 houyujiangjun 2013-11-24   很有用,大多数都没考虑到。。。。 3 楼 focus2008 2013-11-24   从51cto弄过来的吧 4 楼 focus2008 2013-11-24   grant命令没有 FLUSH PRIVILEGES的必要吧
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql-connector是什么mysql-connector是什么May 12, 2022 pm 04:04 PM

“mysql-connector”是mysql官方提供的驱动器,可以用于连接使用mysql;可利用“pip install mysql-connector”命令进行安装,利用“import mysql.connector”测试是否安装成功。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구