在当今的网络环境中,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 服务器已经具备了企业级的基础安全防护能力。最后,不要忘记进行验证:
- 尝试用一个普通用户连续输错5次密码,确认账户被锁定。
- 从一个非白名单 IP 尝试 SSH 连接,确认连接被拒绝。
- 尝试设置一个不符合复杂度要求的密码,确认系统拒绝。