2 数据库安全加固... 28
2.1 修改root用户默认口令,删除空口令... 30
2.2 删除默认数据库和非必要数据库用户... 31
2.3 使用独立用户运行msyql32
2.4 关于非root数据库用户的管理... 33
2.5 关于默认管理员用户名的管理... 34
2.6 用户目录权限限制... 35
2.7 命令历史记录保护... 36
2.8 禁止用户远程连接数据库... 37
2.9 禁止MySQL对本地文件存取... 38
2.10 MySQL服务器权限控制... 39
2.11 开启MySQL错误日志... 40
2.12 数据库备份策略... 41
2.13 Mysqld安全相关启动选项
MySQL版本为5.5;按照操作系统、安装介质以及安装时设置的不同,安装目录会和本文示例有所区别。下表是MySQL手册中的默认安装目录及结构。
Linux操作系统下采用RPM方式安装,默认安装路径见下表。
表2-1 Linux安装后文件路径
Directory | Contents of Directory |
/usr/bin | Client programs and scripts |
/usr/sbin | The mysqld server |
/var/lib/mysql | Log files, databases |
/usr/share/info | Manual in Info format |
/usr/share/man | Unix manual pages |
/usr/include/mysql | Include (header) files |
/usr/lib/mysql | Libraries |
/usr/share/mysql | Miscellaneous support files, including error messages, character set files, sample configuration files, SQL for database installation |
/usr/share/sql-bench | Benchmarks |
本文中使用的MySQL全局配置文件也会根据操作系统以及安装方式不同,位于不同的目录下;下表分别是Linux下可能的位置。
表2-2 Linux下全局配置文件可能位置
File Name | Purpose |
/etc/my.cnf | Global options |
/etc/mysql/my.cnf | Global options |
SYSCONFDIR/my.cnf | Global options |
$MYSQL_HOME/my.cnf | Global options |
defaults-extra-file | The file specified with --defaults-extra-file=path, if any |
~/.my.cnf | User-specific options |
本文示例Linux环境采用rpm方式安装;安装路径为默认值,全局配置文件为/etc/my.cnf。
本文示例已将运行所需的命令文件所需的加入到系统变量中。
2.1 修改root用户默认口令,删除空口令
实施目的
缺省安装的MySQL的root用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少8位,由字母、数字和符号组成的不规律密码。
问题影响
为了保证用户的安全登录。
系统当前状态
查看系统当前的密码,查看mysql的user表。
实施步骤
使用MySQL自带的命令mysqladmin修改root密码,同时也可以登陆数据库,修改数据库mysql下的user表的字段内容,修改方法如下所示:
方法1:使用mysqladmin命令或者进入usr/bin目录使用mysqladmin工具修改密码。
# /usr/bin/mysqladmin -u root -p password
回车后在系统提示下输入旧密码以及新密码。
方法2:登陆数据库修改密码。
#mysql -u root -p
#mysql> use mysql;
#mysql> update user set password= password('newpassword') where user='root';
#mysql> flush privileges;
“flush privileges”命令的作用是强制刷新内存授权表,使得修改立即生效。
回退方案
恢复原始密码到加固前的设置。
判断依据
使用原始密码连接数据库,如果登陆失败且提示鉴权问题,则修改成功。
实施风险
低
重要等级
★★★
2.2 删除默认数据库和非必要数据库用户
实施目的
一般情况下,MySQL数据库安装后,只允许本地访问且很多用户不需要,尤其是默认安装的用户。
问题影响
MySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留root和ultravr即可,当然以后根据需要增加用户和数据库。
系统当前状态
存在test数据库以及mysql数据库中的user表中存在非必要的其他用户信息。
实施步骤
# mysql -u root -p
# mysql> show databases;
# mysql> drop database test; //删除数据库test
# mysql>use mysql;
# mysql>delete from db; //删除存放数据库的表信息,因为还没有数据库信息。
# mysql> delete from user where user <> 'root' and user <> 'ultravr'; // 删除初始非root和ultravr的用户
# mysql> delete from user where user='root' and password=''; //删除空密码的root
# mysql> delete from user where user='ultravr' and password=''; //删除空密码的ultravr
# mysql> flush privileges; //强制刷新内存授权表。
回退方案
恢复原始用户到加固前的设置。
判断依据
查询是否存在对应的数据库和用户数据信息。
实施风险
低
重要等级
★★★
2.2 删除默认数据库和非必要数据库用户
实施目的
一般情况下,MySQL数据库安装后,只允许本地访问且很多用户不需要,尤其是默认安装的用户。
问题影响
MySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留root和ultravr即可,当然以后根据需要增加用户和数据库。
系统当前状态
存在test数据库以及mysql数据库中的user表中存在非必要的其他用户信息。
实施步骤
# mysql -u root -p
# mysql> show databases;
# mysql> drop database test; //删除数据库test
# mysql>use mysql;
# mysql>delete from db; //删除存放数据库的表信息,因为还没有数据库信息。
# mysql> delete from user where user <> 'root' and user <> 'ultravr'; // 删除初始非root和ultravr的用户
# mysql> delete from user where user='root' and password=''; //删除空密码的root
# mysql> delete from user where user='ultravr' and password=''; //删除空密码的ultravr
# mysql> flush privileges; //强制刷新内存授权表。
回退方案
恢复原始用户到加固前的设置。
判断依据
查询是否存在对应的数据库和用户数据信息。
实施风险
低
重要等级
★★★
2.3 使用独立用户运行msyql
实施目的
mysqld拒绝使用root运行,除非使用-user=root选项明显指定。应该用普通非特权用户运行mysqld。正如前面的安装过程一样,为数据库建立独立的linux中的mysql账户,该账户用来只用于管理和运行MySQL。
问题影响
绝对不要作为使用root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。
系统当前状态
当前运行mysql用户为root。
实施步骤
要想用其它Linux用户启动mysqld,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。
方法1:修改/etc/my.cnf文档,配置mysqld的启动用户
#cp /etc/my.cnf /etc/my.cnf.bak //请在修改前备份/etc/my.cnf
#vi /etc/my.cnf
[mysqld]
user=mysql
该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safe或mysql.server启动,都能确保使用mysql的身份,
方法2:在启动数据库时,加上user参数。
# mysqld_safe –user=mysql &
mysqld运行时,只使用对数据库目录具有读或写权限的linux用户来运行。
回退方案
恢复/etc/my.cnf到加固前的状态。
判断依据
使用ps命令查询MySQL进程的执行用户。
实施风险
低
重要等级
★★★★★
2.4 关于非root数据库用户的管理
实施目的
使用一个低权限的用户访问授权的数据库,防止管理员密码外泄或者业务系统使用的账户具有高权限。
问题影响
因为root用户具有最高数据库权限,因此日常使用中对于业务系统直接使用root用户会造成安全上的很多威胁。
系统当前状态
系统中除了root用户外不存在其他用户。
实施步骤
我们需要创建一个单独的用户仅在本地访问FusionCloud UltraVR的业务数据库。
# mysql -u root -p
# mysql> CREATE USER ultravr@'localhost' IDENTIFIED BY 'mypassword';
# mysql> GRANT ALL ON lego.* TO 'ultravr'@'localhost';//授权对lego数据库有全部权限。
# mysql> flush privileges; //强制刷新内存授权表。
对于ISO和VHD方式安装的系统ultravr已经创建,需要执行下面的命令来加固:
# mysql -u root -p
# mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'ultravr'@'localhost';// 收回对所有数据库的全部权限。
# mysql> GRANT ALL ON lego.* TO 'ultravr'@'localhost';//授权对lego数据库有全部权限。
# mysql> flush privileges; //强制刷新内存授权表。
请不要将mysql数据库的权限赋给普通用户,特别是mysql.user表保存了很多用户敏感信息,建议只有管理员才有这张表的访问等权限。
如果还需要设置其他权限,请参考Mysql手册关于GRANT的描述。需要注意的是FusionCloud UltraVR的正常运行至少需要账户对lego数据库添加表、删除表、修改表、对表记录的插入、删除、修改以及执行存储过程权限。
回退方案
删除新建用户。
判断依据
# mysql> show GRANTS FOR 'ultravr'@'localhost';
+----------------------------------------------------------------------------------------------------------------+
| Grants for ultravr@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ultravr'@'localhost' IDENTIFIED BY PASSWORD '*63DAA25989C7E01EB96570FA4DBE154711BEB361' |
| GRANT ALL PRIVILEGES ON `lego`.* TO 'ultravr'@'localhost' |
+----------------------------------------------------------------------------------------------------------------+
实施风险
低
重要等级
★★★★
2.5 关于默认管理员用户名的管理
实施目的
修改mysql的管理员默认的管理员名称,减少穷举系统用户的恶意行为成功性。
问题影响
mysql的管理员名称是root,这一定程度上对系统用户穷举的恶意行为提供了便利,此时修改为复杂的用户名,请不要在设定为admin或者administraror的形式,因为它们也在易猜的用户字典中。
系统当前状态
当前管理员用户为root。
实施步骤
# mysql -u root -p
# mysql> use mysql;
# mysql> update user set user="newroot" where user="root"; //改成不易被猜测的用户名
# mysql> flush privileges;
回退方案
实施上述步骤,将管理员名称更新成root。
判断依据
使用root重新登录Mysql,提示失败;使用修改后的用户民登录提示成功。
实施风险
低
重要等级
★★
2.6 用户目录权限限制
实施目的
默认的mysql的数据库文件在/var/lib/mysql目录下,因此,必须保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,确保mysqld运行时,只使用对数据库目录具有读或写权限的linux用户来运行。
问题影响
限制/var/lib/mysql目录的访问,保证数据安全性。
系统当前状态
记录/var/lib/mysql当前的权限。
实施步骤
Linux操作系统:
# chown -R mysql.mysql /var/lib/mysql //确保数据库目录权限所属mysql用户
# chmod -R 700 /var/lib/mysql //mysql主目录给mysql用户已读、写和执行权限
回退方案
还原上述目录权限到加固前。
判断依据
Linux 下利用ls -l /var/lib | grep mysql查看权限。
实施风险
高
重要等级
★★★★
2.7 命令历史记录保护
实施目的
数据库相关的shell操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。
问题影响
.bash_history和.mysql_history文件的不慎使用导致信息泄露。
系统当前状态
两个文件记录shell里面操作的命令信息。
实施步骤
找到.mysql_history和.bash_history文件所在位置。
#find / -name .bash_history
/root/.bash_history
#find / -name .mysql_history
/root/.mysql_history
如果有需要可以备份这两个文件。
#cp /root/.bash_history /root/.bash_history.bak
#cp /root/.mysql_history /root/.mysql_history.bak
清空.bash_history和.mysql_history
# rm .bash_history .mysql_history //删除历史记录
# ln -s /dev/null .bash_history //将shell记录文件置空
# ln -s /dev/null .mysql_history //将mysql记录文件置空
回退方案
还原.bash_history和.mysql_history文件。
判断依据
查看对应的文件内容。
实施风险
低
重要等级
★★★
2.8 禁止用户远程连接数据库
实施目的
不允许高权限的用户从远程访问数据库,如果必要,可以将所有用户置为仅本地访问。
问题影响
允许高权限的用户(如root)远程访问数据库会导致数据库遭到网络***的可能,而只允许本地访问则可以通过操作系统的安全措施建立第一道拦截,减少数据库被网络***的风险。
系统当前状态
默认root可以远程连接数据库。
实施步骤
禁止root账户远程访问数据库。
# mysql -u root -p
# mysql> use mysql;
# mysql> delete from user where user='root' and host<>'localhost';
# mysql> delete from user where user='ultravr' and host<>'localhost';
# mysql> flush privileges;
回退方案
将user表还原到加固前的状态。
判断依据
远程使用root连接时,无法访问,提示访问被拒绝。
实施风险
低
重要等级
★★★
2.9 禁止MySQL对本地文件存取
实施目的
在mysql中,提供对本地文件的读取,使用的是load data local infile命令,默认在5.0版本中,该选项是默认打开的,网络上流传的一些***方法中就有用它LOAD DATA LOCAL INFILE的,同时它也是很多新发现的SQL Injection***利用的手段。
问题影响
本地文件的读取默认打开,使用load data local infile命令会把本地文件读到数据库中,然后用户就可以非法获取敏感信息。不需要读取本地文件,请务必关闭。应该禁止MySQL中用“LOAD DATA LOCAL INFILE”命令。
系统当前状态
默认开启对本地文件的读取。
实施步骤
方法1:在my.cnf中为[mysqld]添加local-infile=0。
方法2:在启动MySQL时加入参数local-infile=0。
#mysqld_safe -user=mysql -local-infile=0 &
-local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令,假如需要获取本地文件,需要打开,但是建议关闭。
回退方案
还原my.cnf到加固前的状态。
判断依据
#mysql> use mysql;
#mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ',';
#ERROR 1148 (42000): The used command is not allowed with this MySQL version
实施风险
低
重要等级
★★★
2.10 MySQL服务器权限控制
实施目的
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE等权限(详见user超级用户表)。还可对MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。
问题影响
管理员可以对user,db,host等表进行配置,来控制用户的访问权限,而user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user表中的权限设成’N'并且仅在特定数据库的基础上授权。你可以为特定的数据库、表或列授权,FILE权限给予你用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读和写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器能读或写的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。
系统当前状态
记录sqlfile.txt、user信息。
实施步骤
FILE权限允许用户在MySQL服务器具有写权限的目录下创建新文件,但不能覆盖已有文件在user表的File_priv设置Y或N。所以当你不需要对服务器文件读取时,请关闭该权限。
# mysql -u root -p
# mysql> use mysql;
# mysql> update user set File_priv='N' where user='root'; //禁止读取权限
# mysql> update user set File_priv='N' where user='ultravr'; //禁止读取权限
# mysql> flush privileges;
回退方案
还原到加固前的状态。
判断依据
# mysql -u root -p
# mysql> use mysql;
#mysql> load data infile 'sqlfile.txt' into table user fields terminated by ','; //重登陆读取文件
#ERROR 1045 (28000): Access denied for user 'notroot'@'localhost' (using password: YES) //失败
# mysql> select * from user into outfile 'test.txt' fields terminated by ',';
ERROR 1045 (28000): Access denied for user ‘notroot’@'localhost’ (using password: YES)
实施风险
低
重要等级
★★★
2.11 开启MySQL错误日志
实施目的
开启Mysql错误日志可以提高检测出恶意访问的能力。
实施步骤
登陆Mysql后
# mysql>show variables like 'log_%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /var/lib/mysql/linux-vrserver-02.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
查看log_error是否有记录,Value即为日志位置。
如果Value为OFF,则请在my.cnf的[mysqld]下增加一行:
log-error=log_path/error.log
然后重启数据库。
回退方案
还原my.cnf到加固前的状态。
实施风险
低
重要等级
★★★
2.12 数据库备份策略
实施目的
建议使用FusionCloud UltraVR提供的备份配置数据功能对数据库进行备份。
实施步骤
登录FusionCloud UltraVR系统,进入管理 -> 备份配置数据 页面进行配置。详细操作参考帮助系统。
实施风险
低
重要等级
★★★
2.13 Mysqld安全相关启动选项
实施目的
在MySQL启动时可以指定一些安全相关的参数,这些参数会对系统的安全产生重要的影响。本章节就这些安全相关的参数进行说明。用户启动MySQL时可以根据自身需要进行选择。
实施步骤
在my.cnf中添加相应的启动选项:
--local-infile[={0|1}]
如果用local-infile=0启动服务器,则客户端不能使用LOCAL IN LOAD DATA语句。
LOCAL IN LOAD DATA的安全隐患请参考本文2.9节。建议使用local-infile=0启动服务器。
--old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。但是如果不考虑持旧版本客户端程序时请不要启用该选项。
--safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。
--secure-auth
不允许鉴定有旧(pre-4.1)密码的账户。
--skip-symbolic-links
建议开启此选项禁用have_symlink(符号链接)属性。
实施风险
低
重要等级
★★★