Linux系统安全基线配置指南与关键步骤详解

作者:技术拾光时间:2026-05-10 11:38:20浏览:503

Linux系统安全基线是围绕账户、认证、服务和日志的动态校准过程。配置错误可能比不配置更危险。需排查UID为0的非root账户并妥善处理。pam_cracklib.so配置中参数含义易误解,如minlen和带负号的credit参数,且配置位置必须正确。关闭SSH的root登录前,需确保普通用户具备密钥登录等条件。设置命令历史时,HISTSIZE与HISTTI

Linux系统的安全基线,并非一个可以“一键执行”的加固脚本。它更像是一套围绕账户、认证、服务和日志等核心维度,持续进行校准与优化的动态过程。这里有一个关键认知:配置错误有时比完全不配置更危险,尤其是在pam_cracklib.so的参数和sshd_config的逻辑顺序上,稍有不慎就可能导致无法登录系统。

Linux系统安全基线配置指南与关键步骤详解

如何检查系统中是否存在UID为0的非root用户

这是最基础但也最容易被忽略的风险点。在Linux系统中,UID(用户ID)是权限的“身份证”。只要UID为0,无论账户名称是admin还是test,都拥有与root完全相同的最高权限。排查方法很简单,一条命令即可:

awk -F: '($3 == 0) { print $1 }' /etc/passwd

如果输出结果中除了root还出现了其他用户名,则需要立即处理。通常的应对思路如下:

  • 首先确认该账号是否为业务所必需。大多数情况下并非必需。如果不是,最直接的做法是删除账户:userdel -r 。
  • 如果确实需要保留该账号(例如某些老旧应用有硬性依赖),至少应修改其UID:usermod -u 1001 。修改后,需手动检查/etc/passwd文件,确保对应行的UID字段已更新,同时注意不要打乱其他字段的顺序。
  • 最后,务必进行验证。执行id 确认UID已变更,再尝试su - ,确保无法通过该账户获得root shell。

为什么pam_cracklib.so配置错误会导致密码设置失败

这个模块的配置堪称“陷阱之王”,许多文档照搬的参数可能产生相反效果。例如,minlen=8并不等于“密码至少8位”——在默认规则下,它实际要求的是minlen-1,即7位。而dcredit=-1才真正表示“至少包含1个数字”。

最常见的错误是漏掉负号,写成dcredit=1。这会使含义完全相反,变成“最多允许1个数字”,反而削弱了密码策略。

对于生产环境,一个兼顾安全与兼容性(适用于RHEL/CentOS 7+及Debian/Ubuntu)的最小可行配置可参考以下内容:

password requisite pam_cracklib.so \
  retry=3 minlen=13 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 difok=3

这里有三个要点需要特别注意:

  • 将minlen设为13,才能确保实际生效的密码长度不低于12位(因为默认会减1)。
  • 所有credit参数(dcredit, ucredit, lcredit, ocredit)必须带负号,正数的含义完全相反。
  • 这行配置必须放在/etc/pam.d/system-auth文件中password [success=1 default=ignore]那一段之前,否则会被直接跳过,等于未配置。

设置PermitRootLogin no后普通用户无法连接怎么办

许多用户在修改/etc/ssh/sshd_config,将PermitRootLogin设为no并重启sshd服务后,发现自己也被拒绝登录。这通常不是配置本身失败,而是前置条件未满足。

在关闭root的SSH登录之前,必须确保以下几点:

  • 至少存在一个可用的普通用户账户。
  • 该用户的~/.ssh/authorized_keys文件中已放置你的公钥(优先使用密钥登录比密码更安全)。
  • 检查/etc/shadow,确认该用户的密码哈希是有效的(不是以*或!开头),否则即使PasswordAuthentication yes,也无法用密码登录。
  • 确认sshd_config中没有AllowUsers或AllowGroups等配置意外屏蔽了你准备使用的普通用户(例如只写了AllowUsers root)。
  • 重启服务前,务必先用sshd -t命令测试配置文件语法,避免因配置错误导致服务无法启动。

如果不幸被锁在系统外,且没有控制台权限,则只能依赖云服务商提供的VNC功能,或通过物理服务器的本地控制台(Console)强行登录,临时注释掉PermitRootLogin那行,重启sshd服务后再进行调整。

历史命令时间戳与最大条数需同时设置才有效

仅设置HISTSIZE=100000是无效的——因为默认HISTTIMEFORMAT为空,所有命令在history中会挤在一起,显示同一时间。反之,仅设置HISTTIMEFORMAT也不行——如果HISTSIZE太小(默认1000条),早期带有精确时间的记录很快会被新命令覆盖。

正确的做法是在/etc/profile文件末尾统一添加以下三行:

HISTSIZE=100000
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTSIZE HISTTIMEFORMAT

添加后,执行source /etc/profile使配置在当前shell生效,然后随意运行一条命令,再用history | tail -3查看,确认时间戳已正确显示。需要注意的是,此设置对已登录的会话不会立即生效,需要新开一个终端窗口才能看到效果。