PAM模块初识

1. 简介

​ PAM(Pluggable Authentication Modules)是由Sun提出的一种认证机制。

​ PAM模块的中文全称为可拔插认证模块,从名字就可以看出该模块的一些特性和作用——即可拔插和用于系统认证

​ 准确的来说,PAM模块通过一套动态链接库和一套统一的API,将系统提供的服务和其认证分离,并将其认证统一托管给PAM模块,来实现更加快捷方便的统一管理不同服务之间的认证机制,另外,使用PAM模块也便于向系统中添加新的认证手段。

​ PAM模块最初集成在Solaris中,目前已经移植到其他系统中。

2. 结构

​ PAM模块大致可以分为三个部分。

​ 应用开发者使用PAM SPI(Service Module API)来编写认证模块,将不同的认证机制加入到系统中。

​ 系统管理员通过PAM配置文件来制定认证策略。

​ PAM库(libpam)则负责读取配置文件,并以此为根据将服务程序的相应的认证方法联系起来。

3. PAM具体配置

​ PAM的配置文件包括/etc/pam.conf和/etc/pam.d/这两个,其中后者是一个文件夹,并在其中有多个以服务名为名的文件来对不同的服务进行配置(且在RedHat中,后者配置的优先级高于前者)。

​ 在pam.conf中,配置主要有以下几列来完成。

service-name module-type control-flag module-path arguments
服务名 管理方式 应当如何处理结果 服务程序路径 传入参数

下面对这几部分进行解释。

  1. service-name

    正如其名,该列填入的参数正是服务名。而如果该列为OTHER则代表其后的配置适用于任何没有在该pam模块中配置的应用。

  2. modeule-type

    这一列需要填入PAM所支持的四种管理方式之一,分别是auth,account,session,password,同一个服务可以调用多个PAM模块进行认证,这些模块构成一个stack。

    PAM支持的四种管理方式:

    1. 认证管理(authentication management)

      主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。

    2. 账户管理(account management)

      主要是检查账户是否被允许登录系统,账号是否已经过期,账号的登录是否有时间段的限制等。

    3. 密码管理(password management)

      主要是用来修改账户的密码。

    4. 会话管理(session management)

      主要是提供对会话的管理和记账(accounting)。

  3. control-flag

    这一列需要告诉PAM库如何处理与服务相关的PAM模块的成功或失败情况。他有四种可能的值:required,requisite,sufficient,optional。

    required表示本模块必须返回成功才能通过认证,但是如果模块返回失败,失败结果也不会立即通知用户,而是要等到同一stack中的所有模块全部执行完毕再将失败结果返回给应用程序。

    requisite与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将直接将控制权返回给应用程序。

    注:requisite只有RedHat支持,Solaris不支持。

    sufficient表示本模块返回成功已经足以通过身份认证的要求,不必再执行统一stack内的其他模块,但是如果本模块返回失败的话可以忽略。

    optional表示本模块是可选的,他的成功与否一般不会对身份认证起到关键作用,其返回值一般被忽略。

  4. module-path用来指明本模块对应的应用程序的路径名,一般使用绝对路径,而如果没有使用绝对路径的话,默认是/usr/lib/security下的相对路径。

  5. argument是用来传递给 该模块的参数,一般来说每个 模块的参数都不相同,可以由该模块的开发者自己定义,但也有以下几个共同的参数:

    ​ debug 该模块应当用syslog()将调试信息写入到系统日志文件中。

    ​ no_warn表明该模块不应把警告信息发送给应用程序。

    ​ use_first_pass表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。

    ​ try_first_pass表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。

    ​ use_mapped_pass该模块不能提示用户输入密码,而是使用映射过的密码。

    ​ expose_account允许该模块显示用户的账号名等信息,一般只能在安全的环境下使用,因为泄露用户名会对安全造成一定程度的威胁。

​ 而如果使用/etc/pam.d/来进行配置:

​ 该目录下的每个文件名对应服务名,而其配置文件中并不存在service-name这一栏,其余部分则与使用pam.conf的配置完全相同。

猜你喜欢

转载自blog.csdn.net/qq_43578047/article/details/87911436
pam