什么是 PAM?
PAM(Pluggable Authentication Modules,可插拔式认证模块)是 Linux 系统中一种灵活且强大的用户认证框架。它允许系统管理员通过配置不同的认证模块来实现对用户的网段、时间、用户名、密码等多方面的认证控制。
PAM 的核心优势
模块化设计:无需修改应用程序代码,通过配置文件即可改变认证方式
易于扩展:可以编写新模块支持新的认证机制
动态加载:运行时按需加载相应模块,减少资源占用
集中管理:统一的接口和配置文件,实现认证逻辑与应用程序分离
使用 PAM 的服务
本地登录服务:
login
,gdm
,kdm
远程登录服务:
sshd
文件传输服务:
vsftpd
网络共享服务:
samba
不使用 PAM 的服务
数据库服务:
MySQL-Server
监控服务:
Zabbix
PAM 认证流程
服务请求:用户访问受保护服务时触发认证
加载配置:服务加载对应的 PAM 配置文件
执行认证:按配置顺序调用各个模块进行认证
返回结果:将所有模块结果汇总后返回给服务
PAM 认证类型
认证类型 | 功能描述 | 常用模块 |
---|---|---|
auth | 验证用户身份 | pam_unix.so |
account | 控制用户访问权限 | pam_access.so |
password | 管理密码策略 | pam_cracklib.so |
session | 管理用户会话 | pam_limits.so |
PAM 控制标记
控制标记 | 描述 | 应用场景 |
---|---|---|
required | 失败仍继续但最终返回失败 | 基础认证 |
requisite | 失败立即返回失败 | 关键检查 |
sufficient | 成功则立即返回成功 | 特权用户 |
optional | 不影响最终结果 | 记录信息 |
include | 包含其他配置文件 | 模块复用 |
substack | 垂直叠加模块栈 | 复杂认证 |
常用 PAM 模块详解
1. pam_rootok.so
功能:检查当前用户是否为 root 用户
配置示例:
# /etc/pam.d/su
auth sufficient pam_rootok.so
应用场景:允许 root 用户无需密码切换到其他用户
2. pam_access.so
功能:基于用户名、IP 地址等控制访问
配置示例:
# /etc/pam.d/sshd
auth required pam_access.so accessfile=/etc/security/access.conf
访问规则示例(/etc/security/access.conf):
# 允许 admin 组从内部网络登录 + : @admin : 192.168.1.0/24 # 拒绝所有其他访问 - : ALL : ALL
3. pam_listfile.so
功能:基于文件列表控制访问(黑白名单)
配置示例:
# 只允许特定用户 SSH 登录 auth required pam_listfile.so \ item=user sense=allow file=/etc/ssh/users.allow onerr=fail
4. pam_time.so
功能:基于时间控制访问权限
配置示例:
# /etc/pam.d/sshd auth required pam_time.so
时间规则示例(/etc/security/time.conf):
# 只允许工作时间登录 sshd ; * ; @employees ; Wk0900-1800
5. pam_tally2.so
功能:防止暴力破解,账户锁定
配置示例:
# 5次失败后锁定10分钟 auth required pam_tally2.so deny=5 unlock_time=600
管理命令:
# 查看失败次数 pam_tally2 --user=username # 重置计数器 pam_tally2 --user=username --reset
6. pam_limits.so
功能:限制用户资源使用
配置示例:
# /etc/pam.d/sshd session required pam_limits.so
资源限制示例(/etc/security/limits.conf):
# 限制用户最多100个进程和1024个文件 * soft nproc 100 * hard nproc 200 * soft nofile 1024 * hard nofile 2048
实战案例
案例1:SSH 安全加固
# /etc/pam.d/sshd # IP访问控制 auth required pam_access.so accessfile=/etc/security/access.conf # 防止暴力破解 auth required pam_tally2.so deny=5 unlock_time=600 # 标准认证 auth include password-auth # 资源限制 session required pam_limits.so
案例2:密码策略强化
# /etc/pam.d/system-auth # 密码复杂度要求 password required pam_pwquality.so minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 # 密码历史记录 password required pam_pwhistory.so remember=5 # 密码过期策略 password required pam_unix.so use_authtok sha512 shadow try_first_pass
Cgroups 资源限制
CPU 限制示例
# 创建cgroup mkdir /sys/fs/cgroup/cpu/myapp # 设置CPU限制(50% CPU) echo 50000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_period_us # 添加进程到cgroup echo $PID > /sys/fs/cgroup/cpu/myapp/tasks
内存限制示例
# 创建cgroup mkdir /sys/fs/cgroup/memory/myapp # 设置内存限制(512MB) echo 512M > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes # 添加进程到cgroup echo $PID > /sys/fs/cgroup/memory/myapp/tasks
最佳实践与注意事项
测试配置:修改 PAM 配置前先测试,避免被锁 outside
备份配置:重要修改前备份原始配置文件
日志监控:定期检查
/var/log/secure
和/var/log/auth.log
最小权限:遵循最小权限原则配置访问控制
定期审查:定期审查 PAM 配置和访问规则
故障排除
认证失败:检查 PAM 配置语法和模块路径
性能问题:优化模块加载顺序,减少不必要的模块
权限问题:确保配置文件权限正确(通常为 644)
通过合理配置 PAM 和 Cgroups,可以显著提升 Linux 系统的安全性和稳定性,实现细粒度的访问控制和资源管理