Linux PAM
PAM(Pluggable Authentication Modules) 由 Sun Microsystems 发明并最初在 Solarise OS 上实现,Linux 于 1997 年实现了 Linux-PAM.
PAM 简化了系统认证管理的过程,使用 PAM 提供了以下好处:
- 使用中心化的方式简化了用户身份认证过程以及系统管理员的视角
- 简化了应用在认证相关功能方面的开发,开发者无需重复写认证相关代码,只需要直接使用已有的认证模块即可
- 认证灵活性
- 可以根据用户身份或者是特定的时间,或者是对特定资源的使用进行允许/拒绝操作
包含 PAM 的应用中 PAM 使用流程大体如下 :
- 一个主体(用户或者进程)请求访问(通过认证)一个应用
- 此应用读取其 PAM 配置文件,其 PAM 配置文件中配置了认证策略,认证策略中一般包含要进行认证的 PAM 模块的列表,这个列表也称为 Stack
- Stack 中配置的 PAM 模块被依次调用
- 每个 PAM 模块会根据其配置返回 成功(Success) 或者 失败(Failure) 状态
- 最后是否认证成功,由所有的 PAM 模块返回的结果组合得到 成功(Success) 或者 失败(Failure) ,具体组合方式取决于配置文件中的配置。
Linux 中,大多数包含 PAM 的应用的配置文件位于 /etc/pam.d/
,通用的 PAM 配置文件格式使用:
context 'control flag' 'PAM module' [module options] |
Linux 中,系统安全(如资源限制,用户登陆等)相关的 PAM 配置文件位于 /etc/security/*.conf
PAM Contexts
PAM 模块为不同的认证服务提供了标准的函数,这些 PAM 模块中的标准函数根据其函数类型称为 Contexts
,也可以叫做 Module Interfaces
或者 Types
,下列出了不同的 PAM Contexts 及其对应的 认证服务(Authentication Service)
Context | Service Description |
---|---|
auth |
提供认证管理服务(Authentication Management Services),如验证帐号密码 |
account |
帐号验证服务(Account Validation Services),例如只允许特定时间登陆 |
password |
管理帐号密码(Manages Account Passwords),如限制帐号密码长度 |
PAM Control Flags
PAM 中的 Control Flags 用于决定返回什么样的状态。下表列出了 PAM 配置中的相关的 Control Flags 及其响应
Control Flag | Response Handle |
---|---|
required |
If failed, returns a failure status to the application, after the rest of the contexts have been run in the stack. For example, a requisite control might cause a login to fail if someone types in an invalid user. But the user might not be told of the failure until after entering a password, hiding the fact that it was the bad username that caused the failure |
requisite |
If failed, returns a failure status to the application immediately without running the rest of the stack 。 (Be careful where you place this control in the stack.) For example, a requisite control might require key-based authentication and fail immediately when a valid key is not provided . In that case, it could fail before even prompting for a username/password. |
sufficient |
- If failed, the module status is ignored. - If successful, then a success status is immediately returned to the application without running the rest of the stack. (Be careful where you place this control in the stack.) |
optional |
This control flag is important only for the final overall return status of success or failure . Think of it as a tiebreaker. When the other modules in the configuration file stack return statuses that are neither clear-cut failure nor success statuses, this optional module’s status is used to determine the final status or break the tie. In cases where the other modules in the stack are returning a clear-cut path of failure or success, this status is ignored. |
include |
Get all the return statuses from this particular PAM configuration file’s stack to include in this stack’s overall return status. It’s as if the entire stack from the named configuration file is now in this configuration file |
substack |
Similar to the include control flag, except for how certain errors and evaluations affect the main stack. This forces the included configuration file stack to act as a substack to the main stack. Thus, certain errors and evaluations affect only the substack and not the main stack. |
PAM Modules
Linux 中,PAM Modules 其实是系统共享库(Shared Library Module)文件,RHEL 默认位于 /usr/lib64/security/pam*.so
, Ubuntu 位于 /usr/lib/x86_64-linux-gnu/security/pam*.so
ls /usr/lib/x86_64-linux-gnu/security/ |
要查看 PAM Module 的帮助文档,可以使用 man
手册,如 man pam_access
。
使用 PAM 的应用可以大概分为以下 2 类:
普通程序(Application) 。默认使用 PAM 的应用的配置位于
/etc/pam.d
,每个使用 PAM Module 的应用程序都应该有其自己的配置文件来定义它如何使用 PAM 模块。如果没有,这将是一个漏洞,为了防止这种情况出现,系统内置了一个other
的配置(/etc/pam.d/other
),所有使用了 PAM 但是没有指定其配置文件的应用都将使用此配置。other
配置默认拒绝(Implicit Deny)所有的请求ls /etc/pam.d/
chfn common-auth cron gdm-autologin gdm-smartcard login polkit-1 samba sudo
chpasswd common-password cups gdm-fingerprint gdm-smartcard-pkcs11-exclusive newusers ppp sshd sudo-i
chsh common-session dcv gdm-launch-environment gdm-smartcard-sssd-exclusive other runuser sssd-shadowutils su-l
common-account common-session-noninteractive dcv-graphical-sso gdm-password gdm-smartcard-sssd-or-password passwd runuser-l su vmtoolsd系统安全相关程序 。系统安全相关的 PAM 配置默认位于
/etc/security
。ls /etc/security/
access.conf faillock.conf limits.conf namespace.conf namespace.init pam_env.conf sepermit.conf
capability.conf group.conf limits.d namespace.d opasswd pwquality.conf time.conf