整改操作注意事项
- 操作前务必备份:任何配置文件修改前使用 cp 文件 文件.bak.$(date +%Y%m%d) 备份。
- 测试环境先验证:在生产环境执行前,先在测试环境验证。
- 记录变更日志:记录每次修改的内容、时间和操作人员。
- SSH操作注意:修改SSH配置后不要退出当前会话,新开一个窗口测试能否正常登录。
- CentOS停止维护问题:CentOS 7 已于2024年6月30日停止维护,应计划迁移至 CentOS Stream、AlmaLinux 或 - Rocky Linux 等持续维护的发行版。
- 整体防护意识:等保整改的配置措施能有效防御暴力破解、权限提升等常见攻击手段,实际案例表明经过等保整改的CentOS系统安全漏洞数量平均减少76%,入侵事件发生率下降92%。
一、身份鉴别
1、检查空口令账户
查

查看哪些用户不可登录

bash
# 查看shadow文件中密码字段为空的账户
awk -F: '($2=="" || $2=="!!") {print $1}' /etc/shadow
# 进一步确认哪些空口令账户可以登录(shell为/bin/bash)
grep -v "/sbin/nologin" /etc/passwd
# 查看所有用户信息(包括密码加密字段)
cat /etc/shadow
查看shadow文件
账密,密码上次修改时间,两次修改min间隔,最大有效期,过期前几天提醒,过期后禁用天数,过期日期,保留字段

改
设密码和锁定不用用户

2、密码复杂度策略
查


检查pwquality配置文件是否配置

查看是否安装密码质量文件

bash
# 检查PAM密码复杂度配置
cat /etc/pam.d/system-auth | grep pam_pwquality
# 检查pwquality配置文件
cat /etc/security/pwquality.conf | grep -v "^#" | grep -v "^$"
# 检查是否安装了pam_pwquality模块
rpm -qa | grep libpwquality
改
安装密码质量模块

写入密码质量配置文件,这里pwquality中不能配置retry参数

同理在/etc/pam.d/system-auth中修改,配置的一定要在第一行

bash
# 安装密码质量检查模块
yum install -y libpwquality
# 编辑 /etc/security/pwquality.conf
cat >> /etc/security/pwquality.conf << 'EOF'
minlen = 8
lcredit = -1
ucredit = -1
dcredit = -1
ocredit = -1
difok = 5
enforce_for_root
EOF
# 编辑 /etc/pam.d/system-auth,在password段第一行添加
# 注意:添加位置应在password段的%PAM-1.0之下
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=5 enforce_for_root
或者sed命令替换,先备份后替换

bash
# 先备份
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak.$(date +%Y%m%d)
# 在password段插入配置(找到password开头且含pam_pwquality的行进行替换)
sed -i 's/^password.*pam_pwquality.so.*/password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=5 enforce_for_root/' /etc/pam.d/system-auth
3、密码有效期策略
查
查看login.defs登陆定义中过期策略,使用chage查看单用户有效期

bash
# 查看全局密码有效期配置
cat /etc/login.defs | grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE"
# 查看单个用户的密码有效期
chage -l root
chage -l 用户名
# 查看所有用户口令过期时间
lslogins -a

查看所有登陆用户的过期策略

改
备份并用sed替换/etc/login.defs

bash
# 备份
cp /etc/login.defs /etc/login.defs.bak.$(date +%Y%m%d)
# 修改全局配置
sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 0/' /etc/login.defs
sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 8/' /etc/login.defs
sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 7/' /etc/login.defs
# 对已有账户(含root)强制应用90天密码有效期
chage -M 90 root
chage -M 90 用户名
chage -W 7 root
修改完全局配置后对现有用户进行配置生效

4、登录失败处理策略
查
查看是否有失败锁定策略,同时检查系统认证和sshd服务

bash
# 检查system-auth中的失败处理配置
cat /etc/pam.d/system-auth | grep -E "pam_tally2|pam_faillock"
# 检查sshd的失败处理配置
cat /etc/pam.d/sshd | grep -E "pam_tally2|pam_faillock"

