start
1. 引言
CentOS 6.9 作为一款经典的企业级 Linux 发行版,虽然已停止官方维护,但在许多生产环境中仍然承担着关键业务。由于停止维护意味着不再有官方安全补丁更新,对 CentOS 6.9 服务器进行系统性的安全加固就显得尤为重要。
本文将分享一套完整的 CentOS 6.9 服务器安全加固脚本集合,涵盖账户安全、SSH 加固、防火墙配置、系统内核参数优化、文件权限加固、日志审计等多个维度,并附上实践操作指南,帮助运维人员快速、规范地完成服务器安全基线配置。
2. 加固前的准备工作
2.1 备份策略
在执行任何安全加固操作之前,务必做好备份工作:
# 备份关键配置文件
mkdir -p /backup/security_hardening_$(date +%Y%m%d)
cp -a /etc/passwd /etc/shadow /etc/group /etc/gshadow /backup/security_hardening_$(date +%Y%m%d)/
cp -a /etc/ssh/sshd_config /backup/security_hardening_$(date +%Y%m%d)/
cp -a /etc/sysctl.conf /backup/security_hardening_$(date +%Y%m%d)/
cp -a /etc/security/limits.conf /backup/security_hardening_$(date +%Y%m%d)/
cp -a /etc/pam.d/system-auth /backup/security_hardening_$(date +%Y%m%d)/
2.2 加固前检查清单
| 检查项 | 命令 | 说明 |
|---|---|---|
| 系统版本 | cat /etc/redhat-release | 确认系统版本 |
| 内核版本 | uname -r | 记录当前内核 |
| 开放端口 | netstat -tulnp | 记录当前监听端口 |
| 运行服务 | chkconfig --list | grep 3:on | 记录开机自启服务 |
| 当前用户 | cat /etc/passwd | grep /bin/bash | 记录可登录用户 |
3. 账户与密码安全加固
3.1 密码策略加固
创建 01_password_policy.sh 脚本:
#!/bin/bash
# 密码策略加固脚本
# 适用系统:CentOS 6.9
# 1. 设置密码过期时间
sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs
sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs
sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 14/' /etc/login.defs
# 2. 设置密码复杂度(需要 pam_cracklib 模块)
cat >> /etc/pam.d/system-auth << 'EOF'
password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
EOF
# 3. 设置账户锁定策略(连续5次失败锁定5分钟)
cat >> /etc/pam.d/system-auth << 'EOF'
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=300
account required pam_tally2.so
EOF
# 4. 禁止空密码登录
sed -i 's/^PASS_EMPTY_PASSWORDS.*/PASS_EMPTY_PASSWORDS no/' /etc/login.defs
echo "[OK] 密码策略加固完成"
3.2 账户安全加固
创建 02_account_security.sh 脚本:
#!/bin/bash
# 账户安全加固脚本
# 1. 锁定不必要的系统账户
for user in lp sync shutdown halt news uucp operator games gopher; do
if id "$user" &>/dev/null; then
usermod -L -s /sbin/nologin "$user"
echo "[OK] 已锁定账户: $user"
fi
done
# 2. 检查 UID 为 0 的账户(应只有 root)
echo "=== UID 0 账户检查 ==="
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 3. 检查空密码账户
echo "=== 空密码账户检查 ==="
awk -F: '($2 == "") {print $1}' /etc/shadow
# 4. 设置 root 用户 umask
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bashrc
# 5. 设置登录超时(300秒)
echo "export TMOUT=300" >> /etc/profile
echo "readonly TMOUT" >> /etc/profile
echo "[OK] 账户安全加固完成"
4. SSH 服务安全加固
创建 03_ssh_hardening.sh 脚本:
#!/bin/bash
# SSH 安全加固脚本
SSHD_CONFIG="/etc/ssh/sshd_config"
# 1. 备份原配置
cp -a $SSHD_CONFIG ${SSHD_CONFIG}.bak_$(date +%Y%m%d)
# 2. 禁止 root 直接登录
sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' $SSHD_CONFIG
sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' $SSHD_CONFIG
# 3. 禁止空密码登录
sed -i 's/^#PermitEmptyPasswords.*/PermitEmptyPasswords no/' $SSHD_CONFIG
sed -i 's/^PermitEmptyPasswords.*/PermitEmptyPasswords no/' $SSHD_CONFIG
# 4. 限制 SSH 登录用户(按需修改)
# echo "AllowUsers admin deploy" >> $SSHD_CONFIG
# 5. 修改默认端口(建议改为高位端口,如 2222)
# sed -i 's/^#Port 22.*/Port 2222/' $SSHD_CONFIG
# sed -i 's/^Port 22.*/Port 2222/' $SSHD_CONFIG
# 6. 设置 SSH 协议版本为 2
sed -i 's/^#Protocol.*/Protocol 2/' $SSHD_CONFIG
sed -i 's/^Protocol.*/Protocol 2/' $SSHD_CONFIG
# 7. 设置空闲超时(300秒)
sed -i 's/^#ClientAliveInterval.*/ClientAliveInterval 300/' $SSHD_CONFIG
sed -i 's/^#ClientAliveCountMax.*/ClientAliveCountMax 0/' $SSHD_CONFIG
# 8. 禁止转发
sed -i 's/^#AllowTcpForwarding.*/AllowTcpForwarding no/' $SSHD_CONFIG
sed -i 's/^#X11Forwarding.*/X11Forwarding no/' $SSHD_CONFIG
# 9. 使用密钥登录并禁用密码登录(需先配置好密钥)
# sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' $SSHD_CONFIG
# sed -i 's/^PasswordAuthentication.*/PasswordAuthentication no/' $SSHD_CONFIG
# 10. 重启 SSH 服务
service sshd restart
echo "[OK] SSH 安全加固完成"
5. 防火墙与网络访问控制
5.1 iptables 防火墙规则
创建 04_iptables_hardening.sh 脚本:
#!/bin/bash
# iptables 防火墙加固脚本
# 1. 清空现有规则
iptables -F
iptables -X
iptables -Z
# 2. 设置默认策略(拒绝所有)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 3. 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 4. 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 允许 SSH(按实际端口修改)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 6. 允许 Web 服务(按需开启)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 7. 允许 Ping(可选,建议关闭)
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 8. 防止 SYN Flood 攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/s -j ACCEPT
# 9. 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# 10. 保存规则
service iptables save
echo "[OK] iptables 防火墙加固完成"
5.2 防止 IP 欺骗
创建 05_network_hardening.sh 脚本:
#!/bin/bash
# 网络层安全加固脚本
# 1. 禁止 IP 欺骗
cat >> /etc/sysctl.conf << 'EOF'
# 禁止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁止 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
EOF
# 2. 应用内核参数
sysctl -p
echo "[OK] 网络层安全加固完成"
6. 系统内核参数安全加固
创建 06_kernel_hardening.sh 脚本:
#!/bin/bash
# 内核参数安全加固脚本
cat >> /etc/sysctl.conf << 'EOF'
# 禁止 IP 转发(除非作为路由器)
net.ipv4.ip_forward = 0
# 禁止发送 ICMP 重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 禁止接受 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 开启 TCP SYN Cookies 防止 SYN Flood
net.ipv4.tcp_syncookies = 1
# 减少 TIME_WAIT 连接复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
# 设置 TCP 连接超时
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
# 限制系统最大文件数
fs.file-max = 65535
# 限制进程最大文件数
fs.nr_open = 65535
# 禁止核心转储
fs.suid_dumpable = 0
# 限制内核日志访问权限
kernel.dmesg_restrict = 1
# 禁止内核模块加载(谨慎使用)
# kernel.modules_disabled = 1
# 设置共享内存最大值
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
EOF
# 应用内核参数
sysctl -p
echo "[OK] 内核参数安全加固完成"
7. 文件系统与权限加固
创建 07_file_permission_hardening.sh 脚本:
#!/bin/bash
# 文件系统权限加固脚本
# 1. 设置关键文件权限
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
chmod 600 /etc/ssh/sshd_config
chmod 600 /etc/sysctl.conf
# 2. 查找并处理 SUID/SGID 文件
echo "=== SUID/SGID 文件检查 ==="
find / -perm -4000 -o -perm -2000 2>/dev/null | grep -v -E '^/(proc|sys|dev)'
# 3. 移除不必要的 SUID 权限(按需执行)
# chmod u-s /usr/bin/chsh
# chmod u-s /usr/bin/chfn
# chmod u-s /usr/bin/mount
# chmod u-s /usr/bin/umount
# 4. 设置 /tmp 目录权限
chmod 1777 /tmp
chmod 1777 /var/tmp
# 5. 禁止普通用户查看其他用户进程
mount -o remount,hidepid=2 /proc 2>/dev/null || echo "[WARN] 当前内核不支持 hidepid 选项"
# 6. 设置 umask 默认值
echo "umask 027" >> /etc/profile.d/umask.sh
chmod 644 /etc/profile.d/umask.sh
echo "[OK] 文件系统权限加固完成"
8. 日志审计与监控
创建 08_log_audit_hardening.sh 脚本:
#!/bin/bash
# 日志审计加固脚本
# 1. 启用审计服务
chkconfig auditd on
service auditd restart
# 2. 配置审计规则
cat >> /etc/audit/audit.rules << 'EOF'
# 监控用户和组管理
-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
-w /etc/sudoers -p wa -k identity
# 监控系统管理操作
-w /etc/sysctl.conf -p wa -k system
-w /etc/ssh/sshd_config -p wa -k sshd
# 监控登录事件
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins
-w /var/log/tallylog -p wa -k logins
# 监控关键目录
-w /etc/cron.d/ -p wa -k cron
-w /etc/cron.daily/ -p wa -k cron
-w /etc/cron.hourly/ -p wa -k cron
-w /etc/cron.weekly/ -p wa -k cron
-w /etc/cron.monthly/ -p wa -k cron
-w /etc/crontab -p wa -k cron
EOF
# 3. 重启审计服务
service auditd restart
# 4. 配置日志轮转
cat >> /etc/logrotate.d/syslog << 'EOF'
/var/log/secure
/var/log/messages
/var/log/maillog
{
weekly
rotate 12
compress
delaycompress
missingok
notifempty
create 0600 root root
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
EOF
# 5. 设置日志文件权限
chmod 600 /var/log/secure
chmod 600 /var/log/btmp
chmod 600 /var/log/lastlog
echo "[OK] 日志审计加固完成"
9. 服务与进程安全加固
创建 09_service_hardening.sh 脚本:
#!/bin/bash
# 服务安全加固脚本
# 1. 关闭不必要的系统服务
for service in chargen-dgram chargen-stream cups dhcpd dovecot finger gopher nfs nfslock rlogin rsh rsync sendmail smb snmpd talk tftp vsftpd ypbind; do
chkconfig --level 2345 $service off 2>/dev/null
service $service stop 2>/dev/null
echo "[OK] 已关闭服务: $service"
done
# 2. 查看当前运行的服务
echo "=== 当前运行的服务 ==="
chkconfig --list | grep 3:on
# 3. 设置进程资源限制
cat >> /etc/security/limits.conf << 'EOF'
# 限制普通用户进程数
* soft nproc 1024
* hard nproc 2048
# 限制普通用户文件数
* soft nofile 4096
* hard nofile 8192
# 限制核心转储
* hard core 0
EOF
# 4. 禁止普通用户使用 crontab(可选)
# echo "root" > /etc/cron.allow
# chmod 600 /etc/cron.allow
echo "[OK] 服务安全加固完成"
end
5281



被折叠的 条评论
为什么被折叠?



