安全运维之mysql基线检查

版本加固

选择稳定版本并及时更新、打补丁。

稳定版本:发行6-12个月以内的偶数版本。

检查方法:

使用sql语句:select version();

检查结果:

安全运维之mysql基线检查_第1张图片

存在问题:当前数据库版本较老需要更新

解决方案:前往http://www.mysql.com进行更新。

** 弱密码**

数据库不存在弱口令,提高数据库安全性

检查方法:

sql语句:select user,authentication_string from user;

检查结果:

安全运维之mysql基线检查_第2张图片

安全运维之mysql基线检查_第3张图片

存在问题:当前root账户使用弱密码

解决方法:首先以root用户登录

mysql>use mysql

mysql>update user set password=password(“复杂的新密码”) where user=‘test’;

mysql> flush privileges;

** 不存在匿名账户**

检查方法:

sql语句:select user,authentication_string from user;

检查结果:

安全运维之mysql基线检查_第4张图片

存在问题:存在账户为空的匿名账户。

解决方法∶

删除匿名帐户∶

mysql>use mysql;

mysql>delete from user where user=";

mysql>flush privileges;

** 合理设置权限**

检查方法:

Sql语句:show grants for xxxx(用户名)@xxxx(主机域)

检查结果:

安全运维之mysql基线检查_第5张图片

存在问题:应用用户授予的权限过大,可能出现权限滥用

解决方法:一般应用用户建议授予最小权限

grant权限1权限2…权限n on数据库名称.表名称to 用户名@用户地址

** 合理设置文件权限**

检查方法:

Linux语句:

ls -al .mysql_history .bash_history

ls -al /etc/my.cnf

find / -name .MYD |xargs ls -al

find / -name .MYI |xargs ls -al

find / -name .frm |xargs ls -al

检查结果:

1661772285_630ca1fdb231adcbb9a7f.png!small

1661772291_630ca2031abd70ea4428c.png!small

存在问题:.mysql_history .bash_history 应为600权限

/etc/my.cnf 应为644权限

不合理设置数据库文件权限,可能导致非授权访问或篡改

解决方法:

chmod 600 .mysql_history .bash_history

chmod 600 *.MYD *.MYI *.frm

chmod o-rw /etc/my.cnf

** 日志审核**

检查方法:

查看my.cnf或my.ini文件,查看是否包含如下设置

[mysqld]

log = filename

检查结果:

安全运维之mysql基线检查_第6张图片

存在问题:

没有设置日志审核,可能导致安全事件发生时无法查看日志记录

解决方法:

在mysql的安装目录下,打开my.cnf或my.ini,在【mysqld】

后面加上如下的参数,取消注释并配置日志文件,保存后重启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 default name will be used.
#log-update=

运行账号

检查方法:

检查进程属主和运行参数是否包含–user=mysql

linux语句:

ps -ef|grep mysqld

grep -i user /etc/my.cnf

检查结果:

1661772325_630ca2258dbe663cf3aed.png!small

存在问题:

Mysqld服务不以普通用户运行,数据库高权限被利用

解决方法:

编辑/etc/my cnf,设置如下∶

[mysql.server]

user=mysql

重新启动mysqld服务

可信ip地址控制

检查方法:

Sql语句:select user,host from mysql.user;

检查结果:

安全运维之mysql基线检查_第7张图片

存在问题:

Root,test2,test3,test4,test5,匿名用户主机域都为:%,这导致任意ip都可连接数据库,增加了数据库的攻击面,降低了数据库的安全性。

解决方法:

mysql>GRANT ALL PRIVILEGES ON**TO’可信任用户’@'可信任ip地址’IDENTIFIED BY’可信用户密码’WITH
GRANT OPTION;

连接数限制

检查方法:

查看MySQL配置文件∶my.cnf 或者是 my.ini

在【mysqld】段查看最大连接数配置∶

max_connections =1000 查看最大连接数

Sql语句:mysql> show variables like ‘max_connections’;

检查结果:

安全运维之mysql基线检查_第8张图片

安全运维之mysql基线检查_第9张图片

存在问题:根据业务需求设置数据库最大连接数

解决方法:

编辑MySQL配置文件∶my.cnf 或者是 my.ini

在【mysqld】配置段添加∶

max_connections = 业务需求设置数据库最大连接数

保存,重启MySQL服务。

禁止远程连接数据库

