Linux基础——Pam模块
一、Pam模块架构
1、Pam认证逻辑
2、Pam系统自带模块或安装模块路径/usr/lib64/security/
# /usr/lib64/security模块作用
pam_access.so 控制访问者地址与账号名称 pam_listfile.so 控制访问者的账号名称或登录位置 pam_limits.so 控制为用户分配的资源 pam_rootok.so 对管理员(uid=0)无条件允许通过 pam_userdb.so 设定独立用户账号数据库认证
Linux PAM 内置模块 | |||
模块 | 类型 | 简介 | |
pam_access.so | auth,account,password,session | 基于来源(主机/网络/终端/$DISPLAY/服务名)的访问控制 | |
pam_debug.so | auth,account,password,session | 调试PAM栈 | |
pam_deny.so | auth,account,password,session | 无条件的拒绝访问 | |
pam_echo.so | auth,account,password,session | 显示文本消息 | |
pam_env.so | auth,session | 设置与撤销环境变量(也包括PAM变量) | |
pam_exec.so | auth,account,password,session | 调用外部命令 | |
pam_faildelay.so | auth | 设置认证失败时的阻塞延迟 | |
pam_faillock.so | auth,account | 锁定连续认证失败的账户 | |
pam_filter.so | auth,account,password,session | 在用户与应用程序之间建立输入输出(STDIN/STDOUT)过滤器 | |
pam_ftp.so | auth | 可插拔的匿名FTP访问模式(不安全) | |
pam_group.so | auth | 将用户额外添加到特定组中 | |
pam_issue.so | auth | 更改用户的提示文件(issue) | |
pam_keyinit.so | session | 在默认内核会话密钥环之外额外创建新的内核会话密钥环 | |
pam_lastlog.so | auth,account,session | 显示账户的上次登录时间、锁定长期不登录的帐户 | |
pam_limits.so | session | 设置会话的资源限制 | |
pam_listfile.so | auth,account,password,session | 基于各种属性(tty|user|rhost|ruser|group|shell)执行访问控制 | |
pam_localuser.so | auth,account,password,session | 仅允许本地用户(/etc/passwd)访问 | |
pam_loginuid.so | session | 设置进程的 loginuid 属性(主要用于审计目的) | |
pam_mail.so | auth,session | 提示用户有新邮件 | |
pam_mkhomedir.so | session | 在开始会话前创建用户的家目录 | |
pam_motd.so | session | 显示"今日消息"(motd) | |
pam_namespace.so | session | 为会话设置私有名字空间 | |
pam_nologin.so | auth,account | 禁止非 root 账户登录 | |
pam_permit.so | auth,account,password,session | 无条件的允许访问(小心使用) | |
pam_pwhistory.so | password | 防止重复使用旧密码 | |
pam_rhosts.so | auth | 使用 rlogin/rsh 网络访问认证(/etc/hosts.equiv 与 ~/.rhosts) | |
pam_rootok.so | auth,account,password | 仅在 UID=0 时验证成功 | |
pam_securetty.so | auth | 仅允许 root 从指定的"安全"设备登录 | |
pam_selinux.so | session | 设置默认的 SELinux 安全上下文 | |
pam_sepermit.so | auth,account | 根据 SELinux 的开关状态决定是否通过认证 | |
pam_setquota.so | session | 在开始会话时设置或修改磁盘限额 | |
pam_shells.so | auth,account | 检查登录shell的有效性(是否列于 /etc/shells 之中) | |
pam_stress.so | auth,account,password,session | 模拟失败表现 | |
pam_succeed_if.so | auth,account,password,session | 测试账号自身的属性以实现条件分支逻辑 | |
pam_time.so | account | 根据时间段决定是否允许访问 | |
pam_timestamp.so | auth,session | 缓存成功的认证以避免频繁的反复认证 | |
pam_tty_audit.so | session | 开启或关闭TTY审计(内核默认不审计TTY上的输入) | |
pam_umask.so | session | 设置本次会话中的 umask 值 | |
pam_unix.so | auth,account,password,session | 传统UNIX密码验证(/etc/passwd 与 /etc/shadow) | |
pam_userdb.so | auth,account | 使用 Berkeley DB 数据库验证用户名/密码 | |
pam_usertype.so | auth,account,password,session | 根据 /etc/login.defs 中的设置检查已认证用户的类型(系统账户/普通账户) | |
pam_warn.so | auth,account,password,session | 向系统日志中记录详细的PAM信息(服务名,终端,用户,远程用户,远程主机) | |
pam_wheel.so | auth,account | 仅允许 wheel 组成员获得 root 权限 | |
pam_xauth.so | session | 在用户之间转发 xauth 密钥(cookies) | |
常见第三方模块 | |||
模块 | RHEL(rpm) | Debian(deb) | 关键词 |
pam_fprintd.so | fprintd-pam | libpam-fprintd | 指纹 |
pam_gdm.so | gdm | gdm3 | GDM(GNOME显示管理器) |
pam_gnome_keyring.so | gnome-keyring-pam | libpam-gnome-keyring | gnome-keyring(GNOME密钥管理器) |
pam_cap.so | libcap | libpam-cap | Linux Capabilities |
pam_pwquality.so | libpwquality | libpam-pwquality | 密码复杂度 |
pam_user_map.so | mariadb-pam | mariadb-server | MariaDB |
pam_oddjob_mkhomedir.so | oddjob-mkhomedir | oddjob-mkhomedir | 创建家目录 |
pam_cifscreds.so | pam_cifscreds | cifs-utils | NTLM(NT LAN Manager) |
pam_oath.so | pam_oath | libpam-oath | OATH(一次性密码) |
pam_ssh_agent_auth.so | pam_ssh_agent_auth | libpam-ssh-agent-auth | ssh-agent |
pam_winbind.so | samba-winbind-modules | libpam-winbind | Winbind |
pam_sss.so | sssd-client | libpam-sss | System Security Services Daemon |
pam_systemd.so | systemd-pam | libpam-systemd | systemd-logind |
3、Pam库文件的映射文件libpam.so.0
# ln -sf <source实际文件存放位置> <dest映射文件存放文件名>
ln -sf /usr/lib64/libpam.so.0.85.1 /usr/lib64/libpam.so.0
4、Pam配置
system-auth: password-auth: sshd: su: su-l: sudo: sudo-i:
二、pam模块/etc/pam.d/*system-auth
1、第一列:管理组字段
- auth:鉴别接口模块类型用于检查用户和密码,并分配权限;
- account:账户类接口,主要负责账户合法性检查,确认账号是否过期,是否有权限登录系统;
- session:会话类接口,实现从用户登录成功到退出的会话控制;
- password:口令类接口,控制用户更改密码的全过程;
2、第二列:控制标志
- Requird:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件(失败继续,并不通过验证)。任何带 required 标记的模块验证失败,PAM 并不立刻将消息返回给应用程序,而是在所有模块都调用完毕后才将失败消息返回调用他的程序;
- Requisite:带此标记的模块返回成功后,用户才能通过鉴别(成功继续,失败马上返回);
- Sufficient:该行以及所涉及模块验证成功是用户通过鉴别的充分条件(成功马上返回;失败时相当于Optional,即通过验证,并继续执行)。模块一旦验证成功,那么 PAM 便立即向应用程序返回成功结果而不必尝试任何其他模块;
- Optional:即便该行所涉及的模块验证失败用户仍能通过认证;
- Include:在验证过程中调用其他的 PAM 配置文件。
3、第三列和第四列:模块和模块参数
三、Pam使用
1、限制普通用户ssh登入主机
i.服务端加固,禁止gk用户登入主机 (base) [root@NewOSBC8 ~]# grep -v '#' /etc/security/access.conf -:gk:192.168.190.110 ii.sshd是否启用UseAPM配置 (base) [root@NewOSBC8 ~]# grep 'UsePAM' /etc/ssh/sshd_config # WARNING: 'UsePAM no' is not supported in RHEL and may cause several UsePAM yes iii.PAM第一步检查:/etc/pam.d/sshd中账户检测模块 cat /etc/pam.d/sshd | grep account account include password-auth iv.PAM第二部检查:秘钥认证模块/etc/pam.d/password-auth #关联/etc/security/access.conf允许和禁用普通用户 cat /etc/pam.d/sshd | grep -i 'pam_access.so' account required pam_access.so v.安全模块第三部检查:查看普通用户是否被放行或禁止登入/etc/security/access.conf(文件中有各种范例) grep -v '#' /etc/security/access.conf #允许root用户在指定网段登入主机 +:root:192.168.201. #禁止普通用户gk通过ssh登入主机 -:gk:192.168.190.
vi.客户端测试(测试成功“Connection closed by...”)
[root@harbor ~]# ssh gk@192.168.190.131
gk@192.168.190.131's password:
Connection closed by 192.168.190.131 port 22
参考
Pam模块 https://www.cnblogs.com/kevingrace/p/8671964.html https://www.jianshu.com/p/a6ecfd73abe4 https://zhuanlan.zhihu.com/p/541527128?utm_id=0 https://www.cnblogs.com/LiuYanYGZ/p/12381651.html https://www.jinbuguo.com/linux/pam.html
稳步前行,只争朝夕。
分类:
System
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异