PHP安全:MySQL的使用安全

数据库 MySQL
在与PHP结合应用方面,MySQL是最好的关系型数据库管理系统之一。MySQL使用不当,常常会引起致命的安全问题。

[[350837]]

 MySQL 基础知识

MySQL是一个流行的关系型数据库管理系统(Relational Database Management System,RDMS),在与PHP结合应用方面,MySQL是最好的关系型数据库管理系统之一。MySQL使用不当,常常会引起致命的安全问题。

1、运行安全

为了防止攻击者通过MySQL漏洞越权获取更高的权限,不要使用系统root用户运行MySQL服务器。mysqld默认拒绝使用root运行,如果对mysqld服务需要指定用户进行运行,应该使用普通非特权用户运行mysqld,同时为数据库建立独立的Linux中的MySQL账户,该账户只用于管理和运行MySQL。

在MySQL配置/etc/my.cnf文件中指定执行账户。 

  1. vim /etc/my.cnf  
  2. [mysqld]  
  3. user=mysql 

这个配置使服务器用指定的用户来启动,无论是手动启动还是通过mysqld_safe或mysql.server启动,都能确保使用MySQL的身份。也可以在启动参数上进行配置,加上user参数。 

  1. /usr/local/mysql/bin/mysqld_safe --user=mysql & 

默认的MySQL安装在/usr/local/mysql,对应的默认数据库文件在/usr/local/mysql/var目录下,必须保证该目录不能让未经授权的用户访问后把数据库打包复制走,所以要限制对该目录的访问。mysqld运行时,只使用对数据库目录具有读或写权限的Linux用户来运行。

MySQL主目录只允许root用户进行访问。 

  1. chown -R root /usr/local/mysql/ 

数据库目录只允许MySQL用户进行访问。 

  1. chown -R mysql.mysql /usr/local/mysql/var 

2、密码安全

默认安装的MySQL的root用户密码是空密码,为了安全起见,必须修改为强密码,即至少8位,由字母、数字和符号组成的不规律密码。使用MySQL自带的mysqladmin命令修改root密码。

  1. mysqladmin -u root password "new-password" //使用mysqladmin修改密码 

同时可以使用下面的命令登录数据库对密码进行修改。 

  1. mysql>use mysql  
  2. mysql>update user set pas sword=pas sword('new-password') where  
  3. user='root' 
  4. mysql>flush privileges; // 强制刷新内存授权表,否则使用的还是在内存缓冲的口令 

3、账号安全

系统MySQL的默认管理员名称是root,而一般情况下,数据库管理员都没有进行修改,这在一定程度上为系统用户密码暴力破解的恶意攻击行为提供了便利,应该修改为复杂的用户名,加强账号的安全,同时不要使用admin或者administrator,因为它们也在易猜解的用户字典中。 

  1. mysql>update user set user="new-root-name" where  
  2. user="root" 
  3. mysql>flush privileges; // 强制刷新内存授权表,否则使用的还是在内存缓冲的口令 

需要正确地给用户分配权限,不要将全部权限分配给普通用户,有选择性地分配读写权限,如只分配查询权限给用户。 

  1. mysql>grant SELECT on db.table to username@'localhost' 

不要将with grant option授权给普通用户,防止普通用户将权限授予他人,造成管理混乱。

表1是常用的权限及说明。

表1  常用权限及说明

4、数据库安全

默认MySQL安装初始化后会自动生成空用户和test库,进行安装测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个root即可。当然,以后可以根据需要增加用户和数据库。 

  1. mysql>show databases;  
  2. mysql>drop database test; // 删除数据库test  
  3. use mysql;  
  4. delete from db; // 删除存放数据库的表信息,因为还没有数据库信息  
  5. mysql>delete from user where not (user='root'); // 删除初始非root的用户  
  6. mysql>delete from user where user='root' and password=; // 删除空密码的root  
  7. Query OK, 2 rows affected(0.00 sec)  
  8. mysql>flush privileges; // 强制刷新内存授权表 

5、限制非授权IP访问

如果是单机运行MySQL,推荐开启skip-networking,可以彻底关闭MySQL的TCP/IP连接方式。 

  1. # my.ini  
  2. skip-networking 

如果是固定IP访问MySQL,可以在配置文件中增加bind-address=IP,前提是关闭skip-networking。

  1. bind-address=10.10.1.1 

