LAMP网站开发黄金组合Linux+Apache+MySQL+PHP
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.5 数据文件安全性

数据文件的安全性,是文件系统级的安全问题,如在多用户服务器上,保护数据文件免遭到其他用户的查看、修改、或删除等。相对于数据库系统本身的安全性,数据文件的安全性也称为内部安全性。

6.5.1 保护哪些文件

在多用户服务器上,如果其他用户具有对MySQL数据文件的访问权限,则会威胁数据的安全性,需要加以控制。具体来说,所要保护的数据文件包括:

1.数据库文件

想要保证MySQL数据库的安全性,必须首先保证数据库文件的安全性。数据库管理员要保证数据不能被别人随便访问,否则别人可以通过直接拷贝、修改、删除数据文件,造成数据的泄露或破坏。

2.日志文件

除数据文件之外,还需要保证常规和更新日志的安全性,因为日志文件包含了一些与数据库交互的查询文本。有了这些文本,一方面,别人就可以监控发生数据库中的所有事务处理;另一方面,像GRANT和SET PASSWORD这样的查询也在日志中,其中包含一些重要的信息(如登录密码等),也会因日志文件的丢失而泄露。

6.5.2 保护Linux文件

上面介绍了Windows操作系统如何控制数据文件的安全性,下面介绍在Linux/UNIX系统中的相应操作。

1.UNIX系统下数据目录

首先来了解MySQL在LILNX/UNIX下的目录。MySQL安装好,运行mysql_db_install脚本就会建立数据目录和初始数据库。如果用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目录一般会是/usr/local/mysql/var。

每个数据库都包含一系列表,MySQL是用数据库名在数据目录建立一个文件夹,里面有数据表文件,并以表名作为文件名,扩展名分别为MYD、MYI、frm。

下面是一些不同版本MySQL的数据目录默认访问属性:

(1)3.21.xx版本:数据目录的属性是775,任何本地用户都可以读数据目录,数据库文件不安全。

(2)3.22.xx版本:数据目录的属性是770,本地的同组用户既能读也能写,数据文件也不安全。

(3)3.23.xx版本数据目录的属性是700,只有启动数据库的用户才可以读写数据库文件,这样保证了本地数据文件的安全。

★ 注意 ★

对于上面所述Linux/UNIX文件系统的访问属性代码所表示的含义,请参考Linux/UNIX相关内容,此处,不作额外介绍。

2.设置数据目录访问属性

假设启动MySQL数据库的用户是mysql,那么使用ls-l命令查看/usr/local/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 include
        drwxrwxr-x 2 root root 4096 Feb 27 20:07 info
          …
        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
        …

想要改变目录的访问属性,可以通过下面两个命令来完成:

    % chown -R mysql.mysql /usr/local/mysql/var
    % chmod -R go-rwx /usr/local/mysql/var

另外,日志文件也不能忽视,包括shell的日志和MySQL的日志。

(1)shell日志

有些用户为了便于登录或备份数据库,有时会在命令行参数里直接带数据库的密码,如:

    % /usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
    % /usr/local/mysql/bin/mysql -uroot -ptest

这些命令会被shell记录在日志中,比如bash会写入用户目录的.bash_history文件,如果这些文件丢失,那么就会泄露数据库密码。

(2)MySQL日志

登录到MySQL后,用户提交的SQL命令也会被MySQL记录,并存放在在用户目录的.mysql_history文件里。

为使这两个文件不记录数据操作,可做如下操作:

    % rm .bash_history .mysql_history
    % ln -s /dev/null .bash_history
    % ln -s /dev/null .mysql_history

上面两条命令把两个日志文件链接到/dev/null,这样操作就不会被记录了。

6.5.3 保护Windows文件

虽然本书介绍的是LAMP开发,但是一部分读者可能在Windows下进行开发,因此也介绍如何在Windows操作系统中保护MySQL数据文件。不妨假设数据文件目录为“C:\mysql\data”,然后通过具体示例来说明如何保证该目录的安全。

假设数据库管理员只希望Windows的系统管理员用户组(Administrators Group)可以读取C:\mysql\data下的文件,用户Super对该目录有所有的权限,而其他用户和组只能查看其中的文件和子目录,而不能读取数据,则可以通过如下步骤实现这个要求:

(1)用具有系统管理员身份的用户登录Windows,在文件夹“C:\mysql\data”上单击右键,选择“属性”命令,在打开的对话框中选择“安全”选项卡。

(2)除Administrators、Everyone以及Super用户所在的组之外,删除其他组,如图6-1所示。

图6-1 删除不能访问文件夹的用户组

(3)设置Administrators组的访问权限,使其只能读,如图6-2所示。

图6-2 设置Administrators组的访问权限

(4)同设置Administrators组的访问权限,设置Everyone组的访问权限,使其只能浏览本目录:单击Everyone组,并勾掉相应的权限选项。

★ 注意 ★

在设定Everyone的权限的时候,需要将下面的“允许将来自父系的可继承权限传递给该对象”前面的选择取消掉,如图6-3所示。这时,屏幕上会弹出一个安全提示,这里选择“复制”或者“删除”都可以,意思是是否保留或者删除“从父系继承的权限”,再点“删除”。

图6-3 设置Everyone组的权限继承性

(5)设置Super用户的访问权限,使其只能完全控制(读、写、改)目录。首先添加Super用户,如图6-4所示,从列表中,选择“Super”用户,然后单击“添加”按钮,然后设定其访问权限为完全控制。

图6-4 添加Super用户

(6)单击“确定”按钮。

这样,除Super之外的用户就不能写这个文件夹,除Administrators之外的用户不能读,而只能浏览目录。也可以对这些权限作进一步限制,在此不再赘述。

★ 注意 ★

Windows98没有考虑文件的安全性问题,如果多个用户使用一台电脑,那么一个人的文件,其他人也可以打开、复制、修改或删除。在Windows NT以及后续版本的系统中,则考虑了这个问题。

Windows NT采用的NTFS文件系统,在安装Windows NT的时候安装程序提示是否要将磁盘分区转换成NTFS格式。只有磁盘采用了NTFS的文件系统,才能给目录、文件提供安全设置。