CentOS 服务器在默认安装或初始化配置后,其用户认证与加密通信机制往往处于“能用但不够安全”的状态。很多运维人员只关注防火墙和 SSH 端口,却忽略了系统底层两个决定安全基线的核心模块:NSS(Name Service Switch)与 PAM(Pluggable Authentication Modules)。NSS 决定了系统去哪里验证用户身份、如何解析主机名,而 PAM 则控制着用户登录时的全套规则,包括密码强度、登录失败锁定、会话资源限制等。一旦这两个模块被错误配置或绕过,攻击者可能通过篡改 DNS 解析、植入恶意认证后端或暴力破解获取系统权限。下面直接进入具体的安全加固方案,不绕弯子。
NSS 配置文件的核心安全控制NSS 的主配置文件是 /etc/nsswitch.conf,它定义了系统在解析用户、组、主机名、服务等信息时,查询各类数据源的先后顺序。很多安全事件都源于这个文件被恶意修改,比如将 DNS 解析优先级提到 files 之前,或者引入了未经授权的远程认证模块。首先要检查该文件的权限,确保只有 root 用户可写:
chmod 644 /etc/nsswitch.conf chown root:root /etc/nsswitch.conf
打开文件后,重点关注 passwd、shadow、group 和 hosts 这几行的配置。passwd、shadow、group 三行必须确保 files 作为第一数据源,并且 sss 或 ldap 等远程模块只在确实需要集中认证时才添加。如果不需要 LDAP 或 SSSD,就直接删除相关条目,只保留 files。例如:
passwd: files shadow: files group: files
hosts 行的配置尤为关键,它决定了主机名解析的顺序。默认的 “files dns” 顺序是安全的,但如果被篡改为 “dns files” 或加入了 nis、nisplus 等过时协议,就会引入严重风险。攻击者可能通过 DNS 劫持或伪造 NIS 服务器响应,让系统连接到恶意主机。建议将 hosts 行严格限制为:
hosts: files dns
如果系统不需要解析主机名(例如纯后端服务节点),甚至可以只保留 files,完全禁用 DNS 解析。另外,netgroup、services、protocols 等行如果不需要,直接注释掉或删除,减少攻击面。修改 nsswitch.conf 后无需重启服务,配置即时生效,但建议用 getent passwd 和 getent hosts 测试一下解析是否正常。
PAM 模块加固:密码强度与登录锁定PAM 的配置分散在 /etc/pam.d/ 目录下的各个服务文件中,其中 system-auth 和 password-auth 是两个核心文件(CentOS 7 及以上版本通常通过符号链接统一管理)。直接编辑 /etc/pam.d/system-auth 即可影响大多数本地登录和 SSH 认证行为。首先要确保使用 pam_pwquality.so 模块强制密码复杂度,而不是旧版的 pam_cracklib.so。在 password 段落中加入或修改以下行:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
这条配置的含义是:最小密码长度 12 位,至少包含 1 位数字、1 位大写字母、1 位小写字母和 1 位特殊字符,用户最多重试 3 次。local_users_only 表示只对本地用户生效,避免影响通过 LDAP 等远程认证的用户。retry=3 是安全与易用性的平衡值,过小会导致用户频繁锁定,过大则给暴力破解留下空间。minlen=12 是当前业界普遍认可的最低标准,低于 12 位的密码在现代算力下几乎形同虚设。
接下来配置登录失败锁定机制,这是防御暴力破解最直接有效的手段。在 auth 段落中添加 pam_faillock.so 模块:
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
deny=5 表示连续失败 5 次后锁定账户,unlock_time=900 表示锁定 15 分钟。preauth 行在密码验证前检查是否已被锁定,authfail 行在密码验证失败后记录失败次数。这两行必须配合使用,单独一行无法生效。锁定信息默认记录在 /var/run/faillock/ 目录下,可以用 faillock 命令查看和解锁用户。注意不要将 deny 值设得太低,否则正常用户容易因误输入被锁定,反而增加运维负担。
限制 root 登录与 su/sudo 权限控制PAM 还能精细控制 root 账户的登录途径。在 /etc/pam.d/sshd 中,可以通过 pam_access.so 模块限制哪些用户或组能通过 SSH 登录。首先在 /etc/security/access.conf 中定义规则:
- : all except wheel : ALL
然后在 /etc/pam.d/sshd 的 account 段落添加:
account required pam_access.so
这样就只允许 wheel 组的用户通过 SSH 登录,其他用户即使密码正确也会被拒绝。更彻底的做法是直接禁止 root 通过 SSH 登录,这需要在 sshd_config 中设置 PermitRootLogin no,同时在 PAM 层面配合 pam_securetty.so 模块,确保 root 只能从控制台登录。在 /etc/pam.d/login 中保留:
auth requisite pam_securetty.so
并确保 /etc/securetty 文件中只列出了 console、tty1 等物理终端,不包含任何 pts 伪终端。
对于 su 和 sudo 的权限控制,PAM 同样能发挥作用。编辑 /etc/pam.d/su,启用 pam_wheel.so 模块:
auth required pam_wheel.so use_uid
这样一来,只有 wheel 组的用户才能使用 su 命令切换到其他用户,包括 root。use_uid 参数表示检查的是当前用户的真实 UID,而非有效 UID,防止通过 setuid 程序绕过。sudo 的 PAM 配置在 /etc/pam.d/sudo 中,通常默认配置已经足够安全,但可以添加 pam_tty_audit.so 模块来记录所有通过 sudo 执行的命令及其终端操作,便于事后审计:
session required pam_tty_audit.so enable=*会话资源限制与 core dump 防护
PAM 的 pam_limits.so 模块可以强制应用 /etc/security/limits.conf 中定义的资源限制,防止单个用户耗尽系统资源或产生 core dump 泄露敏感信息。在 /etc/pam.d/system-auth 的 session 段落确保包含:
session required pam_limits.so
然后在 /etc/security/limits.conf 中添加针对所有用户或特定用户的硬限制:
* hard core 0 * hard nproc 512 * hard nofile 1024
将 core 设为 0 可以禁止程序崩溃时产生 core dump 文件,这些文件往往包含内存中的敏感数据,如密钥、密码片段等。nproc 限制最大进程数,nofile 限制最大打开文件数,这两个值可以根据实际业务调整,但不宜过大,否则 fork 炸弹或文件描述符耗尽攻击仍有可乘之机。
NSS 与 PAM 联动:防范共享库劫持NSS 和 PAM 都依赖动态加载的共享库(.so 文件)来实现各种后端功能,例如 libnss_files.so、libnss_dns.so、pam_unix.so 等。攻击者一旦获得 root 权限,可能会替换这些库文件,植入后门,拦截所有认证请求并记录明文密码。因此,必须对这些关键库文件进行完整性校验。CentOS 自带的 rpm -V 命令可以检查文件是否被篡改:
rpm -Va nss-softokn glibc pam
输出中如果出现 “5” 表示 MD5 校验和不匹配,“S” 表示文件大小变化,“M” 表示权限或类型变化。任何异常都应立即排查。更主动的做法是部署 AIDE(Advanced Intrusion Detection Environment)进行定期基线比对,或者使用 tripwire 等工具。同时,确保 /lib64/security/ 和 /usr/lib64/ 目录的权限严格限制为 root 可写,其他用户只读。
禁用不必要的 NSS 后端和 PAM 模块默认安装的 CentOS 系统可能包含许多实际用不到的 NSS 后端和 PAM 模块,这些模块不仅占用资源,还可能存在未公开的漏洞。检查 /etc/nsswitch.conf 中是否有多余的服务条目,如 netgroup、automount、aliases 等,如果业务不需要,直接删除或注释。在 PAM 配置中,检查 /etc/pam.d/ 下所有文件,移除对 pam_console.so、pam_ck_connector.so 等桌面环境相关模块的引用,服务器环境完全不需要这些。另外,pam_lastlog.so 和 pam_motd.so 虽然无害,但会在登录时显示系统信息,如果不需要可以注释掉,减少信息泄露。
审计与监控配置安全加固的最后一步是确保所有认证事件都被完整记录。在 /etc/pam.d/system-auth 中,确保 pam_unix.so 模块带有 audit 参数,这样每次成功的认证都会生成审计日志。同时,利用 pam_tally2.so 或 pam_faillock.so 记录失败尝试。所有 PAM 相关的日志默认写入 /var/log/secure,应配置 logrotate 定期归档,并接入集中日志分析平台。可以用一条简单的命令实时监控暴力破解行为:
tail -f /var/log/secure | grep "Failed password"
对于 NSS 层面的异常,可以通过审计 nscd(Name Service Cache Daemon)的缓存行为来发现。如果系统使用 nscd 缓存解析结果,务必配置 /etc/nscd.conf 中的缓存时间,过长的 TTL 可能导致修改后的认证信息迟迟不生效,而过短的 TTL 会增加后端 LDAP 或 DNS 服务器压力。建议 passwd 和 group 的 positive-time-to-live 设为 600 秒(10 分钟),hosts 的设为 3600 秒。
至此,NSS 与 PAM 的核心安全配置已经覆盖了从用户认证源头到会话资源限制的完整链路。这些配置不是一次性工作,每次系统更新或业务变更后,都应重新审查 /etc/nsswitch.conf 和 /etc/pam.d/ 下的文件,确保没有新增不必要的模块或修改了关键顺序。安全本质上是持续对抗的过程,把这两个模块守住了,CentOS 服务器的认证体系就有了坚实的底座。
