0x01 前言
等级保护测评是根据我国网络安全体系制订的一系列保护流程,对于已有和将上线的业务服务的基础设施(系统、数据库、中间件等)进行的一系列检查、安全需要合规
本次先行分享学习等保中的技术自查阶段知识,关于如:理论知识、机房环境、备案、拓扑等可以根据自身和现实情况进行学习、文章由上中下三篇组成,建议收藏,以备不时之需、使用PC查看效果最佳、全文较长,请静心观看。
一般来说:业务系统的组成是由系统和数据库及中间件组成,被攻击的情况下,攻击者也是向此作为目的进行攻击
系统方面: Windows、Linux(Centos、Ubuntu、红帽及一些国产系统)
数据库方面: Mysql、Oracle、redis、mongodb、SQL server等
中间件方面: Tomcat、nginx等
逻辑方面: 双因子认证、应用审计与防范、数据完整性与保密性
本次分享学习的是等保自查中的数据库阶段,关于系统自查阶段可翻阅以下链接
* 资料仅作为分享、思路来源于互联网和现实学习复现、仅作为参考、实际根据现实情况操作
0x02 测评过程
一. Mysql数据库测评
以Mysql&Linux为例、实际根据自身环境操作
1. 身份的鉴别
a). 对登录的用户进行身份鉴别,并确保密码复杂度并定期更换密码
以Linux为例,使用mysql -u root -p登录,是否需要密码登录
Mysql安装后默认口口令
输入以下命令查找数据库中存在的账号
select user, host FROM mysql.user;
通过输入以下命令查看是否有账户存在空口令
mysql 5.7以下输入
select * from mysql.user where length(password)= 0 or password is null
mysql 5.7以上输入
select user,authentication_string from mysql.user
Mysql输入以下口令查看密码复杂度配置
show variables like 'validate%';
注: mysql默认没有安装复杂度插件,版本问题安装以下方法
Windows-mysql8.0以下版本在配置文件my.ini或my.cnf中输入
plugin-load-add=validate_password.dll
Linux-mysql8.0以下版本在配置文件my.ini或my.cnf中输入
plugin-load-add=validate_password.so
8.0以上版本在mysql内直接输入命令进行安装
INSTALL COMPONENT 'file://component_validate_password';
validate_password.check_user_name 密码不能包含用户名
validate_password.dictionary_file 指定密码配置文件
validate_password.length 密码最小长度
validate_password.mixed_case_count 密码至少包含一个大小写字母
validate_password.number_count 密码至少包含一个数字
validate_password.policy 密码默认复杂度
validate_password.special_char_count 密码至少包含一个特殊字符
在安装完插件后默认以上截图配置,可根据具体需求进行配置
set global validate_password.length=8;
b). 限制非法登录、登录超时、防止暴力破解等
Mysql默认未安装connection_control插件
输入 show variables like '%connection_control%'; 返回结果为空即未安装
在Mysql 5.7-8.0之间基本都是在My.ini或My.cnf配置文件导入
connection_control.dll和connection_control.so
导入方法plugin-load-add=插件名
但是在8.0以上版本,就需要使用mysql命令方式直接安装
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
show variables like 'connection_control%';
以上输出结果为插件默认值,可根据实际情况改动
connection_control_failed_connections_threshold 登录失败次数
connection_control_max_connection_delay 响应延迟最大时间
connection_control_min_connection_delay 登录失败后延迟最小时间
set global connection_control_max_connection_delay=24*60*60*1000; 对响应最大延迟做改动
输入以下命令查看超时返回值
show variables like "%timeout%";
其中wait_timeout字段默认为8小时
意为连接空闲时间不操作8小时后端口,默认不符合
具体根据自身要求更改
c). 应当防止在远程控制时、传输信息被监听
登录用户均为locohost为本地,则略过
如存在远程管理则执行以下命令查看是否开启SSL
show variables like "%have_openssl%"或
show variables like "%have_ssl%"
2. 访问权限的控制
a). 对登录的账户分配对应的权限
执行以下命令结合自身环境确定是否为对应权限
select user,host from mysql.user;
输入以下命令查看是否只有root用户存在分配权限的权限,其他用户没有
show grants for '用户名'@' localhost';
b). 默认多余、可疑用户删除操作,及空口令进行设密
执行以下命令查看是否存在以上情况
select user,host FROM mysql.user;
c). 删除或禁用多余、共享、过期、锁定账户
执行以下命令查看用户状态
select user,account_locked from mysql.user;
d). 授予用户最小权限,实现权限分离
输入以下命令查看
select * from mysql.user;
注:命令行输出不规整,但是策略原因调整,使用工具连不上,直接使用其他方式输出
除root用户以外,其他用户不允许有user表的增删改权限
输入以下命令查看此角色是否除了本身权限外具有其他角色
select * from mysql.user where user='用户名';
e). 设定的访问策略、主体和客体之间的访问规则
select * from mysql.user 检查用户权限
select * from mysql.db 检查数据库权限
select * from mysql.columns_priv 检查列权限
登录其他用户/普通用户 查看有无越权行为
3. 安全审计
a). 启用安全审计功能、记录每个用户行为和事件作为审计
执行以下语句,查看日志开启及存放的结果 默认不开启 不符合
show global variables like '%general%';
b). 审计记录(包含日期、用户、时间、事件类型等信息)
输入以下命令查询
select * from general_log; 以下不符合
将以上general_log开启后等待时间,过段时间在进行查询
c). 应用审计定期备份、防止被删除、覆盖
应当只有root用户可操作日志
定期对日志进行备份,可采用第三方工具或脚本进行备份
其他用户对日志没有增删改的权限
4. 入侵防范
a). 对于远程管理进行限制指定用户访问进行配置
select user,host from mysql.user;
user表中的host值不应为%,应为空或localhost
特殊情况除外
b). 及时发现漏洞并确认,及时打补丁修复
show variables where variable_name like "version"
查看当前数据库版本
mysql --version
或者此命令也可以
二. Redis数据库测评
1. 身份的鉴别
a). 对登录的用户进行身份鉴别,并确保密码复杂度并定期更换密码
Redis默认是无需密码登录的,直接输入
redis-cli 即可进入
需要在redis.conf文件内找到 requirepass字段
配置文件一般在redis目录下,或使用find查找
一般是被注释掉的,删除井号后在requirepass后面加入密码即可
在redis中没有账号的概念,所以需要定期更改密码
登录使用auth 密码的形式登录
b). 限制非法登录、登录超时、防止暴力破解等
超时操作退出
也是在redis.conf文件中 有timeout参数
0为永不退出、可根据实际情况进行设置
c). 应当防止在远程控制时、传输信息被监听
在redis中默认明文传输、具体采用加密传输以自身环境和条件选择
默认不符合
2. 访问权限的控制
a). 对登录的账户分配对应的权限
无用户概念,无需分配权限
b). 默认多余、可疑用户删除操作,及空口令进行设密
无用户概念或者多余用户,只有一个密码
c). 删除或禁用多余、共享、过期、锁定账户
无用户概念
d). 授予用户最小权限,实现权限分离
无权限概念
e). 设定的访问策略、主体和客体之间的访问规则
无主体客体之间的关系
3. 安全审计
a). 启用安全审计功能、记录每个用户行为和事件作为审计
在redis.conf配置文件中,有loglever和logfile两个参数
loglever代表日志等级 通常为notice、debug、verbose、warning
logfile为日志输出位置
我这已经配置了,如没有配置根据自身环境需求配置即可
b).审计记录(包含日期、用户、时间、事件类型等信息)
日志会根据时间进行更新输出、一般符合
c). 应用审计定期备份、防止被删除、覆盖
644权限、一般不删除永久保存
4. 入侵防范
a). 对于远程管理进行限制指定用户访问进行配置
在redis.conf的配置文件中、有bind参数,改为127.0.0.1(本地访问)
或指定管理IP即可
b). 及时发现漏洞并确认,及时打补丁修复
redis的漏洞比较多 如未授权 GETshell等
这个和日常管理、版本都有关系 剩下的就是渗透老哥的活了
三. Oracle数据库测评
以Oracle 19c数据库版本为例
1. 身份的鉴别
a). 对登录的用户进行身份鉴别,并确保密码复杂度并定期更换密码
sysdba是最高权限用户,oracle默认无空口令
但sysdba乱输密码可能会登录进去,可修改sqlnet.ora文件
oracle默认无空口令,默认符合
使用 以下语句查询 (因SQLPLUS展示不直观、使用PL/SQL)
Select username,account_status from dba_users;
通过以下语句查看密码复杂度策略、一般默认为空,查询为null则不符合
SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT' AND RESOURCE_NAME='PASSWORD_VERIFY_FUNCTION';
-- 因配置Oracle篇幅长、可自行网上搜索设置
b). 限制非法登录、登录超时、防止暴力破解等
使用以下语句查询登录次数限制
SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT' AND RESOURCE_NAME='FAILED_LOGIN_ATTEMOTS';
通过以下语句进行设置、根据自身需求进行配置
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 8
以下语句表示重试失败后锁定时长、默认为一天
SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT' AND RESOURCE_NAME='PASSWORD_LOCK_TIME';
使用以下语句可修改
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1/24 改为一小时
以下语句查询登录超时限制、默认不限制
SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT' AND RESOURCE_NAME='IDLE_TIME';
c). 应当防止在远程控制时、传输信息被监听
SQLPLUS或PL/SQL默认为加密传输 默认符合
2. 访问权限的控制
a). 对登录的账户分配对应的权限
以下语句查询数据库中存在的用户(最低有两个可用用户)
是否限制匿名、多余、默认用户的访问情况
MGMT_UIEW,SYSTEM,SYS,DBSNMP 用户名为启用、其他为禁用,则符合
Select username,account_status from dba_users;
b). 默认多余、可疑用户删除操作,及空口令进行设密
基本上开放且常用的默认用户为sys及system
sys默认口令为CHANGE_ON_INSTALL
SYSTEM:MANAGER
DBSNMP的默认口令为:DBSNMP
自行登录测试
c). 删除或禁用多余、共享、过期、锁定账户
以下语句进行查询、默认不符合
Select username,account_status from dba_users;
d). 授予用户最小权限,实现权限分离
以下语句查询到状态为open的用户
Select username,account_status from dba_users;
以下语句查询最高权限授予用户,是否进行权限分离
select * from dba_tab_privs where grantee='SYS' ORDER BY GRANTEE;
通过输入以下语句查看public是否被授权给用户,存在就不符合
select granted_role from dba_role_privs where grantee='PUBLIC';
e). 设定的访问策略、主体和客体之间的访问规则
根据自身环境进行确定、是否有专门用户进行分配权限,是否存在专门访问策略
3. 安全审计
a). 启用安全审计功能、记录每个用户行为和事件作为审计
通过以下语句查询是否开启普通用户审计
show parameter audit_trail
默认DB 开启 none为未开启
以下语句查询所有用户的审计是否开启
select * from dba_stmt_audit_opts;
select * from dba_priv_audit_opts;
下图为符合
show parameter audit_sys_operations
返回结果 audit_sys_operations boolean TRUE
代表已对SYSDBA或SYSOPER特权连接时直接发出的SQL语句进行审计
符合
b).审计记录(包含日期、用户、时间、事件类型等信息)
select * from aud$;
查看审计日志的格式等、默认符合
c). 应用审计定期备份、防止被删除、覆盖
根据实际情况、运维情况
是否对日志、数据等定时备份,备份的策略和格式等
是否只有特权用户可以访问、普通用户无法访问
d). 审计过程需防止未经授权的中断
如其他普通用户无法登录、则忽视
登录其他普通用户、执行修改权限
alter system set audit_trail=none;
4. 入侵防范
a). 最小化安装原则、仅安装需要组件和系统组件
执行以下语句查询所有组件、value为true为已安装
select * from v$option;
根据自身环境判断
b). 关闭不需要的高危进程、端口、共享服务
Oracle不涉及、可忽略
c). 对于远程管理进行限制指定用户访问进行配置
查看Oracle安装的目录下sqlnet.ora文件
tcp.validnode_checking/tcp/invited_nodes的配置是否为:
tcp.validnode_checking=yes
tcp,invited_nodes=() 得知是否设置了远程连接IP
默认未设置
d). 及时发现漏洞并确认,及时打补丁修复
根据自身环境进行确认
是否定期进行漏扫计划
存在漏洞及时打补丁等修复
四. MongoDB数据库测评
以 MongoDB 7.0.5版本为例
1. 身份的鉴别
a). 对登录的用户进行身份鉴别,并确保密码复杂度并定期更换密码
mongodb默认直接连接shell就能操作、无需密码
默认不符合
MongoDB只能手动添加账号密码
db.createUser(
{
user: "adminUser",
pwd: "adminPassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
adminUser 用户名
adminPassword 密码
userAdminAnyDatabase 为用户分配角色
b). 限制非法登录、登录超时、防止暴力破解等
MongoDB不存在登录失败的情况
c). 应当防止在远程控制时、传输信息被监听
操作用户如均为localhost,则为本地管理、则忽略
远程管理的情况根据实际判断
2. 访问权限的控制
a). 对登录的账户分配对应的权限
show users 查看mongodb的用户权限
b). 默认多余、可疑用户删除操作,及空口令进行设密
MongoDB不存在默认用户、所需用户都是自行添加
c). 删除或禁用多余、共享、过期、锁定账户
根据实际情况进行排查删除
d). 授予用户最小权限,实现权限分离
根据实际情况查询所有用户,并根据实际情况添加不同权限的用户
如下图
e). 设定的访问策略、主体和客体之间的访问规则
根据自身环境进行判断
如果mongodb已进行了各角色权限划分,则符合
3. 安全审计
a). 启用安全审计功能、记录每个用户行为和事件作为审计
检测配置文件mogond.cfg文件关于日志是否有误
检查logmongod.log文件输入日志是否有误
且根据自身环境是否有其他工具收集详细日志
b).审计记录(包含日期、用户、时间、事件类型等信息)
还是查看logmongod.log文件是否有问题
c). 应用审计定期备份、防止被删除、覆盖
根据自身情况进行日志备份、定期备份的策略
保证日志保存超过6个月
其他普通用户无权进行增删改
d). 审计过程需防止未经授权的中断
MongoDB建立不同权限的角色、基本默认符合,不会中断
4. 入侵防范
a). 最小化安装原则、仅安装需要组件和系统组件
MongoDB可忽略此检查项
b). 关闭不需要的高危进程、端口、共享服务
MongoDB可忽略此检查项
c). 对于远程管理进行限制指定用户访问进行配置
在配置文件mongod.cfg文件中的network interface
0.0.0.0表示不限制IP连接
如指定某些IP连接,可在默认的bindip127.0.0.1后加入
使用,分隔
d). 及时发现漏洞并确认,及时打补丁修复
根据自身环境进行确认
是否定期进行漏扫计划
存在漏洞及时打补丁等修复
四. SQL Server数据库测评
以SQL Server 2022为例
SQL server是微软开发的数据库产品、也可称为MSsql
1. 身份的鉴别
a). 对登录的用户进行身份鉴别,并确保密码复杂度并定期更换密码
SQL server没有密码复杂度策略,它的密码复杂度是由本地操作系统决定的
与Windows相关联的、且需要开启强制实施密码策略
在安全性依次点击查看强制实施密码策略及强制密码过期
SQL Server和系统绑定添加d额账号且未禁用的状态下,无需密码即可登录
尝试建立弱口令账户、是否可以建立成功
b). 限制非法登录、登录超时、防止暴力破解等
与本地系统策略同步,WIN+R输入secpol.msc即可查看
根据自身要求进行配置
关于远程登录超时,SQL Server默认配置
可以使用SSMS查询到默认为21亿多秒
sp_configure
可在服务器属性查看客户端远程连接数据库超时配置
c). 应当防止在远程控制时、传输信息被监听
默认情况下SQL Server是不加密收发的数据包信息
需要通过SQL Server的configuration Manager配置SQL Server使得它加密和客户端之间收发的数据包信息
2. 访问权限的控制
a). 对登录的账户分配对应的权限
select * from syslogins 列出所有账户
判断是否存在默认账户,默认账户是否删除或禁用
b). 默认多余、可疑用户删除操作,及空口令进行设密
select * from syslogins
主要检查sa账户是否存在禁用或重命名的情况
其他默认账户的权限情况
c). 删除或禁用多余、共享、过期、锁定账户
根据实际情况检查默认、多余、过期、无人使用的账户进行禁用删除
select * from syslogins根据实际情况列出用户名及使用情况进行删除
d). 授予用户最小权限,实现权限分离
sp_helplogins 查看数据库登录用户的权限
select * from sys.sql_logins 查看is_disabled值为1代表锁定
e). 设定的访问策略、主体和客体之间的访问规则
根据实际情况判定相关是否存在策略
查看管理员权限(如数据库启用了身份鉴别,则符合)
3. 安全审计
a). 启用安全审计功能、记录每个用户行为和事件作为审计
通过 sp_configure 命令查看如下配置是否开启日志
如命令未查询到、可选择服务器-属性-安全性查看C2审核
在管理-server日志查看相关日志
b).审计记录(包含日期、用户、时间、事件类型等信息)
在管理-SQL Server日志查看相关详细日志
c). 应用审计定期备份、防止被删除、覆盖
根据自身情况进行日志备份、定期备份的策略
保证日志保存超过6个月
其他普通用户无权进行增删改
d). 审计过程需防止未经授权的中断
SQL Server建立不同权限的角色、基本默认符合,不会中断
4. 入侵防范
a). 最小化安装原则、仅安装需要组件和系统组件
SQL Server可忽略此检查项
b). 关闭不需要的高危进程、端口、共享服务
SQL Server可忽略此检查项
c). 应当防止在远程控制时、传输信息被监听
SQL Server没有远程连接限制的相关配置、多数限制数据库登录服务器配置
d). 及时发现漏洞并确认,及时打补丁修复
根据自身环境进行确认
是否定期进行漏扫计划
存在漏洞及时打补丁等修复
select @@version 查看相关版本
0x03 总结
关于数据库类,有些无法或无需做的一些操作未写、关于 恶意代码的防范、可信验证、数据完整性、数据保密性、数据备份的操作等文字描述未写,未进行套用模板、只写了关于重要的技术流程自查,其他包含逻辑方面、企业提供信息方面、拓扑方面、实地物理问题等由自身情况判断或在等保测评公司专业评定
原文始发于微信公众号(州弟学安全):学习干货|等保测评2.0技术自查阶段(中)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论