1、前言
MySQL 是完全网络化跨平台关系型数据库系统同时是具有客户机/体系结构分布式数据库管理系统它具有功能强、使用简便、管理方便、运行速度快、可靠性强等优点用户可利用许多语言编写访问MySQL 数据库特别是和PHP更是黄金组合运用十分广泛
由于MySQL是多平台数据库它默认配置要考虑各种情况下都能适用所以在我们自己使用环境下应该进行进步加固作为个MySQL系统管理员我们有责任维护MySQL数据库系统数据安全性和完整性
MySQL数据库安全配置必须从两个方面入手系统内部安全和外部网络安全另外我们还将简单介绍编程时要注意些问题以及些小窍门
2、系统内部安全
首先简单介绍下MySQL数据库目录结构MySQL安装好运行了mysql_db_脚本以后就会建立数据目录和化数据库如果我们用MySQL源码包安装而且安装目录是/usr/local/mysql那么数据目录般会是/usr/local/mysql/var数据库系统由系列数据库组成每个数据库包含系列数据库表MySQL是用数据库名在数据目录建立建立个数据库目录各数据库表分别以数据库表名作为文件名扩展名分别为MYD、MYI、frm 3个文件放到数据库目录中
MySQL授权表给数据库访问提供了灵活权限控制但是如果本地用户拥有对库文件读权限话攻击者只需把数据库目录打包拷走然后拷到自己本机数据目录下就能访问窃取数据库所以MySQL所在主机安全性是最首要问题如果主机不安全被攻击者控制那么MySQL安全性也无从谈起其次就是数据目录和数据文件安全性也就是权限设置问题
从MySQL主站些老binary发行版来看3.21.xx版本中数据目录属性是775这样非常危险任何本地用户都可以读数据目录所以数据库文件很不安全3.22.xx版本中数据目录属性是770这种属性也有些危险本地同组用户既能读也能写所以数据文件也不安全3.23.xx版本数据目录属性是700这样就比较好只有启动数据库用户可以读写数据库文件保证了本地数据文件安全
如果启动MySQL数据库用户是mysql那么象如下目录和文件是安全请注意数据目录及下面属性:
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin
drwxrwxr-x 3 root root 4096 Feb 27 20:07
drwxrwxr-x 2 root root 4096 Feb 27 20:07 info
drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib
drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec
drwxrwxr-x 3 root root 4096 Feb 27 20:07 man
drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test
drwxrwxr-x 3 root root 4096 Feb 27 20:07 share
drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench
drwx------ 4 mysql mysql 4096 Feb 27 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql
drwx------ 2 mysql mysql 4096 Feb 27 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD
-rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI
-rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI
-rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI
-rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD
-rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI
-rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm
如果这些文件属主及属性不是这样请用以下两个命令修正的:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
用root用户启动远程服务直是安全大忌如果服务出现问题远程攻击者极有可能获得主机完全控制权MySQL从3.23.15版本开始时作了小小改动默认安装后服务要用mysql用户来启动不允许root用户启动如果非要用root用户来启动必须加上--user=root参数(./safe_mysqld --user=root &)MySQL中有LOAD DATA INFILE和SELECT ... INTO OUTFILESQL语句如果是root用户启动了MySQL那么数据库用户就拥有了root用户写权限不过MySQL还是做了些限制比如LOAD DATA INFILE只能读全局可读文件SELECT ... INTO OUTFILE不能覆盖已经存在文件
本地日志文件也不能忽视包括shell日志和MySQL自己日志有些用户在本地登陆或备份数据库时候为了图方便有时会在命令行参数里直接带了数据库密码如:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
这些命令会被shell记录在历史文件里比如bash会写入用户目录.bash_history文件如果这些文件不慎被读那么数据库密码就会泄漏用户登陆数据库后执行SQL命令也会被MySQL记录在用户目录.mysql_history文件里如果数据库用户用SQL语句修改了数据库密码也会因.mysql_history文件而泄漏所以我们在shell登陆及备份时候不要在-p后直接加密码而是在提示后再输入数据库密码
另外这两个文件我们也应该不让它记录我们操作以防万
shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
上门这两条命令把这两个文件链接到/dev/null那么我们操作就不会被记录到这两个文件里了
3、外部网络安全
MySQL数据库安装好以后Unix平台user表是这样:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| redhat | root | | Y | Y |
| localhost | | | N | N |
| redhat | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in (0.00 sec)
平台user表是这样:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| % | root | | Y | Y |
| localhost | | | Y | Y |
| % | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in (0.00 sec)
我们先来看Unix平台user表其中redhat只是我试验机机器名所以实际上Unix平台MySQL默认只允许本机才能连接数据库但是缺省root用户口令是空所以当务的急是给root用户加上口令给数据库用户加口令有 3种思路方法:
1)在shell提示符下用mysqladmin命令来改root用户口令:
shell>mysqladmin -uroot password test
这样MySQL数据库root用户口令就被改成test了(test只是举例我们实际使用口令定不能使用这种易猜弱口令)
2)用 password修改口令:
mysql> password for root@localhost=password('test');
这时root用户口令就被改成test了
3)直接修改user表root用户口令:
mysql> use mysql;
mysql> update user password=password('test') where user='root';
mysql> flush privileges;
这样MySQL数据库root用户口令也被改成test了其中最后句命令flush privileges意思是强制刷新内存授权表否则用还是缓冲中口令这时非法用户还可以用root用户及空口令登陆直到重启MySQL服务器
我们还看到user为空匿名用户虽然它在Unix平台下没什么权限但为了安全起见我们应该删除它:
mysql> delete from user where user='';
最新评论