PAM 模块详解


pam 适用场景

Pluggable Authentication Module,PAM. 插入式验证模块

PAM 是关注如何为服务验证用户的 API。在使用 PAM 之前,诸如 login(和 rlogin、telnet、rsh)之类的应用程序在 /etc/passwd 中查找用户名,然后将两者相比较并验证用户输入的名称。所有应用程序使用了这些共享服务,但是并未共享实现细节和配置这些服务的权限。 
pam 通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活的根据需要给不同的服务配置不同的认证方式,而无需更改服务程序

pam 认证过程

用户使用与验证有关的服务程序时,应用程序通过 PAM 的API (PAM 的应用编程接口 )与PAM 的动态链接库进行通信。PAM 模块通过PAM 的SPI (PAM 的服务提供者接口)与PAM 库进行通信。通过这种方式,PAM 库可使应用程序和模块互相进行通信

例如passwd 这个程序::

1、用户登录时执行 /usr/bin/passwd 这个程序,并输入密码; 
2、passwd 程序开始呼叫PAM模块,PAM块会搜寻passwd 程序的PAM 相关设定文件,这个设定文件一般是在 /etc/pam.d/ 里边的与程序同名的文件,即PAM 会搜寻/etc/pam.d/passwd 这个设置文件 ; 
3、根据/etc/pam.d/passwd 中的设定,会调用PAM 所提供的相关模块(位于/lib64/security)来进行验证,在/etc/pam.d/passwd 文件中会定义要调用哪个pam 的相关模块文件 ; 
4、将验证结果回传给passwd 这个程序,而passwd 这个程序会根据PAM 回传的结果决定下一个动作(重新输入密码或者通过验证)。

pam 相关文件说明

/lib64/security/*.so

pam 模块的动态链接库.

/etc/security

环境相关的设置的配置文件 : pam 使用的动态库文件对应使用的配置文件.

/etc/pam.conf

主配置文件 : 默认不存在 #不推荐直接修改其主配置文件,所以默认不存在.

/etc/pam.d/APP_NAME

对于使用 PAM 的各项服务,目录中都有一个对应的文件,其中包含应当如何获取该服务的验证及帐户信息的规则或说明。用户也可根据需要在此目录下定义自己想要针对的某程序的pam 的配置文件.

注: 如果/etc/pam.d存在,/etc/pam.conf将失效

应用程序的pam 模块文件说明–/etc/pam.d/APP_NAME

每行定义一种检查规则 
格式 :type control module——path module-arguments

1、type :pam 模块是按模块类型归类的。pam 模块主要有4类 :

  • auth 验证模块 。与账号认证和授权相关的检查;

  • account 帐户管理模块。将执行与账号管理相关非认证功能,例如是否为有效账号,有效期限、限制用户的访问时间等;

  • password 密码管理模块。执行与密码更改/更新有关的操作。

  • session 会话管理模块。用于初始化和终止会话,以及一些附加性操作,如,记录打开/关闭数据的信息,监视目录等

2、control :同一种功能的多个检查之间如何进行组合。如auth功能的第一个检查完成之后,第二个怎么办等。PAM库如何处理与该服务相关的PAM模块成功或失败情况。有两种机制 : 简单和复杂。这里只说明简单机制(使用一个关键词来定义)。

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

  • sufficient 
    “一票通过”,表明本模块返回成功则通过身份认证的要求,且通过同一type 内的模块,则不必再执行同一type内的其它模块,而是去执行下一个模块。但如果本模块返回失败则可忽略;

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

  • include 
    用其他的配置文件中定义的配置信息;

  • requisite 
    一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。

3、 module——path

调用的模块文件的路径位置

4、module-arguments

模块参数 (一般不会用到)

常用pam 模块示例

1、pam_securetty.so

  • 功能 
    只允许root用户在 /etc/securetty 列出的安全终端上登录, /etc/securetty 文件里面定义了用户可登录的终端名

  • 注意 
    /etc/securtty 在此文件中定义的终端是允许root 登录的,ssh 登录是不受此文件定义的终端限制的,但是诸如telnet 是受限制的,而且telnet 默认是不允许使用root登录的

2、pam_time 认证模块

  • 功能 
    对用户访问服务提供时间控制,即控制用户能够访问服务的时间

  • 配置文件 
    /etc/security/time.conf 
    主要设置 : services;ttys;users;times

  • 示例 
    只允许 centos 这个用户在工作时间通过ssh 远程连接到本机

vim /etc/security/time.conf 
ssh ;IP ;centos ;Wd0000-24000

3、pam_nologin.so

  • 功能 
    1、如果/etc/nologin 文件存在,将导致非root 用户不能登录,且如果/etc/nologin 文件里面存在一些内容时,则非root用户被拒绝时,还会显示文件里面的内容。su 可以登录; 
    2、如果用户shell 是/sbin/nologin 时,当该用户登录时,会被拒绝登录;

4、模块 :pam_limit.so

  • 功能 
    在用户级别实现对其可使用的资源的限制,例如: 可打开的文件的数量,可运行的进程的数量,可用内存空间

  • 限制用户可使用的资源的方式:2种 
    1、ulimit 命令 :立即生效,但无法保存

-n # 最多的打开的文件的描述符的个数,例如可通过此限制其他主机对本机httpd 的压力测试 
-u # 最大用户进程数,针对所有用户。只能调小,不能调大 
-S # 使用的(软)资源限制 
-H # 使用的(硬)资源限制 
-a # 列出所有的限制值

2、修改配置文件 
/etc/security/limits.conf 
/etc/security/limits.d/*.conf #limit 通过专门的配置文件来进行设置

  • 格式 
    < domain> < type> < item> < value>

1、< domain> : 应用于哪些对象

  • username : 指明某单个用户

  • @group : 某组内所用用户

  • * : 所有用户

2、< type> : 限制的类型

  • Soft : 软限制,普通用户自己可以修改

  • Hard 硬限制,由root用户设定,且通过kernel强制生效

  • - 二者同时限定

3、< item> : 限制哪些资源

  • nofile :所能够同时打开的最大文件数量,默认为1024

  • nproc 所能够同时运行的进程的最大数量,默认为1024

  • rss 实际分配给进程的物理内存

  • maxlogin 某用户的最多登录次数

4、< value> 指定具体值

  • 示例 
    apache 用户可打开10240 个文件;student 用户不能运行超过20个进程

vim /etc/security/limits.conf 
apache - nofile 1024 
student hard nproc 20

4、模块 :pam_shells

  • 功能 
    检查有效的shell ,仅允许在/etc/shells 中列出的sehll 登录

  • 示例 
    禁止shell 类型为csh 的用户使用ssh 或者su 进行登录

vim /etc/pam.d/login 
auth required pam_shells.so 
或者 
vim /etc/pam.d/su 
auth required pam_shells.so 
vim /etc/shells 
注释掉此文件里面的/bin/csh


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章