本章介绍可插拔验证模块 (Pluggable Authentication Module, PAM) 框架。PAM 提供了一种向 Solaris 操作系统 (Solaris Operating System, Solaris OS) 中“插入”验证服务的方法。PAM 会在访问系统时为多项验证服务提供支持。
使用可插拔验证模块 (Pluggable Authentication Module, PAM) 框架,可以“插入”新的验证服务,而无需更改系统登录服务,例如 login、ftp 和 telnet。还可以使用 PAM 将 UNIX 登录与其他安全机制(如 Kerberos)进行集成。也可以使用此框架来“插入”帐户、凭证、会话以及口令管理的机制。
使用 PAM 框架,可以为用户验证配置系统登录服务(如 ftp、login、telnet 或 rsh)。PAM 提供的一些益处如下所示:
灵活的配置策略
按应用程序的验证策略
选择缺省验证机制的功能
在高安全性系统中要求提供多个口令的功能
易于最终用户使用
如果对于不同的验证服务口令都相同,则无需重新键入口令
可以提示用户输入多个验证服务的口令,而无需用户键入多个命令
可以将可选选项传送到用户验证服务
可以实现特定于站点的安全策略,而无需更改系统登录服务
PAM 软件由一个库、各种服务模块以及一个配置文件组成。其中还包括可利用这些 PAM 接口的 Solaris 命令或守护进程。
下图说明了系统登录应用程序、PAM 库、pam.conf 文件和 PAM 服务模块之间的关系。
系统登录应用程序(如 ftp、telnet 和 login)使用 PAM 库来调用配置策略。配置策略在 pam.conf 文件中定义。pam.conf 文件定义要使用的模块,以及每个应用程序使用这些模块的顺序。模块中的结果基于模块响应和已配置的控制标志。这些结果通过库传送回应用程序。
PAM 框架提供了一种使用堆叠借助多项服务来验证用户的方法。根据配置,系统可以提示用户输入每种验证方法的口令。验证服务的使用顺序通过 PAM 配置文件确定。
PAM 库可提供框架以装入相应模块和管理堆叠过程。PAM 库提供了一种可在其中插入所有模块的通用结构。有关更多信息,请参见 pam_sm(3PAM) 手册页。
Solaris 10 发行版对可插拔验证模块 (Pluggable Authentication Module, PAM) 框架做了以下更改:
现在,pam_authtok_check 模块允许使用 /etc/default/passwd 文件中的新可调参数执行严格的口令检查。这些新参数定义以下各项:
用逗号分隔的字典文件列表,这些字典文件用于检查口令中的常用字典字
新口令与旧口令之间所需的最小差别
新口令中必须用到的字母字符或非字母字符的最少个数
新口令中必须用到的大写字母或小写字母的最少个数
允许的连续重复字符的个数
pam_unix_auth 模块可针对本地用户实现帐户锁定。帐户锁定通过 /etc/security/policy.conf 中的 LOCK_AFTER_RETRIES 参数以及 /etc/user_attr 中的 lock_after-retries 密钥启用。有关更多信息,请参见 policy.conf(4) 和 user_attr(4) 手册页。
定义了一个新的 binding 控制标志。此控制标志在 pam.conf(4) 手册页和PAM 控制标志中进行了介绍。
pam_unix 模块已删除,并替换为一组等效或功能更强的服务模块。Solaris 9 发行版已引入其中的许多模块。替换模块列表如下:
pam_authtok_check
pam_authtok_get
pam_authtok_store
pam_dhkeys
pam_passwd_auth
pam_unix_account
pam_unix_auth
pam_unix_cred
pam_unix_session
pam_unix_auth 模块的功能已分解为两个模块。现在,pam_unix_auth 模块可以检验用户的口令是否正确。新的 pam_unix_cred 模块可提供建立用户凭证信息的功能。
对 pam_krb5 模块进行扩充是为了使用 PAM 框架来管理 Kerberos 凭证高速缓存。
添加了新的 pam_deny 模块。此模块可用于拒绝对服务的访问。缺省情况下,不使用 pam_deny 模块。有关更多信息,请参见 pam_deny(5) 手册页。
本节介绍使 PAM 框架使用特定安全策略所需执行的一些任务。应注意与 PAM 配置文件关联的某些安全问题。有关安全问题的信息,请参见规划 PAM 实现。
任务 |
说明 |
参考 |
---|---|---|
规划 PAM 安装。 |
开始软件配置过程之前,考虑配置问题并做出相关决定。 | |
添加新的 PAM 模块。 |
有时,必须写入并安装特定于站点的模块,以满足通用软件不包括的要求。此过程说明如何安装这些新的 PAM 模块。 | |
阻止访问 ~/.rhosts。 |
通过阻止访问 ~/.rhosts 来进一步提高安全性。 | |
启动错误日志。 |
通过 syslog 启动 PAM 错误消息日志。 |
所提供的 pam.conf 配置文件可实现标准的 Solaris 安全策略。此策略应适用于许多情况。如果需要实现其他安全策略,则应考虑以下问题:
确定需求,特别是应选择的 PAM 服务模块。
标识需要特殊配置选项的服务。使用 other(如果适用)。
决定运行模块的顺序。
选择每个模块的控制标志。有关所有控制标志的更多信息,请参见PAM 控制标志。
选择每个模块必需的所有选项。每个模块的手册页应列出所有的特殊选项。
以下是更改 PAM 配置文件之前要考虑的一些建议:
对每种模块类型使用 other 项,以便 /etc/pam.conf 中不必包括每个应用程序。
确保考虑 binding、sufficient 和 optional 控制标志所涉及的安全问题。
查看与模块关联的手册页。这些手册页有助于您了解每个模块的工作方式、可用的选项,以及堆叠模块之间的交互。
如果 PAM 配置文件配置错误或者被损坏,则可能没有用户能登录。由于 sulogin 命令不使用 PAM,因此,需要超级用户口令才能将计算机引导至单用户模式并修复问题。
更改 /etc/pam.conf 文件之后,在您仍具有系统访问权限的情况下,尽可能多地检查此文件以更正问题。对更改可能影响到的所有命令进行测试。例如,向 telnet 服务中添加新模块。在此示例中,将使用 telnet 命令并检验所做更改是否使服务按预期方式运行。
此过程说明如何添加新的 PAM 模块。可以创建新模块以提供特定于站点的安全策略或支持第三方应用程序。
成为超级用户或承担等效角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)。
确定应使用的控制标志和其他选项。
有关模块的信息,请参阅PAM 模块。
确保设置了拥有权和权限,以便模块文件由 root 拥有,并且权限为 555。
编辑 PAM 配置文件 /etc/pam.conf,并将此模块添加到相应的服务中。
检验是否正确添加了模块。
必须在重新引导系统之前进行测试,以防此配置文件配置错误。在重新引导系统之前,使用直接服务(例如 rlogin 或 telnet )登录,并运行 su 命令。此服务可能是引导系统时仅产生一次的守护进程。因此,必须先重新引导系统,然后才能检验是否已添加模块。
成为超级用户或承担等效角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)。
从 PAM 配置文件中删除所有包括 rhosts_auth.so.1 的行。
此步骤用于防止在 rlogin 会话期间读取 ~/.rhosts 文件。因此,此步骤可防止从远程系统对本地系统进行未经验证的访问。无论 ~/.rhosts 或 /etc/hosts.equiv 文件是否存在或包含什么内容,所有 rlogin 访问都需要口令。
禁用 rsh 服务。
要防止对 ~/.rhosts 文件进行其他未经验证的访问,请记住要禁用 rsh 服务。
# svcadm disable network/shell |
成为超级用户或承担等效角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)。
为所需的日志级别配置 /etc/syslog.conf 文件。
有关日志级别的更多信息,请参见 syslog.conf(4)。
刷新 syslog 守护进程的配置信息。
# svcadm refresh system/system-log |
PAM 配置文件 pam.conf 确定要使用的验证服务模块,以及这些模块的使用顺序。可以修改此文件来为每个系统登录应用程序选择验证模块。
PAM 配置文件所包含项的语法如下:
service-name module-type control-flag module-path module-options |
系统登录服务的名称,例如 ftp 、login、telnet。
服务的模块类型。有关更多信息,请参见PAM 模块类型。
确定模块的延续行为或失败行为。
指定实现安全策略的库对象的路径。
指定传送到服务模块的选项。
通过以 #(井号)开始行,可以向 pam.conf 文件中添加注释。可以使用空格或制表符来分隔字段。
如果在 PAM 配置文件的项中发现错误,则会生成 syslog 错误消息。如果此错误是请求服务的项,则此服务可能会返回一个错误。
每项服务的特定服务名称应该在该服务的手册页中进行介绍。例如,sshd(1M) 手册页列出 sshd 命令的所有 PAM 服务名称。
您需要了解 PAM 模块类型,因为这些类型定义模块的接口。以下是 PAM 模块的类型:
帐户模块,检查口令生命期、帐户到期日期和访问限制。通过验证模块对用户身份进行验证之后,帐户模块会确定是否应授予该用户对系统的访问权限。
验证模块,为用户提供验证。此类模块还允许设置、刷新或销毁凭证。
口令模块,允许对用户口令进行更改。
会话模块,管理登录会话的打开与关闭。这些模块还可以记录活动,或在会话结束后进行清除。
使用 PAM 服务模块的请求返回以下三种状态之一:
成功-满足安全策略
失败-未满足安全策略
忽略-此请求未参与策略请求
栈中的每个模块都可以确定请求的成功或失败。要确定模块的延续行为或失败行为,必须为 PAM 配置文件中的每个项选择一个控制标志。
延续行为定义是否检查后面的所有模块。根据特定模块的响应,可以决定跳过所有其他模块。
失败行为定义如何记录或报告错误消息。失败信息既可以是可选信息,也可以是必需信息。必需的失败信息会导致此请求失败,即使其他模块成功也是如此。可选的失败信息不会始终导致此请求失败。
binding-使用此控制标志,如果模块响应成功,并且先前带有 required 标志的模块都没有失败,则 PAM 会跳过其余模块并返回成功信息。如果返回失败信息,则 PAM 会记录必需的失败信息,然后继续处理栈。
除模块响应成功情况下不再检查任何其他模块以外,binding 控制标志类似于 required 控制标志。无论其他模块如何响应,使用此标志的模块中的失败信息会阻止请求成功。如果先前的必需模块都响应成功,则使用此标志的模块中的成功信息会使请求成功。
required-使用此控制标志,如果模块响应成功,则 PAM 会记录必需的成功信息并继续检查后面的所有模块。如果此模块响应失败,并且此失败信息是第一个必需的失败信息,则 PAM 会保存错误消息并继续检查栈。如果此失败信息不是第一个失败信息,则 PAM 只会继续检查栈。此标志允许处理整个序列,从而不会泄露可帮助攻击者进行攻击的信息。攻击者可找出的所有信息就是请求失败。
如果某特定模块必须响应成功才能使请求成功,则应使用 required 控制标志。无论其他模块如何响应,使用此标志的模块中的失败信息会阻止请求成功。使用此标志的模块中的成功信息并不表示请求成功。栈中带有 required、requisite 或 binding 控制标志的其他模块必须都响应成功,请求才会成功。
requisite-使用此控制标志,如果模块响应成功,则 PAM 会记录必需的成功信息并继续检查后面的所有模块。如果此模块响应失败,则 PAM 会记录必需的失败信息,返回第一个必需失败信息的错误消息,然后跳过任何其他检查。
除模块响应失败情况下不再检查任何其他模块以外,requisite 控制标志类似于 required 控制标志。无论其他模块如何响应,使用此标志的模块中的失败信息会阻止请求成功。使用此标志的模块中的成功信息并不表示请求成功。栈中带有 required、requisite 或 binding 控制标志的其他模块必须都响应成功,请求才会成功。
optional-使用此控制标志,如果模块响应成功,则 PAM 会记录可选的成功信息并继续检查栈。如果此模块响应失败,则 PAM 会记录可选的失败信息并继续检查栈。
当栈中的成功验证足以对用户进行验证时,应使用 optional 控制标志。仅当此特定服务无需成功执行时才应使用此标志。请求的成功或失败由必需的失败信息或成功信息确定。
如果用户需要具有与特定服务关联的权限才能完成其工作,则不应将模块标记为 optional。
sufficient-使用此控制标志,如果模块响应成功,并且先前带有 required 标志的模块都没有失败,则 PAM 会跳过其余模块并返回成功信息。如果此模块响应失败,则 PAM 会记录可选的失败信息并继续检查栈。
除模块响应成功情况下不再检查任何其他模块以外,sufficient 控制标志类似于 optional 控制标志。如果先前的 required 模块都响应成功,则使用此标志的模块中的成功信息会使请求成功。如果其他模块都响应失败,则使用此标志的模块中的失败信息会导致请求失败。
有关这些控制标志的更多信息,请参见下一节,其中介绍了通用 /etc/pam.conf 文件。
每个 PAM 模块都可实现一种特定的功能。设置 PAM 验证时,需要指定模块和模块类型,后者定义模块执行的操作。一个模块可以实现多个模块类型,例如 auth、account、session 或 password。
每个模块的路径由已安装的 Solaris 发行版中提供的指令集确定。对于 32 位模块,模块路径为 /usr/lib/security。对于 64 位模块,路径为 /usr/lib/security/ $ISA。有关更多信息,请参见 isalist(5) 手册页。
Solaris PAM 模块的完整列表位于 /usr/lib/security/$ISA 中。每个模块都有关联的手册页,其中介绍了应用的模块类型以及所有的特殊选项。
出于安全原因,这些模块文件必须由 root 拥有,并且禁止使用 group 或 other 权限写入。如果文件并非由 root 拥有,则 PAM 不会装入模块。
login auth requisite pam_authtok_get.so.1 login auth required pam_dhkeys.so.1 login auth required pam_unix_cred.so.1 login auth required pam_unix_auth.so.1 login auth required pam_dial_auth.so.1 |
运行 login 命令时,必须针对 pam_authtok_get、pam_dhkeys、pam_auth_cred、pam_auth_unix 和 pam_dial_auth 模块成功执行验证。pam_authtok_get 项中的 requisite 标志表示,如果此模块响应失败,则不再检查任何其他模块。但是,如果此模块响应成功,则会继续检查其余模块。如果针对所有模块的验证都失败,则验证请求也会失败。
rlogin auth sufficient pam_rhosts_auth.so.1 rlogin auth requisite pam_authtok_get.so.1 rlogin auth required pam_dhkeys.so.1 rlogin auth required pam_unix_cred.so.1 rlogin auth required pam_unix_auth.so.1 |
对于 rlogin 命令,sufficient 控制标志表示通过 pam_rhosts_auth 模块进行的验证足以使验证请求成功。无需执行任何其他检查。如果通过 pam_rhosts_auth 进行的验证失败,则通过 pam_authtok_get、pam_dhkeys、pam_auth_cred 和 pam_unix_auth 模块进行的验证必须成功。虽然其他模块中的失败信息会阻止成功验证,但是 pam_rhosts_auth 模块中的失败信息不会。此外,与 login 中的项相同,pam_authtok_get 项中的 requisite 控制标志表示如果此模块响应失败,则验证请求失败,并且不再检查任何其他模块。
other session required pam_unix_session.so.1 |
使用 other 服务名称,可以为 pam.conf 文件中未包括的任何其他命令设置缺省服务。other 服务名称简化了文件管理,因为只需一个项就可涵盖使用同一模块的许多服务。此外,other 服务名称用作“全面管理功能”时,可以确保每个访问都由一个模块来表示。
module-path 的项是“相对于根目录的”。如果为 module-path 指定的文件名未以斜杠 (/) 开始,则文件名前面为路径 /usr/lib/security/$ISA。必须对位于其他目录中的模块使用全路径名。可以在每个模块的手册页中找到 module-options 的值。