2 数据库安全加固html
2.1 修改root用户默认口令,删除空口令mysql
2.2 删除默认数据库和非必要数据库用户linux
2.3 使用独立用户运行msyqlsql
2.4 关于非root数据库用户的管理shell
2.5 关于默认管理员用户名的管理数据库
2.6 用户目录权限限制安全
2.7 命令历史记录保护bash
2.8 禁止用户远程链接数据库服务器
2.9 禁止MySQL对本地文件存取网络
2.10 MySQL服务器权限控制
2.11 开启MySQL错误日志
2.12 数据库备份策略
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。
本文示例已将运行所需的命令文件所需的加入到系统变量中。
实施目的
缺省安装的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”命令的做用是强制刷新内存受权表,使得修改当即生效。
回退方案
恢复原始密码到加固前的设置。
判断依据
使用原始密码链接数据库,若是登录失败且提示鉴权问题,则修改为功。
实施风险
低
重要等级
★★★
实施目的
通常状况下,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; //强制刷新内存受权表。
回退方案
恢复原始用户到加固前的设置。
判断依据
查询是否存在对应的数据库和用户数据信息。
实施风险
低
重要等级
★★★
实施目的
通常状况下,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; //强制刷新内存受权表。
回退方案
恢复原始用户到加固前的设置。
判断依据
查询是否存在对应的数据库和用户数据信息。
实施风险
低
重要等级
★★★
实施目的
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进程的执行用户。
实施风险
低
重要等级
★★★★★
实施目的
使用一个低权限的用户访问受权的数据库,防止管理员密码外泄或者业务系统使用的帐户具备高权限。
问题影响
由于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' |
+----------------------------------------------------------------------------------------------------------------+
实施风险
低
重要等级
★★★★
实施目的
修改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,提示失败;使用修改后的用户民登陆提示成功。
实施风险
低
重要等级
★★
实施目的
默认的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查看权限。
实施风险
高
重要等级
★★★★
实施目的
数据库相关的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文件。
判断依据
查看对应的文件内容。
实施风险
低
重要等级
★★★
实施目的
不容许高权限的用户从远程访问数据库,若是必要,能够将全部用户置为仅本地访问。
问题影响
容许高权限的用户(如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链接时,没法访问,提示访问被拒绝。
实施风险
低
重要等级
★★★
实施目的
在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
实施风险
低
重要等级
★★★
实施目的
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)
实施风险
低
重要等级
★★★
实施目的
开启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到加固前的状态。
实施风险
低
重要等级
★★★
实施目的
建议使用FusionCloud UltraVR提供的备份配置数据功能对数据库进行备份。
实施步骤
登陆FusionCloud UltraVR系统,进入管理 -> 备份配置数据 页面进行配置。详细操做参考帮助系统。
实施风险
低
重要等级
★★★
实施目的
在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(符号连接)属性。
实施风险
低
重要等级
★★★