第一次接触Linux系统安全加固时,我被各种配置文件搞得晕头转向,直到发现了PAM这个"幕后指挥官"。简单来说,PAM(Pluggable Authentication Modules)就像机场的多重安检系统 - 你永远不知道它有多少种方式验证你的身份。我在管理公司服务器集群时,正是通过合理配置PAM模块,成功通过了等保三级的安全审计。
PAM的工作原理其实很直观。当用户尝试登录系统或执行特权操作时,相关应用程序(如login、su、ssh)会调用/etc/pam.d/目录下对应的配置文件。这些配置文件就像菜谱一样,告诉系统应该按什么顺序使用哪些认证模块。比如常见的system-auth文件,就是大多数认证流程的"基础配方"。
让我用实际案例说明它的重要性。去年我们有个开发服务器被暴力破解,攻击者尝试了上万次密码组合。后来通过分析发现,问题就出在没有配置PAM的密码复杂度策略。攻击者用简单的"123456"这类密码就能不断尝试。这让我深刻认识到,PAM配置不是可选项,而是系统安全的生命线。
在CentOS 7系统上,密码复杂度主要通过pam_pwquality模块实现。记得第一次配置时,我犯了个低级错误 - 直接修改了system-auth文件而没有备份。结果一个参数错误导致所有用户都无法登录,最后只能进单用户模式恢复。所以请务必先执行:
bash复制cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
现在来看标准配置。打开system-auth文件,找到包含pam_pwquality.so的行(通常在password部分),修改为类似这样:
bash复制password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
这个配置的意思是:
除了基础复杂度,我们还需要防止用户循环使用旧密码。在RHEL/CentOS系统中,这需要配置pam_pwhistory模块:
bash复制password required pam_pwhistory.so remember=5 use_authtok
这个配置会记住最近5次密码,防止用户反复使用相同密码。同时建议在/etc/login.defs中设置:
很多安全事件都源于su命令的滥用。通过PAM可以精确控制哪些用户能使用su切换身份。在/etc/pam.d/su文件中添加:
bash复制auth required pam_wheel.so use_uid group=wheel
然后只将需要特权操作的用户加入wheel组:
bash复制usermod -aG wheel username
这样配置后,只有wheel组成员才能使用su命令。同时建议启用以下日志记录:
bash复制auth required pam_tty_audit.so enable=*
这个配置会将所有特权操作记录到/var/log/secure中,方便事后审计。
防止暴力破解的关键是设置合理的失败锁定策略。在/etc/pam.d/system-auth的auth部分添加:
bash复制auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
这个配置表示:
在高安全要求环境中,建议结合Google Authenticator实现双因素认证。首先安装模块:
bash复制yum install google-authenticator -y
然后在/etc/pam.d/sshd中添加:
bash复制auth required pam_google_authenticator.so
用户需要运行google-authenticator命令生成密钥,并用手机APP扫描二维码。这样登录时除了密码,还需要输入动态验证码。
当管理大量服务器时,手动配置每个节点的PAM文件显然不现实。我通常使用Ansible来批量部署配置。下面是一个简单的playbook示例:
yaml复制- hosts: all
tasks:
- name: Backup system-auth
copy:
src: /etc/pam.d/system-auth
dest: /etc/pam.d/system-auth.bak
remote_src: yes
- name: Configure password policy
lineinfile:
path: /etc/pam.d/system-auth
regexp: '^password.*pam_pwquality.so'
line: 'password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root'
state: present
这个方案可以确保所有服务器保持统一的密码策略,大大减少了配置错误的风险。
在多年的运维实践中,我发现PAM配置最容易被忽视但又至关重要。合理的密码策略和登录控制能阻止90%的自动化攻击。但也要注意平衡安全性和可用性 - 我曾经设置过24位密码+每小时修改的策略,结果用户都把密码写在便利贴上,反而降低了安全性。建议根据实际业务需求,制定既严格又可行的安全策略。