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. 尝试设置一个不符合复杂度要求的密码,确认系统拒绝。
相关推荐
cen__y1 小时前
Linux10(计算机网络01)
linux·运维·服务器·c语言·计算机网络·ubuntu
minji...1 小时前
Linux 网络基础之UDP协议(四)传输层协议 UDP,再谈端口号,UDP 特点
linux·服务器·开发语言·网络·c++·tcp/ip·udp
emiya_saber1 小时前
docker cmd
linux·运维·docker
艾莉丝努力练剑1 小时前
【Linux网络】Linux 网络编程:应用层自定义协议与序列化(1)初识
linux·运维·服务器·网络·c++·udp·tcp
сокол1 小时前
【网安-Web渗透测试-内网渗透】内网横向移动——Impacket套件
服务器·windows·网络安全·系统安全
feng_you_ying_li1 小时前
linux之文件系统(2)
linux·运维·服务器
手打猪大屁1 小时前
使用claude code 接入deepseek-v4pro
linux·windows·ai·deepseek·claude code
心止水j2 小时前
拷贝完虚拟机的操作
linux·运维·服务器
我先去打把游戏先2 小时前
【虚拟机专用】Ubuntu 22.04 LTS 服务器版本镜像下载
linux·服务器·ubuntu