Windows下MySQL配置及安全加固总结
在网管的实际使用过程中,MySQL数据库在安装后的配置及安全加固内容,在客户中逐渐要求越来越高。从反馈的问题看,一般都是由第三方软件公司的软件扫描整个系统,mysql的相关内容不符合要求测试肯定不能通过。自动检测的软件,主要使用两种判断方式:一、根据mysql官方发布的信息判断当前版本是否有已知的严重bug;二、进入mysql数据库,通过执行各种查询命令,检查相应的功能开关是否打开。对于第一种,需要我们从mysql的官方网站更新当前最新版本来解决;第二种,由于目前流行的mysql加固很多都是在linux\unix系统,与windows系统的操作有所不同,所以需要与检验人员进行协商,采用windows下的操作方式,达到该安全加固目的即可。
本文档中的mysql数据库都是基于mysql-5.5.33-win32.msi版本。
1. 网管相关
背景信息
网管相关的修改内容是为了提高网管的性能。该部分内容对CS网管有实际意义,EzView使用中即使不添加,也没有出现过异常。但是迁移恢复CS数据时,一定要增加该部分内容,否则有可能数据恢复不完全。
该部分实际与安全加固内容没有关系。
操作步骤
修改mysql安装路径(如:C:\Program Files\MySQL\MySQL Server 5.5)下的my.ini文件,在文件最后增加如下信息:
skip-name-resolve
back_log=200
innodb_file_per_table=1 innodb_file_format='Barracuda'
字段解释
Skip-name-resolve
--该项为“禁用DNS反向解析”,可以消除MySQL进行DNS解析的时间,目的是为了提高mysql的远程连接速度;
Back_log=200
--该项为在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存放在堆栈中;
innodb_file_per_table=1
--该项为 修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间;
innodb_file_format=’Barracuda’
--该项为 设置innodb文件类型为Barracuda
后两项的作用是启用压缩格式,紧缩数据库表的大小。
2.安全加固
背景信息
该部分内容主要是通过深圳移动测试反馈的内容进行总结,主要涉及用户、权限、日志、远程等方面。
此处说明一下mysql命令行的进入方式。
完全按照操作手册安装完mysql后,在cmd命令行可输入如下命令进入本地mysql:
mysql -u root -p
输入密码后回车即可。
登录到远程主机的mysql,输入如下命令:
mysql -h 172.18.10.160 -u root -p
输入密码后回车即可。
或者进入“开始>所有程序>mysql>MySQL Server 5.5>MySQL 5.5 Command Line Client”,输入root用户密码回车即可。
加固内容
2.1 Mysql root用户的密码
安全加固测试时,密码绝对不能用root! 目前安装手册中默认都是“Admin_123456”。
加固测试会检查密码是否为空或者弱密码。
Mysql命令行修改root用户密码方法:
mysql> update user set password=password('test!p3') where user='root'; mysql> flush privileges;
2.2 防止文件注入
说明:mysql默认是允许文件注入的。
比如在mysql命令行输入 load data local infile ‘D:\pet.txt’ into table tmp;
该命令意为将本地D盘的pet.txt文件写入表tmp,利用这个功能是可以做很多很多事的,有兴趣的可以研究下。
解决办法:
在my.ini中 最后添加
local_infile=0
保存文件,重启mysql服务。
验证方法:
再输一遍刚才的命令,出现错误提示,则说明设置成功。
mysql> LOAD DATA LOCAL INFILE 'D:\pet.txt'INTO TABLE TMP;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
2.2 日志输出
说明:mysql实际上默认是有error的日志文件输出的,默认是在data文件夹下,默认路径C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data。
一般以主机名命名,后缀是.err。
安全加固要求一般要求有以下几种日志:查询日志、错误日志、二进制日志、更新日志、慢查询日志。
在mysql 5.0及以上版本中,二进制日志取代了更新日志。
解决办法:
在my.ini中 最后添加以下字段:
log=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\log.log
log_err=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\err.log
log_bin=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\binary.bin
log_slave_updates=1
long_query_time=2
log_slow_queries=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\slowqueries.log
这里蓝色部分的路径和文件的名称都是可以自定义的。如果都不填写,则系统会用默认的名称放在默认路径下。
保存文件,重启mysql服务。
字段说明:
log:查询日志
log_err:错误日志
log_bin:二进制日志
log_slave_updates:需启用二进制日志后才生效,涉及到主从mysql,有兴趣自查。
long_query_time:长查询时间标准,单位秒。
Log_slow_queries:慢查询日志。
验证方法:
查询\错误\慢查询 日志,会在重启后自动生成.log的文件。二进制 日志,
例如binary.bin实际上会生成binary.index和binary.0000001的文件,每次mysql服务启动或者flush logs都会自动生成一个序号+1的文件。
安全监测的方法实际上就是检查一下mysql中相应字段是否存在。可以在mysql中输入如下命令自查(两幅图分别是填了路径和未填路径的情况):
2.3最大连接数
说明:实际上在安装mysql后的设置界面中,可以设置最大连接数,但是实际操作中发现即使设置了1000,进入my.ini发现max_connections的值也不是1000.所以安全检测有可能该项就不符合。
解决办法:
将my.ini中max_connections=值改为1000,保存文件,重启mysql服务。
验证方法:
可在mysql命令行用该命令验证
2.4mysql运行系统用户问题 // http://www.pprar.com
说明:安全加固要求服务器所在的主机不能是最高权限的用户(administrator)来操作mysql,一般都是建一个专门操作mysql的用户,这个用户除了对mysql相关的文件具有完全权限外,不能对其他文件进行操作。Linux\unix系统下处理比较方便,例如新建一个mysqluser的用户,在my.cnf文件中mysqld下输入user=mysqluser 就可以了,除了mysqluser这个用户可以启动mysql服务,即使root用户也不能启动mysql。Windows下操作稍微复杂一点。
解决办法:
新建一个低权限用户mysql,使mysql用户可以运行mysql服务。
新建一个系统用户mysql,例如使mysql仅具有guest用户组的权限。
我的电脑右键>管理>本地用户和组,新建用户mysql,设置密码Admin123,右键属性>隶属于guest。
在mysql程序的安装路径和数据存放路径给mysql用户添加权限。
进入控制面板>管理工具>服务,在mysql服务上右键属性>登录,选择此账户,输入账户的密码。单击确定,保存。
使用mysql账户登录就可以在低权限的账户下运行mysql服务了。
2.5mysql数据库用户问题
说明:一般检查是否有匿名用户,最高权限用户有几个,是否可以新建账户。按安装说明安装的话,一般都是没有匿名账户的,如果在设置root密码的界面勾选了enable root access from remote machines,则执行命令select user,host from mysql.user; 会发现有两个root用户,root %和root localhost。
解决方法:
匿名账户:mysql命令行输入select user,host from mysql.user;查看用户即可,看是否有用户名为空的用户存在。
删除匿名账户可采用以下命令:
mysql>use mysql; mysql>delete from user where User = ''; mysql> flush privileges;
最高权限用户:CS网管必须要有root %用户。Ezview网管可以不用root %用户,对于有这项工程需求的用户可以在安装mysql的时候,enable root access from remote machines 不勾选。
已安装完成的可以通过命令行执行下图命令,删除root %用户。
一般不建议删除root用户,最好在安装时就设置好,否则可能影响mysql的再配置。
新建账户:使用root localhost用户登录,新建用户即可。
执行成功的话,提示如截图。
验证方法:输入如下命令
使用新用户登录mysql。
附加说明:
假如使用新建的用户来操作网管,可给该用户只添加hisysdb的最高权限,避免对服务器上其他数据库进行操作。
Flush privileges;命令是必要的,刷新权限后,dbtool就可以使用新账户登录了。
为了保证网管使用,修改release\server\profile 路径下dataSource.xml文件,将用户名由root改为新建的用户,如pppadmin。
property name="username" value="root"/> 注:文件有两处地方都要改value的值。
这样初始化数据库才没有问题。
2.6限制远程连接
说明:在早期的mysql版本和linux\unix系统下,直接在my.ini或my.cnf中输入skip_networking,保存重启即可。这种方式限制mysql只能在本地访问,而且禁止了TCP端口,用pipe方式访问。安全加固测试时这项不通过,一般就是在my.ini里没有配置该项内容,但是windows下用了该方式,mysql服务可以启动,但是ezview网管就无法使用了。
解决办法:
Mysql提供了新的限制只在本地访问的方法,在my.ini中最后添加如下字段:
bind-address=127.0.0.1
保存文件,重启mysql服务即可。
验证方法:
可以使用root %用户,或者新建一个host不是localhost的账户远程登录mysql服务器看是否可以成功。
例如:
添加bin-address之前,从局域网内的其他主机如172.18.10.160可以通过命令
mysql –h 172.18.10.83 –u root –p 访问到172.18.10.83主机上的mysql,
添加bind-address=127.0.0.1之后,重启服务
再用相同命令,就会提示登录失败了。