注意:CentOS 7 推荐使用 pam_tally2(兼容性更好),CentOS 8+ 推荐使用 pam_faillock。
改

bash
# 备份
cp /etc/pam.d/sshd /etc/pam.d/sshd.bak.$(date +%Y%m%d)
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak2.$(date +%Y%m%d)
# 修改 /etc/pam.d/sshd(在#%PAM-1.0下一行添加)
sed -i '1a auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/sshd
# 修改 /etc/pam.d/system-auth(在#%PAM-1.0下一行添加)
sed -i '1a auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/system-auth
# 重启sshd服务
systemctl restart sshd
查看当前锁定与解锁

5、SSH远程管理安全
查
查看ssh服务,进程,端口,连接
bash
# 检查SSH服务运行状态
systemctl status sshd
ps -e | grep sshd
# 检查SSH端口
netstat -an | grep :22
ss -tlnp | grep sshd
# 检查SSH配置文件
cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"
# 检查是否运行了Telnet(明文协议,应关闭)
systemctl status telnet.socket
chkconfig --list | grep telnet

查看ssh配置并确保telnet关闭


改
配置ssh配置文件/etc/ssh/sshd_config,写入配置重启服务,关闭telnet如有
bash
# 备份
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
# 修改SSH配置
cat >> /etc/ssh/sshd_config << 'EOF'
# ===== 等保三级SSH安全加固 =====
# 禁止root远程登录(使用普通用户su切换)
PermitRootLogin no
# 禁止空密码登录
PermitEmptyPasswords no
# 最大认证尝试次数
MaxAuthTries 3
# 使用SSH协议v2
Protocol 2
# 设置SSH空闲超时退出时间(300秒=5分钟)
ClientAliveInterval 300
ClientAliveCountMax 0
# 禁止TCP端口转发
AllowTcpForwarding no
# 禁止X11转发
X11Forwarding no
# 日志详细级别
LogLevel INFO
# 禁用DNS反向解析(加速连接)
UseDNS no
EOF
# 重启SSH服务
systemctl restart sshd
# 关闭Telnet服务(如已安装)
systemctl stop telnet.socket
systemctl disable telnet.socket

6、会话超时锁定
查
查看超时配置

bash
# 查看超时配置
cat /etc/profile | grep TMOUT
cat /etc/bashrc | grep TMOUT
echo $TMOUT
改
配置并使生效

bash
# 备份
cp /etc/profile /etc/profile.bak.$(date +%Y%m%d)
# 设置超时600秒(10分钟)无操作自动退出
cat >> /etc/profile << 'EOF'
# 等保三级:会话超时10分钟自动退出
TMOUT=600
readonly TMOUT
export TMOUT
EOF
# 使配置生效
source /etc/profile
7、双因素认证(高风险项)

二、访问控制
1、检查与锁定多余默认账户
查
检查常见的默认用户,同时查看可登录的用户
bash
# 查看所有用户
cat /etc/passwd
cat /etc/shadow
# 检查常见的默认用户
for user in adm lp sync shutdown halt mail uucp operator games gopher ftp news; do
id $user 2>/dev/null && echo "$user 存在"
done
# 查看可登录的用户(shell不是/sbin/nologin或/bin/false)
cat /etc/passwd | grep -v "/sbin/nologin" | grep -v "/bin/false"

bash
# 锁定不需要的默认账户
for user in adm lp sync shutdown halt mail uucp operator games gopher ftp news; do
if id "$user" &>/dev/null; then
usermod -L "$user"
usermod -s /sbin/nologin "$user"
echo "已锁定账户: $user"
fi
done
改
遍历默认用户,进行锁定

2、敏感文件权限检查
查
bash
# 检查关键系统文件的权限
ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/ssh/sshd_config
# 检查是否有SUID/SGID的可疑文件
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null
# 检查全局可写文件
find / -type f -perm -o+w 2>/dev/null
# 检查用户默认umask
umask
grep umask /etc/profile /etc/bashrc
检查敏感文件权限,同时检查有无SUID/SGID文件(结合grep过滤可能标识恶意的关键字)


