1.1.1 Linux
1.1.1.1 身份鉴别
a)应对登录的用户进行身份标识和鉴别
应对登录的用户进行身份标识和鉴别身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;
Ø 解决方法
通过cat /etc/passwd命令进行查看
若第一字段相同,即存在同名账户。
若第二字段为空,即存在空口令用户。
若第三字段相同,即用户身份UID不具有唯一性。
修改方式:输入命令# passwd 用户名 修改密码。
以下命令视情况加固,一般不会出现:
输入命令# usermod -l 新用户名 旧用户名 修改用户名。
输入命令# usermod -u 新uid 用户名 修改uid。
Ø 实操指引
# usermod -l geek test (把test用户改名为geek)
# passwd geek (修改用户geek的密码)
更改用户test1 的密码 。
新的 密码:(输入密码)
重新输入新的 密码:(再次输入)
passwd:所有的身份验证令牌已经成功更新。
# usermod -u 1234 geek (把geek用户的uid改成1234)
密码复杂度修改
Ø 解决思路:
cat /etc/login.defs命令查看所设置的密码长度及更换周期,测评时,管理员密码长度为8位,具有一定的复杂度并能定期更换。
Ø 实操指引
输入命令# vim /etc/login.defs 编辑文件,输入i进入编辑模式,找到对应字段并修改。
PASS_MAX_DAYS:90(密码最长有效期 90 天)
PASS_MIN_DAYS:2 (密码修改间隔最小的天数 2 天)
PASS_MIN_LENS:8 (密码最小长度 8 位)
PASS_WARN_AGE:7 (密码是失效前 7 天开始通知)
输入命令# vi /etc/pam.d/system-auth 编辑文件,输入i进入编辑模式,在password规则的第一行添加一条规则password requisite pam_cracklib.soretry=3 minlen=8 difok=2 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
retry=3如果用户连续3次输入的密码强度不够就退出,默认值是1。
minlen=10密码长度必需大于6(10-类型数量,这里是4种不同的类型)。默认值是9。
difok=3新密码必需有3个字符与旧密码不同,默认值是5。
dcredit=-1新密码中至少有1个数字。
ucredit=-1新密码中至少有1个大写字符。
lcredit=-1新密码中至少有1个小写字符。
ocredit=-1新密码中至少有1个个符号。
b)应具有登录失败处理功能
应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;
Ø 解决方法:
查看登录失败处理,pam_tally.so模块控制用户密码认证的限制,核查是否配置并启用了登录失败处理功能和限制非法登录功能,且非法登录达到一定次数后采取特定动作,如账户锁定。
Ø 实操指引
输入命令# vim /etc/pam.d/system-auth 编辑文件,输入i进入编辑模式,添加一条规则account required pam_tally2.so deny=5 lock_time=300 unlock_time=300 magic_root even_deny_root。
c)远程管理
当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;
Ø 解决方法:
询问并验证是否关闭了Telnet、FTP等服务,是否使用SSH加密协议进行远程登录和管理,使用netstat命令查看21(FTP)、22(SSH)、23(Telnet)等端口的运行情况,核查是否采用加密等安全方式对系统进行远程管理,防止鉴别信息在网络传输过程中被窃听。
Ø 实操指引
输入命令chkconfig vsftpd off 关闭ftp服务。
1.1.1.2 访问控制
a)应对登录的用户分配账户和权限
Ø 解决方法:
以有权限的身份登录进入linux,查看重要文件和目录权限设置是否合理。
/etc/passwd文件的权限小于等于644
/etc/shadow文件的权限小于等于400
/etc/group文件的权限小于等于644
/etc/services文件权限小于等于644
/etc/security文件权限权限小于等于600
以上文件权限全部符合才可判定符合。
Ø 实操指引
若有目录权限过高,输入命令# chmod 权限路径修改权限。
b) 应重命名或删除默认账户
重命名或删除默认账户, 修改默认账户的默认口令;
Ø 解决方法:
以有权限的身份登录linux,查看是否存在adm、lp、sync、shutdown、halt、mail、uucp、operator、games、gopher、ftp等默认的、无用的用户,如果存在,不一定要删除,为了系统服务运行正常,禁用这些默认账户登录系统即可。
Ø 实操指引
输入命令# usermod -L 用户名 禁止用户登录。
# usermod -L geek (禁止用户geek登录)
c) 应及时删除或停用多余的、 过期的账户, 避免共享账户的存在;
Ø 解决方法:
以有权限的身份登录linux,查看/etc/shadow文件。询问有几位系统运维工程师,系统运维账户数量应与运维工程师数量保持一致。询问相应账户是否为过期、多余的账户,第二字段为口令字段,若显示为 "!!"或"*"则表示非用户处于锁定状态。
Ø 实操指引
输入命令# userdel -r 用户名 删除用户。
# userdel -r geek (删除用户geek)
d)应授予管理用户所需的最小权限,实现管理用户的权限分离;
Ø 解决方法:
查看是否把root权限提权给其他普通用户,按最小授权原则分配、不赋予一般用户管理员权限。建立了权限分离的用户、如管理员、审计员、操作员等,
Ø 实操指引
输入命令# vim /etc/sudoers 修改权限。
geek ALL=(ALL) NOPASSWD: /bin/cat
test ALL=(ALL) NOPASSWD: ALL
普通用户geek可以在任何主机上, 通过sudo执行/bin/cat命令, 并且不需要输入密码。
普通用户test可以在任何主机上, 通过sudo执行任何命令,并且不需要输入密码。
1.1.1.3 安全审计
a) 应启用安全审计功能
Ø 解决方法:
以root身份登录系统,查看进程服务,若运行了安全审计服务,再查看安全审计的守护进程是否正常,若未开启安全审计功能,则确认是否部署了第三方安全审计工具。核查安全审计范围是否覆盖到每个用户,是否对重要的用户行为和重要安全事件进行审计。
Ø 实操指引
输入命令# auditctl -w /etc/passwd -p rwxa -k passwd 添加重要安全文件审计规则
-w <路径>监控文件路径,
-p <权限>监控权限 r(读) w(写) x(执行) a(属性改变)
-k <关键词>筛选字符串,用于查询监控日志
输入命令# auditctl -a entry, always -S all -F uid=1001 添加重要用户行为审计规则
-a <列表名称,动作> 向列表末尾添加规则
-S <系统调用名|系统调用号|all> 系统调用的名称或编号
-F <字段名>建立一个规则字段:名称、操作、值
Active:active(running)正在运行
b) 审计记录应包括事件的日期和时间、 用户、 事件类型、 事件是否成功及其他与审计相关的信息。
Ø 解决方法:
查看/var/log/secure(系统登录日志)、/var/log/messages(服务信息日志)、/var/log/audit/audit.log等日志相关文件,日志内容包括日期、时间、用户、IP地址、事件是否成功等信息。
Ø 实操指引
# tail -20 /var/log/audit/audit.log
c) 应对审计记录进行保护, 定期备份, 避免受到未预期的删除、 修改或覆盖等;
Ø 解决方法:
查看是否使用Linux自带日志服务发送至日志服务器,若没有显示就是没有使用Linux自带的日志服务。询问系统管理员是否使用其他手段备份日志,如日志审计系统,需要查看日志审计系统界面,是否接收了此操作系统IP日志。
Ø 实操指引
输入命令# vim /etc/syslog.conf ,在底部添加 *.* @日志服务器地址:514。
重启日志服务:# systemctl restart rsyslog.service
1.1.1.4 入侵防范
a) 应遵循最小安装的原则, 仅安装需要的组件和应用程序;
Ø 解决方法:
查看系统中已安装的系统包,询问客户是否有当前不需要的组件和应用程序。
Ø 实操指引
# yum -y remove telnet 删除telnet包
b)应关闭不需要的系统服务、 默认共享和高危端口;
Ø 解决方法:
查看并确认是否开放的端口都为业务需要端口,是否已关闭非必需的端口。
Ø 实操指引
# kill -9 1797
c)应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制;
Ø 解决方法:
为服务器的远程管理设定指定地址。
Ø 实操指引
输入命令# vim /etc/ssh/sshd_config 添加。
AllowUsers aliyun test@192.168.1.1
允许aliyun和在192.168.1.1的test用户通过SSH远程登录操作系统。
1.1.2 MYSQL
1.1.1.5 身份鉴别
a)应对登录的用户进行身份标识和鉴别
应对登录的用户进行身份标识和鉴别身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;
Ø 解决方法:
1. 询问管理员数据库登录口令,并判断是否为弱口令,数据库登录命令:
mysql –u 用户 –p口令;
核查数据库系统是否开启默认复杂度要求:
show variables like '%validate_password%';
选项含义:
validate_password_check_user_name :用户名检测,默认关闭
validate_password_dictionary_file :字典文件,就是要在字典规则里才能满足密码的条件
validate_password_length :密码的长度至少为X位
validate_password_mixed_case_count:密码中至少有X个大写小字母validate_password_number_count:密码中至少X个数字 validate_password_special_char_count :密码中至少X个特殊字符
[mysqld]default_password_lifetime=90 #密码90天过期
Ø 实操指引
【MySQL5.7以上】update user set authentication_string=password('更改的密码') where User='更改密码的用户';
【MySQL5.7以下】update user set password=PASSWORD("更改的密码") where User=' 更改密码的用户';
Flush privileges;
set global validate_password_length = 9; 改变密码的最少长度。
b)应具有登录失败处理功能
应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;
Ø 解决方法
1. 核查是否开启数据库登陆失败处理功能
show variables like '%connection_control%';
2. 核查数据库登录连接超时设置:show variables like '%timeout';
3. 核查是否开启数据库登陆失败处理功能:
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'connection%';
Ø 实操
在命令行中输入:
install plugin CONNECTION_CONTROL soname 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
可以使用set global connection_control_failed_connections_threshold = 4 修改参数例:
1.1.1.6 访问控制
a)应对登录的用户分配账户和权限
Ø 解决方法
1. 应核查是否为用户分配了账户和权限及相关设置情况;
2. 应核查是否已禁用或限制匿名、默认账户的访问权限;
Ø 实操
查询所有账户命令:select user,host from mysql.user;
查看用户权限命令:show grants for '用户名'@'主机';
或者:SELECT * FROM databasename.tablename WHERE user='账户名'\G
解决方法:
增加权限:grant all privileges on databasename.tablename TO '用户'@'主机';
删除权限:
REVOKE ALL PRIVILEGES ON database_name.* FROM '用户'@'主机';
b) 应重命名或删除默认账户
Ø 解决方法
1. 应核查是否已经重命名默认账户或默认账户已被删除;
2. 应核查是否已修改默认账户的默认口令;
Ø 实操
解决方法:
查看所有用户:select user,host from mysql.user;
重命名命令:RENAME USER '用户名'@'主机' TO '更改完的用户名'@'主机';
删除命令:DROP USER '用户名'@'主机';
1.1.1.7 安全审计
a) 应启用安全审计功能
Ø 解决方法
1. 应核查是否开启了安全审计功能;
2. 应核查安全审计范围是否覆盖到每个用户;
3. 应核查是否对重要的用户行为和重要安全事件进行审计。
Ø 实操
查询是否开启日志审计功能,命令:show global variables like '%general_log%';或者查看my.cnf配置文件。
开启日志审计功能:set global general_log = on ;






