6、文件读取安全

在MySQL中,使用load data local infile命令提供对本地文件的读取功能。在5.0版本中,该选项是默认打开的,该操作会利用MySQL把本地文件读到数据库中,然后攻击者就可以非法获取敏感信息。假如不需要读取本地文件,应将其关闭。

网络上流传的一些攻击方法中就有用到load data local infile的,同时它也是很多新发现的SQL Injection攻击利用的手段。攻击者还能通过使用load data local infile装载“/etc/passwd”进一个数据库表,然后用SELECT显示它,这个操作对服务器的安全来说是致命的。

可以在my.cnf中添加local-infile=0参数。 

  1. vim /etc/my.cnf  
  2. [mysqld]  
  3. set-variable=local-infile = 0 

或者在MySQL启动时添加local-infile=0参数。

  1. /usr/local/mysql/bin/mysqld_safe --user=mysql --local-infile=0 & 

7、常用安全选项

下面是一些MySQL自己提供的安全选项,在使用MySQL服务时可以根据自己的需要进行灵活的配置。

  1. --allow-suspicious-udfs 

该选项控制是否可以载入主函数只有xxx符号的用户定义函数,如xxx_init()、xxx_deinit()、xxx_reset()、xxx_clear()、xxx_add()等函数。默认情况下,该选项关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。

  1. --local-infile[={0|1}] 

如果用--local-infile=0启动服务器,则客户端不能使用LOCAL IN LOAD DATA语句。 

  1. --old-passwords 

强制服务器为新密码生成短(pre-4.1)散列密码。当服务器必须支持旧版本客户端程序时,这对于保证兼容性很有作用。 

  1. (OBSOLETE) --safe-show-database 

在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。在MySQL 5.1中,该选项不再作为现在的默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。 

  1. --safe-user-create 

如果启用,用户不能使用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果要让用户具有授权权限来创建新用户,应给用户授予下面的权限。 

  1. mysql> GRANT INSERT(user) ON mysql.user TO'user_name'@'host_name'; 

这样确保用户不能直接更改权限列,必须使用GRANT语句给其他用户授予该权限。

  1. --secure-auth 

不允许鉴定有旧(pre-4.1)密码的账户。 

  1. --skip-grant-tables 

这个选项导致服务器根本不使用权限系统,从而使得每个人都有权完全访问所有数据库!(通过执行mysqladmin flush-privileges或mysqladmin eload命令,或执行FLUSH PRIVILEGES语句,可以告诉一个正在运行的服务器再次开始使用授权表。) 

  1. --skip-name-resolve 

主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost。 

  1. --skip-networking 

在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行。 

  1. --skip-show-database 

使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意,全局权限指数据库的权限。

8、数据安全

在生产环境中,数据库可能会遭遇各种各样的不测从而导致数据丢失,如硬件故障、软件故障、自然灾害、恶意攻击者攻击、误操作等都会对数据造成损坏或丢失。为了在数据丢失之后能够及时恢复数据,需要定期对数据进行备份。

备份数据的策略要根据不同的业务场景进行定制,大致有几个参考数值,可以根据这些数值来定制符合特定环境中的数据备份策略。

(1)能够容忍丢失多少数据。

(2)恢复数据需要多长时间。

(3)需要恢复哪些数据。

根据业务场景的需要来选择备份方式是完整备份、增量备份还是差异备份。 

 

责任编辑:庞桂玉 来源: 计算机与网络安全
相关推荐

2020-11-09 15:49:38

PHPMemcache网络安全

2020-08-19 15:30:04

PHP网络安全代码

2020-10-14 11:30:10

PHP网络安全加密

2018-10-06 05:00:53

2016-10-10 00:18:27

2011-05-25 13:17:22

MySQL

2010-05-19 18:42:23

2009-02-23 09:11:21

2010-07-15 15:49:53

PHP网站安全

2011-09-14 10:38:39

2020-10-24 14:10:26

PHP网络安全人机识别

2013-06-05 09:51:04

2009-12-02 09:21:04

PHP数据过滤

2011-05-18 15:33:18

2009-12-08 09:51:10

PHP intval函

2009-12-11 15:28:02

PHP安全防护

2021-08-12 10:31:59

MySQL安全方法

2009-01-14 10:01:46

2015-06-08 15:36:07

2011-07-14 09:38:13

点赞
收藏

51CTO技术栈公众号