本文介绍Linux PAM的工作机制和实现。Linux PAM(Pluggable Authentication Modules, 可插拔认证模块)
是一套库,允许 Linux
系统管理员配置对用户进行认证的方法。
介绍
PAM
通过使用配置文件而不是更改应用程序代码,它提供了一种灵活且集中的方式来切换受保护应用程序的身份验证方法。PAM
提供了一整套的鉴权、授权、密码管理、会话管理机制等。
运行机制
/ -> auth 认证管理
/ -> account 账号管理
login -> PAM(libpam.so 解析 /etc/pam.d/login)
\ -> password 密码管理
\ -> session 会话管理
[root@xiexianbin_cn ~]# ldd /usr/bin/login | grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f7d16fb3000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f7d16daf000)
[root@xiexianbin_cn ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
[root@xiexianbin_cn ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
配置信息
PAM 会根据配置中的模块名称从 ls -lhart /usr/lib64/security | grep pam
查找 .so
文件。
模块类型
- auth(认证管理):对用户的身份进行识别,如提示用户输入密码等
- account(账号管理):对帐号的各项属性进行检查,如是否允许登录、是否达到最大用户数、root 用户是否允许在这个终端登录等
- password(密码管理):修改用户密码
- session(会话管理):定义用户登录前的及用户退出后所要进行的操作,如登录信息、用户数据的打开与关闭、挂载文件系统等。
如果在模块类型的开头有个短横线 -
,表示如果找不到这个模块导致无法加载,这一事件不会被记录在日志中,适用于哪些非必须的验证功能。
控制标记
控制标记用来处理和判断各个模块的返回值:
- required 即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后才返回错误信息
- requisite 如果某个模块返回失败,则立刻返回失败,不再进行同类型后面的操作
- sufficient 如果验证通过,则立即返回验证成功消息,无论前面模块是否有失败,而且也不再执行后面模块。如果验证失败,sufficient 的作用和 optional 相同
- optional 即使指定的模块验证失败,也允许用户接受应用程序提供的服务,一般返回 PAM_IGNORE
- include 包含一个新的配置文件进行验证
- substack 与 include 类似,区别是,include 调用文件执行时有 die 或者 bad 则立即返回调用处,而 substack 则等待文件执行完
常用模块
pam_unix.so
auth 提示用户输入密码,并与/etc/shadow文件相比对,匹配返回0
account 检查用户的账号信息(如是否过期),帐号可用时返回0
password 修改用户的密码,将用户输入的密码,作为用户的新密码更新shadow文件
pam_shells.so
auth account 如果用户想登录系统,那么它的shell必须是在/etc/shells中
pam_deny.so
auth account password session 用来拒绝访问
pam_permit.so
auth account password session 任何时候都返回成功
pam_cracklib.so
password 提示用户输入密码,并与系统中的字典进行比对,检查密码的强度
pam_securetty.so
auth 用户要以root登录时,则登录的tty必须在/etc/securetty中
部分内容转载自互联网