Linux运维6 min read

Linux服务器安全加固最佳实践

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
  • 最小权限:每个服务和用户只给必需的权限
  • 纵深防御:多层防护,假设每一层都可能被突破
分享:

相关文章