目录
- 进入MySQL数据库:
- 账号
- 以普通账户安全运行mysqld,禁止mysql以管理员账号权限运行
- 操作指南
- 检查方法
- 应按照用户分配账号,避免不同用户间共享账号
- 操作指南
- 检测方法
- 应删除或锁定与数据库运行、维护等工作无关的账号
- 操作指南
- 检测方法
- 口令
- 检查帐户默认密码和弱密码
- 操作指南
- 检测方法
- 授权
- 在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限。
- 操作指南
- 检测方法
- 日志
- 数据库应配置日志功能
- 操作指南
- 检测方法
- 补丁
- 系统安装了最新的安全补丁 (注:在保证业务及网络安全的前提下,经过兼容性测试后)
- 操作指南
- 检测方法
- 网络连接
- 禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。(仅限于应用和数据库在同一台主机的情况)
- 操作指南
- 检测方法
- 可信IP地址访问控制
- 通过数据库所在操作系统或防火墙限制,只有信任的IP地址才能通过监听器访问数据库。
- 操作指南
- 检测方法
- 禁止非授权用户访问本地文件
- 连接数设置
- 根据机器性能和业务需求,设制最大最小连接数。
- 操作指南
- 检测方法
进入MySQL数据库:
命令:mysql -u root -p
账号
以普通账户安全运行mysqld,禁止mysql以管理员账号权限运行
操作指南
- 参考配置操作
Unix 下以通过在/etc/my.cnf中设置:
[mysql.server]
user=mysql
vim /etc/my.cnf
- 补充操作说明
计算机入侵数据库是非常危险的,因此必须要用普通用户登录数据库,来进行操作,因此有必要对一些主机操作权限
如下图所示:授权给部分主机权限
检查方法
- 判定条件
各种操作系统下以管理员权限运行。
Unix 下禁止以 root 账号运行 mysqld;
- 检测操作
检查进程属主和运行参数是否包含–user=mysql类似语句:
#ps -ef | grep mysqld
#grep -i user /etc/my.cnf
这两行命令自己下去敲去,看是否包含-user=mysql类似语句。
应按照用户分配账号,避免不同用户间共享账号
操作指南
- 参考配置操作
//创建用户,并指定特定用户,特定IP登录数据库
create user xxx@‘指定ip地址’ identified by ‘asyaxy’;
这样就创建了一个名为xxx的用户,密码为asyaxy,然后登录。
登录:mysql -u xxx -p asyaxy -h 192.168.2.114
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject)values(“localhost”,“pppadmin”,password(“passwd”),",",");
这样就创建了一个名为:phplamp密码为:1234的用户。
//然后登录一下。
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
mysql>登录成功
- 补充操作说明
具体操作跟着上面那些命令敲一下即可
检测方法
- 判定条件
不用名称的用户可以连接数据库 - 检测操作
使用不同用户连接数据库
应删除或锁定与数据库运行、维护等工作无关的账号
操作指南
- 参考配置操作
DROP USER 语句用于删除一个或多个MySQL账户。要使用 DROP USER,必须拥有mysql 数据库的全局 CREATEUSER 权限或 DELETE 权限。
账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用 DROPUSER,您可以取消一个账户和其权限,操作如下: DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录。
先对账户进行筛选,找出无用账户,并删除
查看筛选:select user , host , password from mysql.user;
删除用户:drop user ‘’@‘mysql’, ‘’@‘localhosy’, ‘root’@’::1’,‘root’@‘mysql’;
再次查看是否删除成功
- 补充操作说明
要点:
DROP USER 不能自动关闭任何打开的用户对话。而且,如果用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。
检测方法
- 检测操作:
mysql 查看所有用户的语句
输入指令
select user();
select user ,host ,password from mysql.user;
依次检查所列出的账户是否为必要账户,删除无用户或过期账户。
注:无关的账号主要指测试帐户、共享帐号、长期不用账号(半年以上不用)等
口令
检查帐户默认密码和弱密码
操作指南
- 参考配置操作
修改帐户弱密码
如要修改密码,执行如下命令:
mysql> update user set password=password(test!p3’) where user=root’;
mysql> flush privileges;
- 补充操作说明、
检测方法
- 判定条件
密码长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类。
四分之三原则 - 检测操作
检查本地密码:(注意,管理帐号 root 默认是空密码)
mysql> use mysql;
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
授权
在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限。
操作指南
- 参考配置操作
合理设置用户权限,撤销危险授权 - 补充操作说明
检测方法
- 判定条件
确保数据库没有不必要的或危险的授权 - 检测操作
查看数据库授权情况:
SHOW GRANTS FOR ; ‘xxx’@‘localhost’
授权并创建用户,给定密码:
grant 权限 on 权限范围 to 用户 identified by ‘密码’
移除访问权:
REVOKE SELECT ON 库名. 表名 FROM ‘xxx’@‘localhost’;
FLUSH PRIVILEGES;
mysql> use mysql;
mysql> select * from user;
mysql> select * from db;
mysql> select * from host;
mysql> select *from tables_priv;
mysql>select * from columns_priv;
回收不必要的或危险的授权,可以执行revoke命令:
mysql> help revoke
Name: ‘REVOKE’
Description:
Syntax:
REVOKE
priv_type [(column_list)]
[priv_type[(column_list)]]…
ON [object_type]
{
*
| .
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name} FROM user [,user]...
日志
数据库应配置日志功能
操作指南
mysql 有以下几种日志:
错误日志: -log-err
查询日志: -log (可选)
慢查询日志:-log-slow-queries (可选)
更新日志:-log-update
二进制日志: -log-bin
在mysql 的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启 mysql 服务就行了。
例如:
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file.Otherwise a default name will be used.
#log=
#Enter a name for the error log file.Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a de fault name will be used.
#log-update=
上面只开启了错误日志,要开其他的日志就把前面的“#”去掉
- 补充操作说明
1、show variables like ‘log_%’;查看所有的log命令
2、show variables like ‘log_bin’;查看具体的log命令
检测方法
- 判定条件
启用审核记录对数据库的操作,便于日后检查 - 检测操作
打开/etc/my.cnf文件,查看是否包含如下设置(没有加上就行):
[mysqld]
log = filename
补丁
系统安装了最新的安全补丁 (注:在保证业务及网络安全的前提下,经过兼容性测试后)
操作指南
- 参考配置操作
下载并安装最新mysql安全补丁 - 补充操作说明
安全答报和补丁下载网址是htp://www.mysql.com
检测方法
- 判定条件
确保数据库为企业版,并且安装了最新安全补丁。如果是不安全的社区版,建议替换为企业版(收费) - 检测操作
使用如下命令查看当前补丁版本:
mysql> SELECT VERSION();
网络连接
禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。(仅限于应用和数据库在同一台主机的情况)
操作指南
- 参考配置操作
如果数据库不需远程访问,可以禁止远程tcp/ip连接,通过在mysqld 服务器中参数中添加 --skip-networking 启动参数来使mysql 不监听任何TCP/IP连接,增加安全性。
强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:
bind-address=127.0.0.1 - 补充操作说明
检测方法
- 判定条件
远程无法连接
- 检测操作
#cat /etc/my.cnf
#ps -ef | grep -i mysql
或从客户机远程 telnet mysqlserver 3306
可信IP地址访问控制
通过数据库所在操作系统或防火墙限制,只有信任的IP地址才能通过监听器访问数据库。
操作指南
- 参考配置操作
执行命令:mysql> GRANT ALL PRIVILEGES ON db.*
一> 一> TO 用户名@’IP子网/掩码’;
只有通过指定 IP地址段的用户才可以登录 - 补充操作说明
检测方法
- 判定条件
在非信任的客户端以数据库账户登陆被提示拒绝。 - 检测操作
用户从其它子网登录,将被拒绝
禁止非授权用户访问本地文件
禁用”LOAD DATA LOCAL INFILE”命令
以防止sql注入
- 在某些情况下,LOCAL INFILE命令可被用于访问操作系统上的其它文件(如/etc/passwd),应使用下现的命令:
mysql> SELECT load_file("/etc/passwd") - 为禁用LOCAL INFILE命令,应当在MySQL的/etc/my.cnf的配置文件的[mysqld]部分增加下面的参数:
set-variable=local-infile=0
连接数设置
根据机器性能和业务需求,设制最大最小连接数。
操作指南
- 参考配置操作
编辑 MySQL 配置文件:my.cnf 或者是 my.ini
在[mysqld]配置段添加:
max_connections=1000
保存,重启MySQL 服务。
检测方法
- 检测操作
用命令:SHOW [FULL] PROCESSLIST 显示哪些线程正在运行
mysql admin -uroot -p variables
输入 root 数据库账号的密码后可看到
|max connections | 1000 |