在当今的网络环境中,Linux 服务器作为业务的核心载体,其安全性至关重要。一次成功的入侵往往始于一个弱密码或一个未受保护的 SSH 端口。本文将基于生产环境的最佳实践,手把手教你如何系统性地加固你的 Linux 服务器,打造一道坚固的安全防线。

一、 用户身份鉴别:筑牢第一道防线

强大的用户认证策略是安全的基石。我们需要从密码生命周期、历史记录和复杂度三个维度进行加固。

1. 密码生命周期管理 (/etc/login.defs)

此文件定义了新创建用户的默认密码策略。编辑 /etc/login.defs

# 备份原文件
sudo cp /etc/login.defs /etc/login.defs.bak

# 编辑配置
sudo vim /etc/login.defs

修改以下关键参数:

# 密码最长有效期为90天
PASS_MAX_DAYS   90
# 两次修改密码的最短间隔为2天
PASS_MIN_DAYS   2
# 密码过期前5天开始警告用户
PASS_WARN_AGE   5

2. 防止密码历史重用 (/etc/pam.d/system-auth 或 /etc/pam.d/common-password)

为了避免用户在几个旧密码之间循环,我们强制系统记住最近使用过的密码。

  • RHEL/CentOS/Fedora 系列,编辑 /etc/pam.d/system-auth
  • Debian/Ubuntu 系列,编辑 /etc/pam.d/common-password

找到包含 pam_unix.so 的 password 行,并在其末尾添加 remember=5

# RHEL/CentOS 示例
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5

这将确保新密码不能与最近5次使用过的密码相同。

3. 强制密码复杂度 (pam_pwquality 模块)

现代 Linux 发行版(如 CentOS 7+、Ubuntu 18.04+)已使用 pam_pwquality 模块替代了旧的 pam_cracklib。它提供了更灵活的密码强度检查。

在 PAM 配置文件(同上)中,添加或修改 pam_pwquality.so 规则:

# Debian/Ubuntu: /etc/pam.d/common-password
# RHEL/CentOS: /etc/pam.d/system-auth
password requisite pam_pwquality.so retry=3 minlen=8 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root

参数详解

  • retry=3: 用户有3次机会输入符合要求的新密码。
  • minlen=8: 密码最小长度为8个字符。
  • difok=3: 新密码至少有3个字符与旧密码不同。
  • ucredit=-1: 必须包含至少1个大写字母。
  • lcredit=-1: 必须包含至少1个小写字母。
  • dcredit=-1: 必须包含至少1个数字。
  • ocredit=-1: 必须包含至少1个特殊字符(如 !@#$%)。
  • enforce_for_root: 此策略对 root 用户同样生效。
二、 登录失败锁定策略:抵御暴力破解

即使有了强密码,攻击者仍可能通过自动化工具进行暴力破解。我们必须限制登录尝试次数。

重要提示:较新的系统(如 RHEL 8+、Ubuntu 20.04+)推荐使用 pam_faillock 模块,因为它比旧的 pam_tally2 更可靠且功能更强大。

1. 配置 PAM 认证栈

  • 编辑 /etc/pam.d/common-auth (Debian/Ubuntu) 或 /etc/pam.d/system-auth (RHEL/CentOS),在顶部添加以下两行:
auth [default=die] pam_faillock.so authfail
auth sufficient pam_faillock.so authsucc

这两行的作用是:如果认证失败,记录并最终拒绝;如果认证成功,则清除失败计数。

  • 编辑 /etc/pam.d/common-account (Debian/Ubuntu) 或 /etc/pam.d/system-auth (RHEL/CentOS),在末尾添加:
account required pam_faillock.so

这行用于在账户验证阶段检查是否已被锁定。

2. 配置锁定策略 (/etc/security/faillock.conf)

创建或编辑此文件以集中管理策略:

sudo vim /etc/security/faillock.conf

填入以下内容:

# 连续失败5次后锁定账户
deny = 5
# 锁定时间为600秒(10分钟)
unlock_time = 600
# 即使是 root 用户也受此策略限制
even_deny_root
# root 用户的解锁时间(可单独设置)
root_unlock_time = 600

3. 管理锁定状态

  • 查看用户失败记录sudo faillock --user <username>
  • 手动解锁用户sudo faillock --user <username> --reset

三、 远程管理与网络访问控制:最小化攻击面

SSH 是远程管理的命脉,也是最常见的攻击入口。必须对其进行严格管控。

1. 限制 SSH 登录尝试次数 (/etc/ssh/sshd_config)

虽然 PAM 已经提供了账户锁定功能,但在 SSH 层面再加一层限制是纵深防御的好习惯。

sudo vim /etc/ssh/sshd_config

设置最大认证尝试次数:

# 每个连接最多允许3次认证尝试
MaxAuthTries 3

修改后,重启 SSH 服务:sudo systemctl restart sshd

2. 限制特定 IP 访问 SSH (使用 iptables)

如果你的服务只需要被特定网段(如公司内网 192.168.200.0/24)访问,可以使用 iptables 进行网络层过滤。

假设你的 SSH 端口已修改为 33222

# 1. 允许指定网段访问
sudo iptables -A INPUT -s 192.168.200.0/24 -p tcp --dport 33222 -j ACCEPT

# 2. 拒绝所有其他来源的访问
sudo iptables -A INPUT -p tcp --dport 33222 -j DROP

管理 iptables 规则

  • 查看带行号的规则sudo iptables -L INPUT -n --line-numbers | grep :33222
  • 删除指定行的规则 (例如第4行): sudo iptables -D INPUT 4

最佳实践建议:对于长期稳定的规则,务必保存,以免服务器重启后丢失。在 CentOS/RHEL 上使用 service iptables save,在 Ubuntu 上可以安装 iptables-persistent 包。

总结与验证

完成以上所有步骤后,你的 Linux 服务器已经具备了企业级的基础安全防护能力。最后,不要忘记进行验证:

  1. 尝试用一个普通用户连续输错5次密码,确认账户被锁定。
  2. 从一个非白名单 IP 尝试 SSH 连接,确认连接被拒绝。
  3. 尝试设置一个不符合复杂度要求的密码,确认系统拒绝。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