查看文件创建的默认屏蔽码,及全局可写文件是否有可疑

改
bash
# 修正关键文件权限
chmod 644 /etc/passwd
chmod 000 /etc/shadow # 或 chmod 400
chmod 644 /etc/group
chmod 000 /etc/gshadow
chmod 600 /etc/ssh/sshd_config
# 设置umask为027(默认新建文件权限750)
sed -i 's/umask.*/umask 027/' /etc/profile
sed -i 's/umask.*/umask 027/' /etc/bashrc
Chmod并设置正确umask

3、三权分立账户配置
bash
# 1. 创建三个角色账户(先禁止交互式登录)
useradd -s /sbin/nologin sysadmin # 系统管理员
useradd -s /sbin/nologin secadmin # 安全管理员
useradd -s /sbin/nologin auditadmin # 审计管理员
# 2. 设置强密码
passwd sysadmin
passwd secadmin
passwd auditadmin
# 3. 配置sudo权限(必须使用visudo编辑)
visudo
添加三个用户

配置强口令

进入visudo配置

添加如下内容
bash
# === 系统管理员权限 ===
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl restart
Cmnd_Alias STORAGE = /sbin/fdisk, /bin/mount, /bin/umount
sysadmin ALL=(root) SOFTWARE, SERVICES, STORAGE
# === 安全管理员权限 ===
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias NETWORKING = /sbin/iptables, /sbin/ifconfig, /sbin/route
secadmin ALL=(root) DELEGATING, NETWORKING
# === 审计管理员权限(仅查看) ===
auditadmin ALL=(ALL) /usr/bin/cat /var/log/*, /usr/sbin/ausearch, /usr/bin/less /var/log/*

4、禁止root SSH远程登录
查
查看ssh配置文件,是否允许root远程登陆

bash
# 修改SSH配置
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
改
如允许则sed替换并重启ssh服务

后续运维时使用普通用户SSH登录后 su - 切换到root。
三、安全审计
1、审计服务启用
查
bash
# 检查auditd服务状态
systemctl status auditd
systemctl is-enabled auditd
# 检查rsyslog服务状态
systemctl status rsyslog
systemctl is-enabled rsyslog
# 检查审计规则
auditctl -l
cat /etc/audit/rules.d/audit.rules
查看审计服务是否开启,auditd,rsyslog


查看审计规则,审计控制台显示没有规则
查看文件规则如下

改
bash
# 启动并设置开机自启
systemctl start auditd rsyslog
systemctl enable auditd rsyslog
# 配置审计规则
cat > /etc/audit/rules.d/audit.rules << 'EOF'
# 删除原有规则
-D
# 设置缓冲区大小
-b 8192
# 监控关键身份认证文件
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
# 监控sudoers文件
-w /etc/sudoers -p wa -k sudoers_changes
# 监控PAM配置
-w /etc/pam.d -p wa -k pam_changes
# 监控SSH配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 记录所有命令执行(execve系统调用)
-a always,exit -F arch=b64 -S execve -k command_exec
# 记录sudo和su操作
-a always,exit -F arch=b64 -S execve -F euid=0 -k priv_escalation
# 设置规则不可更改(需重启生效)
-e 2
EOF
# 重新加载规则
augenrules --load
# 重启auditd
systemctl restart auditd
配置审计服务开机自启,确保工作

编辑审计规则
删除原规则,指定缓冲区大小,忙的系统缓冲区大小要大,监控各类配置文件,记录命令执行,规定规则不可更改


重新加载规则
augenrules --load
重启后查看规则,成功更新规则

查询审计日志
bash
# 按标签搜索
ausearch -k identity
# 按文件搜索
ausearch -f /etc/passwd
# 查看当天所有审计事件
ausearch -ts today


当天所有审计事件格式如下

2、日志留存与保护
查
等保要求:日志至少保留6个月
查看日志轮转配置
bash
# 查看日志轮转配置
cat /etc/logrotate.conf
cat /etc/logrotate.d/syslog
# 查看审计日志文件权限
ls -l /var/log/audit/
ls -l /var/log/messages /var/log/secure


查看日志文件的权限

改
bash
# 1. 设置日志文件权限
chmod 640 /var/log/messages
chmod 640 /var/log/secure
chmod 640 /var/log/audit/audit.log
# 2. 配置日志轮转(保留180天)
cp /etc/logrotate.conf /etc/logrotate.conf.bak.$(date +%Y%m%d)
cat > /etc/logrotate.d/security_logs << 'EOF'
/var/log/messages
/var/log/secure
/var/log/audit/audit.log
{
daily
rotate 180
missingok
notifempty
compress
delaycompress
dateext
create 0640 root root
sharedscripts
postrotate
/bin/kill -HUP $(cat /var/run/syslogd.pid 2>/dev/null) 2>/dev/null || true
endscript
}
EOF
配置审计文件的权限

日志留存180天


推荐方案:搭建远程日志服务器(如使用rsyslog转发或Graylog/ELK),实现日志的集中存储和异地备份。
四、入侵防范
1、最小化安装与多余服务关闭
查
bash
# 查看已安装的软件包
rpm -qa | wc -l
rpm -qa | sort
# 查看所有正在运行的服务
systemctl list-units --type=service --state=running
# 查看所有开机自启的服务
systemctl list-unit-files --type=service | grep enabled
# 查看所有监听端口
netstat -tlnp
ss -tlnp
查看已安装软件数量及分别是什么

查看运行的服务

查看开机自启服务

查看所有监听的端口

改
bash
# 关闭不需要的服务(根据实际业务需求选择)
for svc in telnet.socket vsftpd nfs-server rpcbind snmpd postfix; do
systemctl stop $svc 2>/dev/null
systemctl disable $svc 2>/dev/null
done
# 查看已安装软件,卸载不必要的组件(谨慎操作,注意依赖关系)
# yum remove -y 包名
关闭不需要的服务,按需求修改

移除不必要组件

2、防火墙配置
查
查看防火墙状态及规则
bash
# CentOS 7使用firewalld
firewall-cmd --state
firewall-cmd --list-all
# 或使用iptables
iptables -L -n

改
启用防火墙
bash
# 启动firewalld
systemctl start firewalld
systemctl enable firewalld
# 仅开放必要端口(示例:仅开放SSH)
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --reload
# 限制SSH可访问的源IP(仅允许特定管理终端IP)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'
firewall-cmd --reload

添加规则,仅保留ssh开放,关闭dhcpv6客户端,最后重载规则

添加SSH放行规则,仅指定的源终端IP接受(按需添加放行的IP),同时记得重载规则

3、高危端口关闭
查
过滤是否有可疑端口
bash
# 检查常见高危端口是否开放
netstat -tlnp | grep -E ":(23|21|25|80|135|139|445|3389|5432)"

改
关闭禁用指定服务
bash
# 关闭并禁用不必要的服务
systemctl stop vsftpd telnet.socket 2>/dev/null
systemctl disable vsftpd telnet.socket 2>/dev/null
# 通过防火墙封禁端口
firewall-cmd --permanent --remove-port=23/tcp
firewall-cmd --permanent --remove-port=21/tcp
firewall-cmd --reload

防火墙封禁端口

4、漏洞扫描与补丁管理
查
bash
# 查看系统版本
cat /etc/redhat-release
uname -a
# 查看已安装的安全更新
yum list updates | grep security
# 查看内核版本
rpm -qa | grep kernel
查看系统版本

查看内核版本

查看已经安装的安全更新

改
bash
# 安装yum-cron自动安全更新
yum install -y yum-cron
# 配置自动安全更新
sed -i 's/apply_updates = no/apply_updates = yes/' /etc/yum/yum-cron.conf
# 启动并启用
systemctl start yum-cron
systemctl enable yum-cron
# 或手动更新
yum update -y --security
安装yum-cron自动安全更新,配置启用自动更新,启用
或者手动更新

5、SELinux 强制访问控制
查
查看selinux状态
bash
# 查看SELinux状态
getenforce
sestatus
# 查看配置文件
cat /etc/selinux/config | grep SELINUX

改
bash
# 设置为enforcing模式
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
修改配置文件,只影响下次启动

编辑GRUB配置,确保cmdLine中没有禁用selinux


重启后即为enforcing

启动后执行

五、资源控制
1、远程连接数限制
查
bash
# 检查SSH最大连接数
cat /etc/ssh/sshd_config | grep MaxStartups
cat /etc/ssh/sshd_config | grep MaxSessions
查看ssh最大连接数,默认未设置

改
bash
cat >> /etc/ssh/sshd_config << 'EOF'
# 限制同时未认证连接数
MaxStartups 5
# 限制每个连接的最大会话数
MaxSessions 3
EOF
systemctl restart sshd
写入限制并重启ssh

2、用户资源限制
查
bash
# 检查limits配置
cat /etc/security/limits.conf | grep -v "^#" | grep -v "^$"
ulimit -a
查看资源限制配置文件

改
bash
cat >> /etc/security/limits.conf << 'EOF'
# 等保三级资源限制
hard nproc 1024 # 最大进程数
soft nproc 1024
hard nofile 65535 # 最大打开文件数
soft nofile 65535
hard core 0 # 禁止生成core dump
soft core 0
EOF
写入/etc/security/limits.conf

六、恶意代码防范(高风险项)
bash
# 安装ClamAV
yum install -y epel-release
yum install -y clamav clamav-update
# 更新病毒库
freshclam
# 设置定期扫描(每日凌晨2点)
echo "0 2 * * * root /usr/bin/clamscan -r / --exclude-dir=/proc --exclude-dir=/sys --exclude-dir=/dev -l /var/log/clamav/scan.log" >> /etc/crontab

速查脚本
bash
#!/bin/bash
# 等保三级CentOS快速自查脚本
echo "========================================"
echo " 等保三级 CentOS 安全配置自查"
echo " $(date)"
echo "========================================"
echo -e "\n[1] 空口令账户检查:"
awk -F: '($2=="" || $2=="!!") {print " [风险] "$1" 口令为空"}' /etc/shadow
echo -e "\n[2] 密码复杂度策略:"
grep -q "pam_pwquality" /etc/pam.d/system-auth && echo " [合规] 已配置" || echo " [风险] 未配置"
echo -e "\n[3] 密码有效期:"
grep "^PASS_MAX_DAYS" /etc/login.defs | awk '{print " PASS_MAX_DAYS = "$2" (要求≤90)"}'
echo -e "\n[4] 登录失败锁定:"
grep -q "pam_tally2\|pam_faillock" /etc/pam.d/sshd && echo " [合规] 已配置" || echo " [风险] 未配置"
echo -e "\n[5] SSH安全配置:"
grep "^PermitRootLogin" /etc/ssh/sshd_config | awk '{print " PermitRootLogin = "$2}'
grep "^PermitEmptyPasswords" /etc/ssh/sshd_config | awk '{print " PermitEmptyPasswords = "$2}'
echo -e "\n[6] 会话超时:"
grep "^TMOUT" /etc/profile | awk -F= '{print " TMOUT = "$2" 秒"}'
echo -e "\n[7] 审计服务状态:"
systemctl is-active auditd 2>/dev/null && echo " auditd: [运行中]" || echo " auditd: [未运行]"
systemctl is-active rsyslog 2>/dev/null && echo " rsyslog: [运行中]" || echo " rsyslog: [未运行]"
echo -e "\n[8] 防火墙状态:"
systemctl is-active firewalld 2>/dev/null && echo " firewalld: [运行中]" || echo " firewalld: [未运行]"
echo -e "\n[9] SELinux状态:"
getenforce 2>/dev/null
echo -e "\n[10] 监听端口:"
ss -tlnp | grep LISTEN
echo -e "\n========================================"
echo " 检查完成,请根据结果进行整改"
echo "========================================"

