第一篇 老师版
IP Intcrnct Protocol 网络协议
编号:1
要求内容 以普通帐户安全运行mysqld,禁止mysql以管理员帐号权限运行。
操作指南: 1、参考配置操作
Unix 下以通过在/etc/my.cnf中设置:
[mysql.server]
user=mysql
2、补充操作说明
检查方法: 1、判定条件
各种操作系统下以管理员权限运行。
Unix 下禁止以 root 账号运行 mysqld;
2、检测操作
检查进程属主和运行参数是否包含–user=mysql类似语句:
#ps -ef | grep mysqld
#grep -i user /etc/my.cnf
编号:2
要求内容 应按照用户分配账号,避免不同用户间共享账号
操作指南
//创建用户
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub ject)values("localhost","pppadmin",password("passwd"),",",");
这样就创建了一个名为:phplamp密码为:1234的用户。
然后登录一下。find
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
编号:2
要求内容 应按照用户分配账号,避免不同用户间共享账号
参考配置操作
操作指南 //创建用户
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub
ject)values("localhost","pppadmin",password("passwd"),",",");
这样就创建了一个名为:phplamp密码为:1234的用户。
然后登录一下。
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
mysql>登录成功
补充操作说明
检测方法 1.判定条件
不用名称的用户可以连接数据库
2.检测操作
使用不同用户连接数据库
编号:3
要求内容 应删除或锁定与数据库运行、维护等工作无关的账号
操作指南1.参考配置操作
DROP USER 语句用于删除一个或多个MySQL账户。要使用 DROP USER,必须拥有mysql 数据库的全局 CREATE USER 权限或 DELETE 权限。账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用 DROP USER,您可以取消一个账户和其权限,操作如下:
DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录。
2.补充操作说明
要点:
DROP USER 不能自动关闭任何打开的用户对话。而且,如果用户有
打开的对话,此时取消用户,则命令不会生效,直到用户对话被关
闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登
录时将会失败。
检测方法 检测操作:
mysql 查看所有用户的语句
输入指令select user(;
依次检查所列出的账户是否为必要账户,删除无用户或过期账户。
注:无关的账号主要指测试帐户、共享帐号、长期不用账号(半年以上不用)等
编号:1
要求内容 检查帐户默认密码和弱密码
操作指南1. 参考配置操作
修改帐户弱密码
如要修改密码,执行如下命令:
mysql> update user set password=password(test!p3') where user=root';
mysql> flush privileges;
补充操作说明
检测方法1.判定条件
密码长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类。
四分之一三原则
2.检测操作
检查本地密码:(注意,管理帐号 root 默认是空密码)
mysql> use mysql;
mysql> select Host,User,Pass word,Select_priv,Grant_priv from user;
编号:1
要求内容 在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限。
操作指南 1、参考配置操作 合理设置用户权限,撤销危险授权。
2、补充操作说明
检测方法 1 判定条件
确保数据库没有不必要的或危险的授权
2 检测操作
查看数据库授权情况:增删改查
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]...
编号:1
要求内容 数据库应配置日志功能,
操作指南 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、 补充操作说明 用mysql命令打开后
show variables like ‘log_%’;查看所有的log命令
2、show variables like ‘log_bin’;查看具体的log命令
检测方法 1 判定条件
启用审核记录对数据库的操作,便于日后检查。
2 检测操作
打开/etc/my.cnf文件,查看是否包含如下设置(没有的自己加):
[mysqld]
log = filename
编号:1
要求内容 系统安装了最新的安全补丁 (注:在保证业务及网络安全的前提下,经过兼容性测试后)
操作指南 1、參考配置操作
下载并安装最新mysql安全补丁,
2、补充操作说明
安全答报和补丁下载网址是htp://www.mysql.com
检测方法 1 判定条件
确保数据库为企业版,并且安装了最新安全补丁。如果是不安全的
社区版,建议替换为企业版(收费)
2 检测操作
使用如下命令查看当前补丁版本:
mysql> SELECT VERSION();
编号:1
要求内容 禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。(仅限于应用和数据库在同一台主机的情况)
操作指南 1、参考配置操作
如果数据库不需远程访问,可以禁止远程tcp/ip连接,通过在mysqld 服务器中参数中添加 --skip-networking 启动参数来使mysql 不监听任何TCP/IP连接,增加安全性。
强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:
bind-address=127.0.0.1
2、补充操作说明
检测方法 1 判定条件 远程无法连接
2 检测操作
#cat /etc/my.cnf
#ps -ef | grep -i mysql
或从客户机远程 telnet mysqlserver 3306
编号: 1
要求内容 通过数据库所在操作系统或防火墙限制,只有信任的IP地址才能通过监
听器访问数据库。
操作指南 1、参考配置操作
执行命令:mysql> GRANT ALL PRIVILEGES ON db.*
一> 一> TO 用户名@’IP子网/掩码’;
只有通过指定 IP地址段的用户才可以登录
2、补充操作说明
检测方法 1、判定条件
在非信任的客户端以数据库账户登陆被提示拒绝。
2、检测操作
用户从其它子网登录,将被拒绝
3、补充说明
要求内容 根据机器性能和业务需求,设制最大最小连接数。
操作指南 1、参考配置操作
编辑 MySQL 配置文件:my.cnf 或者是 my.ini
在[mysqld]配置段添加:
max_connections=1000
保存,重启MySQL 服务。
检测方法 1、判定条件
2、检测操作
用命令:SHOW [FULL] PROCESSLIST 显示哪些线程正在运行
mysql admin -uroot -p variables
输入 root 数据库账号的密码后可看到
|max connections | 1000 |
3、补充说明
第二篇 自查版
MySQL数据库安全配置规范操作
以普通帐户安全运行mysqld,禁止mysql以root帐号权限运行,攻击者可能通过mysql获得系统root超级用户权限,完全控制系统。
配置/etc/my.cnf
[mysql.server]
user=mysql
补充操作说明
直接通过本地网络之外的计算机改变生产环境中的数据库是异常危险的。有时,管理员会打开主机对数据库的访问:
GRANT ALL ON . TO ‘root’@’%’;
这其实是完全放开了对root的访问。所以,把重要的操作限制给特定主机非常重要:
GRANT ALL ON . TO ‘root’@‘localhost’;
GRANT ALL ON . TO ‘root’@‘myip.athome’ ;
FLUSH PRIVILEGES;
判定条件
禁止以root账号运行mysqld;
检测操作
检查进程属主和运行参数是否包含–user=mysql类似语句:
#ps –ef | grep mysqld
#grep -i user /etc/my.cnf
用户权限
应按照用户分配账号,避免不同用户间共享账号
创建用户 设定指定ip地址登陆数据库
create user vvera@‘指定ip地址’ identified by ‘vv@122’;
这样就创建了一个名为:vvera 密码为:vv@122 的用户。
然后登录一下。
检测方法
判定条件
不用名称的用户可以连接数据库;使用不同用户连接数据库
应删除或锁定与数据库运行、维护等工作无关的账号
移除匿名账户和废弃的账户
DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用DROP USER,您可以取消一个账户和其权限,操作如下:
DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录。红色标识的无用账户都可以删除。
使用操作命令之后的结果
drop user ‘’@‘mysql’,’’@‘localhost’,‘root’@’::1’,‘root’@‘mysql’;
补充操作说明
要点:
DROP USER不能自动关闭任何打开的用户对话。而且,如果用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。
检侧操作:
mysql 查看所有用户的语句
输入指令
select user();
select user ,host ,password from mysql.user;
依次检查所列出的账户是否为必要账户,删除无用户或过期账户。
检查帐户默认密码和弱密码
修改帐户弱密码
如要修改密码,执行如下命令:
检查本地密码:(注意,管理帐号root默认是空密码)
mysql> update user set password=password(‘vv@122’) where user=‘root’;
mysql> flush privileges;
检测方法
mysql> use mysql;
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限。
合理设置用户权限
补充操作说明
有些应用程序是通过一个特定数据库表的用户名和口令连接到MySQL的,安全人员不应当给予这个用户完全的访问权。
如果攻击者获得了这个拥有完全访问权的用户,他也就拥有了所有的数据库。查看一个用户许可的方法是在MySQL控制台中使用命令SHOW GRANT
SHOW GRANTS FOR ; ‘vvera’@‘localhost’
为定义用户的访问权,使用GRANT命令。在下面的例子中,vvera仅能从tanggula数据库的mserver表中选择:
GRANT SELECT ON tanggula. mserver TO ‘vvera’@‘localhost’;
FLUSH PRIVILEGES;
vvera用户就无法改变数据库中这个表和其它表的任何数据。
如果你要从一个用户移除访问权,就应使用一个与GRANT命令类似的REVOKE命令:
REVOKE SELECT ON tanggula. mserver FROM ‘vvera’@‘localhost’;
FLUSH PRIVILEGES;
授权并创建用户,并指定密码
grant 权限 on 权限范围 to 用户 identified by ‘密码’
回收权限
revoke 权限 on 范围 from 用户
数据库应配置日志功能,
show variables like ‘log_%’;查看所有的log命令
show variables like ‘log_bin’;查看具体的log命令
禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。(仅限于应用和数据库在同一台主机)
参考配置操作
如果数据库不需远程访问,可以禁止远程tcp/ip连接, 通过在mysqld服务器中参数中添加 --skip-networking 启动参数来使mysql不监听任何TCP/IP连接,增加安全性。强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:bind-address=127.0.0.1
删除可以匿名访问的test数据库和防止非授权用户访问本地文件
移除测试(test)数据库
在默认安装的MySQL中,匿名用户可以访问test数据库。我们可以移除任何无用的数据库,以避免在不可预料的情况下访问了数据库。因而,在MySQL控制台中,执行:
DROP DATABASE test;
禁用LOCAL INFILE
另一项改变是禁用”LOAD DATA LOCAL INFILE”命令,这有助于防止非授权用户访问本地文件。在PHP应用程序中发现有新的SQL注入漏洞时,这样做尤其重要。此外,在某些情况下,LOCAL INFILE命令可被用于访问操作系统上的其它文件(如/etc/passwd),应使用下现的命令:
mysql> SELECT load_file("/etc/passwd")
为禁用LOCAL INFILE命令,应当在MySQL配置文件的[mysqld]部分增加下面的参数:
set-variable=local-infile=0
检查操作
Mysql>show databases;