centos 7等保整改学习

整改操作注意事项

  • 操作前务必备份:任何配置文件修改前使用 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 "========================================"


相关推荐
艾莉丝努力练剑12 小时前
【Linux网络】Linux 网络编程:传输层UDP
linux·运维·服务器·网络·计算机网络·udp
牢七12 小时前
契约锁分析
linux·运维·服务器
承渊政道13 小时前
Linux系统学习【进程概念从入门到深入理解】
linux·服务器·笔记·学习·ubuntu·系统架构·bash
无忧.芙桃13 小时前
进程间通信的基本概念(上)
linux·运维·服务器
运维瓦工13 小时前
DevOps 生态介绍(四):Sonarqube&jacoco 与jenkins集成使用
运维·jenkins·devops
草莓熊Lotso15 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
广州灵眸科技有限公司21 小时前
瑞芯微(EASY EAI)RV1126B 核心板供电电路
linux·运维·服务器·单片机·嵌入式硬件·电脑
keyipatience21 小时前
18.Linux进程退出和进程等待机制详解
linux·运维·服务器
仙柒41521 小时前
控制平面组件和节点组件
运维·容器·kubernetes