Linux 系统安全加固实战:从密码策略到 SSH 访问控制

在当今的网络环境中,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.sopassword 行,并在其末尾添加 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. 尝试设置一个不符合复杂度要求的密码,确认系统拒绝。
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
开发者联盟league3 天前
安装pnpm
ssh
载数而行5203 天前
Linux 11 动态监控指令top
linux