检查方法:

Sql语句:show variables like “%skip_networking%”;

show variables like “%bind_address%”;

检查结果:

安全运维之mysql基线检查_第10张图片

存在问题:

允许远程连接数据库

解决方法:

为了禁止该功能,启动skip_networking,不监听sql的任何TCP/IP的连接,切断远程访问的权利,保证安全性。

vim /etc/my.cnf

[mysqld]

bind_address=127.0.0.1

skip_networking=1

假如需要远程管理数据库,可通过安装PhpMyadmin来实现。

假如确实需要远程连接数据库,至少修改默认的监听端口,同时添加防火墙规则,只允许可信任的网络的mysql监听端口的数据通过。

改变默认mysql管理员帐号

检查方法:

Sql语句:select user from user;

检查结果:

安全运维之mysql基线检查_第11张图片

存在问题:

系统mysql的管理员名称是root,而一般情况下,数据库管理员都没进行修改,这一定程度上对系统用户穷举的恶意行为提供了便利.

解决方法:

改成不易被猜到的用户名:

mysql> update user set user=“newroot” where user=“root”;

mysql> flush privileges;

删除默认测试库

检查方法:

sql语句:show databases;

检查结果:

安全运维之mysql基线检查_第12张图片

存在问题:

存在空用户和TEST库,这会对数据库的安全构成威胁,有必要全部删除.

解决方法:

#mysql> show databases;

#mysql> drop database TEST;

命令历史记录保护

检查方法:

Linux语句:

Ls .mysql_history .bash_history

Cat .mysql_history

Cat .bash_history

检查结果:

1661772420_630ca284849733d4c4942.png!small

安全运维之mysql基线检查_第13张图片

安全运维之mysql基线检查_第14张图片

存在问题:

数据库相关的shell操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码.

解决方法:

需要删除这两个文件获奖者将文件置空

同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p参数加入提示输入密码后,隐式输入密码

rm .bash_history .mysql_history //删除历史记录

ln -s /dev/null .bash_history //将shell记录文件置空

ln -s /dev/null .mysql_history //将mysql记录文件置空

禁止MySQL对本地文件存取

检查方法:

linux命令:cat /etc/my.cnf

检查结果:

安全运维之mysql基线检查_第15张图片

存在问题:

本地文件存取打开。

解决方法:

–local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令,假如需要获取本地文件,需要打开,但是建议关闭。

可以在my.cnf中添加local-infile=0,或者加参数local-infile=0

重新启动mysql。

Scuba扫描

安全运维之mysql基线检查_第16张图片

存在三个高危漏洞,六个中危漏洞。

安全运维之mysql基线检查_第17张图片

第一个高危漏洞:主机域有通配符。

主机域有通配符意味着任意ip都可连接该账号,这将导致该数据库安全性下降。

安全运维之mysql基线检查_第18张图片

第二个高危漏洞:have_symlink选项设置为 YES。

安全运维之mysql基线检查_第19张图片

第三个高危漏洞:存在匿名账户。

安全运维之mysql基线检查_第20张图片

六个中危漏洞,

ssl_type选项未设置为远程用户必需。

安全运维之mysql基线检查_第21张图片

现有“测试”数据库。

安全运维之mysql基线检查_第22张图片

default_password_lifetime选项已禁用或设置为 91 或更高。

安全运维之mysql基线检查_第23张图片

local_infile选项未禁用。

安全运维之mysql基线检查_第24张图片

sql_mode选项未设置为“STRICT_ALL_TABLES”。

安全运维之mysql基线检查_第25张图片

用户没有密码过期策略。

安全运维之mysql基线检查_第26张图片

程用户必需。

[外链图片转存中…(img-POVqk1ix-1676620810659)]

现有“测试”数据库。

[外链图片转存中…(img-iNGbvUDe-1676620810659)]

default_password_lifetime选项已禁用或设置为 91 或更高。

[外链图片转存中…(img-pSuNpBme-1676620810660)]

local_infile选项未禁用。

[外链图片转存中…(img-TFn3YVxO-1676620810660)]

sql_mode选项未设置为“STRICT_ALL_TABLES”。

[外链图片转存中…(img-fRTnJTBe-1676620810660)]

用户没有密码过期策略。

[外链图片转存中…(img-IAvZNzTz-1676620810661)]

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

你可能感兴趣的:(mysql,数据库,安全)