Linux服务器安全加固最佳实践
前言
据统计,一台未做安全加固的Linux服务器在公网暴露后,平均7分钟内就会遭到扫描,24小时内就可能被成功入侵。安全不是可选项,而是必选项。本文将从多个维度系统性地介绍Linux服务器的安全加固方案。
一、最小化攻击面
1.1 最小化安装
# 查看已安装的软件包
rpm -qa | wc -l
dpkg -l | wc -l
# 删除不必要的服务
systemctl list-unit-files --state=enabled
systemctl disable --now rpcbind
systemctl disable --now postfix # 不需要邮件服务时
1.2 关闭无用端口
# 查看监听端口
ss -tlnp
# 只需保留必要服务
# - SSH (22)
# - Web (80/443)
# - 应用端口
二、账户与认证安全
2.1 强化SSH配置
# /etc/ssh/sshd_config
Port 2222 # 改默认端口
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码登录,仅用密钥
PubkeyAuthentication yes
MaxAuthTries 3 # 最大尝试次数
ClientAliveInterval 300 # 空闲超时
ClientAliveCountMax 0
AllowUsers devops@192.168.* # 白名单用户和来源IP
# 重启SSH
systemctl restart sshd
2.2 密码策略
# /etc/pam.d/system-auth
password requisite pam_pwquality.so try_first_pass retry=3 \
minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
2.3 审计关键文件
# 检查空密码账户
awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow
# 检查UID为0的账户
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 检查sudo权限
grep -v '^#' /etc/sudoers | grep -v '^$'
三、防火墙配置
3.1 iptables 基础规则
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -Z
# 默认策略:DROP所有入站,允许出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(限制来源IP和频率)
iptables -A INPUT -p tcp --dport 2222 -m state --state NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 2222 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# 允许Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 禁止ping(可选)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 保存规则
iptables-save > /etc/sysconfig/iptables
3.2 使用 firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --reload
四、文件系统安全
4.1 关键目录权限
# 修复关键文件权限
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
chmod 600 /etc/ssh/sshd_config
# 检查SUID/SGID文件
find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
# 检查全局可写文件
find / -type f -perm -o+w -ls 2>/dev/null
4.2 使用 ACL 精细控制
# 给特定用户授权
setfacl -m u:deploy:rwx /data/app
setfacl -m g:dev:rx /data/app
# 查看ACL
getfacl /data/app
# 移除ACL
setfacl -b /data/app
4.3 文件完整性监控
# 安装 AIDE
yum install aide -y
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 添加到 crontab
0 3 * * * /usr/sbin/aide --check | mail -s "AIDE Report" admin@example.com
五、审计与日志
5.1 配置 auditd
# /etc/audit/rules.d/audit.rules
# 监控关键文件
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控关键系统调用
-a always,exit -F arch=b64 -S execve -k exec
# 重启审计服务
service auditd restart
5.2 日志发送
# /etc/rsyslog.conf - 发送到远程日志服务器
*.* @192.168.1.10:514
# systemd journal 持久化
mkdir -p /var/log/journal
systemctl restart systemd-journald
六、内核安全加固
# /etc/sysctl.conf
# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
# 忽略ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
# 防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
# 记录火星包
net.ipv4.conf.all.log_martians = 1
# 内核地址空间随机化
kernel.randomize_va_space = 2
七、自动化安全检查脚本
#!/bin/bash
# security_check.sh - 快速安全检查
echo "=== 安全检查报告 $(date) ==="
echo -e "\n[账户安全]"
echo "空密码用户: $(awk -F: '($2==""){print $1}' /etc/shadow | wc -l)"
echo "可登录用户: $(grep -v '/nologin\|/false' /etc/passwd | wc -l)"
echo -e "\n[SSH配置]"
grep -E '^(PermitRootLogin|PasswordAuthentication|Port)' /etc/ssh/sshd_config
echo -e "\n[监听端口]"
ss -tlnp | grep LISTEN
echo -e "\n[防火墙]"
iptables -L -n -v | head -5
echo -e "\n[最近登录失败]"
lastb | head -5 2>/dev/null || echo "无记录"
echo -e "\n[计划任务]"
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u "$user" -l 2>/dev/null | grep -v '^#'
done
总结
安全是一个持续的过程,不是一次性配置就能高枕无忧:
- 定期审计:每月执行安全检查脚本
- 漏洞管理:及时安装安全更新
yum update --security - 最小权限:每个服务和用户只给必需的权限
- 纵深防御:多层防护,假设每一层都可能被突破