PAM介绍

1 篇文章 0 订阅

PAM

概述

在linux中进行身份或者状态的验证程序是由PAM进行的,PAM是可动态加载验证模块,由于可以按需要动态的对验证的内容进行变更,因此可以大大提高验证的灵活性。
PAM使用/etc/pam.d/目录下的文件来管理对程序的认证方式,调用相应的配置文件,从而调用本地的认证模块(认证模块存放在/lib64/security)。
pam主要由动态库与配置文件构成:

  • 动态库
    库文件(认证模块)存放在目录/lib64/security下。
  • 配置文件
    /etc/pam.d/目录中定义了各种 程序和服务 的PAM配置文件,如其中system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它(该文件是system-auth-ac的软链接)。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而模块文件则主要存放于/lib64/security/中。

判断一个程序是否使用了pam认证:

ldd /usr/sbin/sshd | grep pam

配置文件内容解析

sshd服务的配置文件如下:

[root@localhost loongson]# cat /etc/pam.d/sshd 
#%PAM-1.0
auth	   required	pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

内容分为四列:
第一列:模块类型
第二列:控制标记
第三列:模块路径
第四列:模块参数

  1. 模块类型
    linux-PAM有四种模块类型:认证管理(auth)、帐号管理(account)、会话管理(session)和密码管理(password)。
    一个类型可能有多行,它们按顺序依次由PAM模块调用。
  • auth
    用来对用户的身份进行验证,比如:提示用户输入密码或判断用户是否为root等
    表示鉴别类接口模块类型用于检查用户和密码,并分配权限;
    这种类型的模块为用户验证提供两方面服务。让应用程序提示用户输入密码或者其他标记,确认用户合法性;通过他的凭证许可权限,设定组成员关系或者其他优先权。
  • account
    对帐号的各项属性进行检查,比如:是否允许登录、是否达到最大用户数、root是否允许在这个终端进行登录等
    表示账户类接口,主要负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等;
    这种模块执行的是基于非验证的帐号管理。他主要用于限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以多少用户),限制用户位置(例如:root只能通过控制台登录)。
    多数情况下auth和account会一起用来对用户登录和使用服务的情况进行限制。这样的限制会更加完整。比如下面是一个具体的例子:login是一个应用程序。Login要完成两件工作——首先查询用户,然后为用户提供所需的服务,例如提供一个shell程序。通常Login要求用户输入名称和密码进行验证。当用户名输入的时候,系统自然会去比对该用户是否是一个合法用户,是否在存在于本地或者远程的用户数据库中。如果该账号确实存在,那么是否过期。这些个工作是由account接口来负责。
    如果用户满足上述登录的前提条件,那么它是否具有可登录系统的口令,口令是否过期等。这个工作就要由auth接口来负责了,他通常会将用户口令信息加密并提供给本地(/etc/shadow)或者远程的(ldap,kerberos等)口令验证方式进行验证。
    如果用户能够登录成功,证明auth和account的工作已经完成。但整个验证过程并没有完全结束。因为还有一些其他的问题没有得到确认。例如,用户能够在服务器上同时开启多少个窗口登录,用户可以在登录之后使用多少终端多长时间,用户能够访问哪些资源和不能访问哪些资源等等。也就是说登录之后的后续验证和环境定义等还需要其他的接口。即session和password接口。
  • session
    用来定义用户登录前以及用户退出后所要进行的操作,比如:登录链接信息、用户数据的打开与关闭、挂载文件系统等。
    会话类接口。实现从用户登录成功到退出的会话控制;
    处理为用户提供服务之前/后需要做的些事情。包括:开启/关闭交换数据的信息,监视目录等,设置用户会话环境等。也就是说这是在系统正式进行服务提供之前的最后一道关口。
  • password
    使用用户信息来更新,比如:修改用户密码。
    口令类接口。控制用户更改密码的全过程。也就是有些资料所说的升级用户验证标记。

接口在使用的时候,每行只能指定一种接口类型,如果程序需要多种接口的话,可在多行中分别予以规定。

  1. 控制标记
    控制标记分为五种:required、requisite、sufficient、optional、include
    PAM使用控制标记来处理和判断各个模块的返回值
  • required
    表示即使某个模块对用户的验证失败,也要等所有的模块执行完后,PAM才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝,如果对用户验证成功,所有的模块都会返回成功信息。
  • requisite
    与required相似,但是如果requisite返回失败,则立刻向应用程序返回失败,表示此类型失败,不再进行同类型后面的操作。
  • sufficient
    表示如果一个用户如果通过这个模块的验证,PAM结构就立刻返回验证成功信息(即使前面有模块fail了,也会忽略掉fail信息)把控制权交回应用程序,后面的层叠模块即使使用requisite或者required控制标记,也不再执行。如果验证失败,sufficient的作用和optional一样。
  • optional
    表示即使本行指定的模块验证失败,也允许用户接受应用程序提供的服务,一般返回PAM_IGNORE
  • include
    include与模块结果的处理方式无关。该标志用于直接引用其他PAM模块的配置参数
    表示在验证过程中调用其他的PAM配置文件,在RHEL中有相当多的应用通过完整调用/etc/pam.d/system-auth来实现认证而不需要重新逐一去写配置项。这也就意味着很多时候用户只要能登录系统,针对大多数的应用程序也能同时通过认证。
  1. 模块路径
    即要掉用模块的位置,如果是64位系统,一般保存在/lib64/security,同一模块可以出现在不同的类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型,编制了不同的执行函数。

  2. 模块参数
    即传递给模块的参数,参数可以有多个,参数之间使用空格分隔。

参数作用
authtok_type=xxx用户密码修改的提示语,默认为空
retry=N密码尝试错误N次禁止登录,默认为1
difok=N新旧密码不得有N个字符重复,默认为5
difignore=N字符数达到N个后,忽略difok,默认为23
minlen=N密码长度不得少于N位
dcredit=N至少包含N个数字
ucredit=N至少包含N个大写字母
lcredit=N至少包含N个小写字母
ocredit=N至少包含N个特殊字母
minclass=N至少包含N种字符类型
maxrepeat=N不能包含N个连续的字符
reject_username不能包含用户名
use_authtok强制使用之前的密码,即不允许用户修改密码
dictpath=/path/to/dict指定cracklib模块的路径

以上参数仅对非root用户生效,如果想对root用户生效,需要加入参数enforce_for_root

chpasswd和passwd的区别:

[root@localhost loongson]# ldd /usr/sbin/chpasswd | grep pam
[root@localhost loongson]# ldd /usr/bin/passwd | grep pam
	libpam.so.0 => /lib64/libpam.so.0 (0x000000ffeaa08000)
	libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x000000ffea9f4000)

chpasswd并未使用pam认证机制,所以在passwd不能修改密码的时候,可以使用chpasswd进行密码的修改。
chpasswd使用的加密算法可以通过选项进行控制,默认是使用SHA-512算法

PAM工作原理和验证机制流程

以RHEL系统为例,当pam安装之后有两大部分:在/lib/security目录下的各种pam模块以及/etc/pam.d和/etc/pam.d目录下的针对各种服务和应用已经定义好的pam配置文件。当某一个有认证需求的应用程序需要验证的时候,一般在应用程序中就会定义负责对其认证的PAM配置文件。以vsftpd为例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有这样一行定义:

pam_service_name=vsftpd

表示登录FTP服务器的时候进行认证是根据/etc/pam.d/vsfatpd文件定义的内容进行认证等操作。

system-auth是一个非常重要的pam配置文件,主要负责用户登录系统的认证工作。而且该文件不仅仅只是负责用户登录系统认证,其它的程序和服务通过include接口也可以调用到它,从而节省了很多重新自定义配置的工作。所以应该说该文件是系统安全的总开关和核心的pam配置文件。
system-auth文件解析:

[root@localhost loongson]# 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        sufficient    pam_fprintd.so
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
[root@localhost loongson]# 

第一部分 表示,当用户登录的时候,首先会通过auth类接口对用户身份进行识别和密码认证。所以在该过程中验证会经过几个带auth的配置项。

其中的第一步是通过pam_env.so模块来定义用户登录之后的环境变量, pam_env.so允许设置和更改用户登录时候的环境变量,默认情况下,若没有特别指定配置文件,将依据/etc/security/pam_env.conf进行用户登录之后环境变量的设置。

然后通过pam_unix.so模块来提示用户输入密码,并将用户密码与/etc/shadow中记录的密码信息进行对比,如果密码比对结果正确则允许用户登录,而且该配置项的使用的是“sufficient”控制位,即表示只要该配置项的验证通过,用户即可完全通过认证而不用再去走下面的认证项。不过在特殊情况下,用户允许使用空密码登录系统,例如当将某个用户在/etc/shadow中的密码字段删除之后,该用户可以只输入用户名直接登录系统。

下面的配置项中,通过pam_succeed_if.so对用户的登录条件做一些限制,表示允许uid大于500的用户在通过密码验证的情况下登录,在Linux系统中,一般系统用户的uid都在500之内,所以该项即表示允许使用useradd命令以及默认选项建立的普通用户直接由本地控制台登录系统。

最后通过pam_deny.so模块对所有不满足上述任意条件的登录请求直接拒绝,pam_deny.so是一个特殊的模块,该模块返回值永远为否,类似于大多数安全机制的配置准则,在所有认证规则走完之后,对不匹配任何规则的请求直接拒绝。

第二部分 的三个配置项主要表示通过account账户类接口来识别账户的合法性以及登录权限。

第一行仍然使用pam_unix.so模块来声明用户需要通过密码认证。第二行承认了系统中uid小于500的系统用户的合法性。之后对所有类型的用户登录请求都开放控制台。

第三部分 会通过password口另类接口来确认用户使用的密码或者口令的合法性。第一行配置项表示需要的情况下将调用pam_cracklib来验证用户密码复杂度。如果用户输入密码不满足复杂度要求或者密码错,最多将在三次这种错误之后直接返回密码错误的提示,否则期间任何一次正确的密码验证都允许登录。需要指出的是,pam_cracklib.so是一个常用的控制密码复杂度的pam模块,关于其用法举例我们会在之后详细介绍。之后带pam_unix.so和pam_deny.so的两行配置项的意思与之前类似。都表示需要通过密码认证并对不符合上述任何配置项要求的登录请求直接予以拒绝。不过用户如果执行的操作是单纯的登录,则这部分配置是不起作用的。

第四部分 主要将通过session会话类接口为用户初始化会话连接。其中几个比较重要的地方包括,使用pam_keyinit.so表示当用户登录的时候为其建立相应的密钥环,并在用户登出的时候予以撤销。不过该行配置的控制位使用的是optional,表示这并非必要条件。之后通过pam_limits.so限制用户登录时的会话连接资源,相关pam_limit.so配置文件是/etc/security/limits.conf,默认情况下对每个登录用户都没有限制。关于该模块的配置方法在后面也会详细介绍。

常用的PAM模块

  1. pam_unix.so
    auth 提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0
    account 检查用户的账号信息(包括是否过期等).帐号可用时,返回0.
    password 修改用户的密码. 将用户输入的密码,作为用户的新密码更新shadow文件
  2. pam_shells.so
    auth / account 如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell
  3. pam_deny.so
    account / auth / password / session 该模块可用于拒绝访问
  4. pam_permit.so
    auth / account / password / session 模块任何时候都返回成功.
  5. pam_securetty.so
    auth 如果用户要以root登录时,则登录的tty必须在/etc/securetty之中.
  6. pam_listfile.so
    auth / account / password / session 访问应用程的控制开关
  7. pam_cracklib.so
    password 这个模块可以插入到一个程序的密码栈中,用于检查密码的强度.
  8. pam_limits.so
    session 定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定

常用的PAM模块使用说明

  1. pam_access.so模块
    pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。pam_access.so模块的具体工作行为根据配置文件/etc/security/access.conf来决定。该配置文件的主体包含了三个字段——权限、用户和访问发起方。格式上是一个用"“隔开的表。
    第一个字段:权限(permission),使用”+“表示授予权限,用”-“表示禁止权限。
    第二个字段:用户(user),定义了用户、组以及用”@"表示的在不同主机上的同名用户和同一主机上不同名用户。
    第三个字段:访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。
    而且/etc/security/access.conf文件提供了很多范例供修改时参考,并且都给出了具体的说明,例如:
#禁止非root用户通过tty1访问相关服务
#-:ALL EXCEPT root:tty1
 
#禁止除了wheel、shutdown以及sync之外的所有用户访问相关服务
#-:ALL EXCEPT wheel shutdown sync:LOCAL
 
#禁止wheel用户通过.win.tue.nl之外的其它它终端访问相关服务
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl
  1. pam_limits.so模块
    pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用情况。缺省情况下该模块的配置文件是/etc/security/limits.conf。而该配置文件的基本格式实际上是由4个字段组成的表,其中具体限制的内容包括:
Domain            type            item                                     value
用户名/组名       软/硬限制                                                   具体值
                                core——core文件大小 (KB)
                                data——最大数据大小(KB)
                                fsize——最大文件大小(KB)
                                memlock——最大可用内存空间(KB)
                                nofile——最大可以打开的文件数量
                                rss——最大可驻留空间(KB)
                                stack——最大堆栈空间(KB)
                                cpu——最大CPU使用时间(MIN)
                                nproc——最大运行进程数
                                as——地址空间限制
                                maxlogins——用户可以登录到系统最多次数
                                locks——最大锁定文件数目

需要注意的是,如果没有任何限制可以使用"-"号,并且针对用户限制的优先级一般要比针对组限制的优先级更高。使用pam_limits.so模块的最常见的场景是在运行Oracle数据库的RHEL服务器中,因为一般Oracle数据库在安装之前,按照其官方文档的说明需要先对某些用户(Oracle)使用系统资源的情况进行限制。所以我们总是能够在Oracle数据库服务器的/etc/security/limits.conf文件中看到类似这样的配置:

[root@centos6-test06 ~]# vim /etc/security/limits.conf
.......
oracle           soft    nproc   2047
oracle           hard    nproc   16384
oracle           soft    nofile  1024
oracle           hard    nofile  65536

结合上面的配置文件说明,可知Oracle数据库需要对Oracle用户使用资源的情况进行一些限制,包括: oracle用户最大能开启的进程数不超过16384,最大能打开的文件数不超过65536。

至于soft和hard的区别,不同于磁盘配额中的软限制和硬限制。普通用户可以调整自己的soft limit但最高不能超过hard limit,而且除了root以外的普通用户也不能够随意更改hard limit。该调整完成之后一般可以使用ulimit命令查看。

顺便提一下,针对nofile,这个只是基于用户层面的限制和调整方法。基于系统层面的限制和调整方法是修改/etc/sysctl.conf文件,直接改fs.file-max参数,调整之后sysctl –p生效。

  1. pam_rootok.so模块
    一般情况下,pam_rootok.so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。pam_rootok.so模块的一个典型应用是插入到一些应用程序的认证配置文件中,当root用户执行这些命令的时候可以不用输入口令而直接通过认证。比如说"su"命令,为什么当以root用户执行"su"切换到普通用户身份的时候是不需要输入任何口令而可以直接切换过去?当我们查看一下/etc/pam.d/su文件的内容就不会奇怪了。因为该文件的第一行就是:
[root@centos6-test06 ~]# cat /etc/pam.d/su
......
auth        sufficient  pam_rootok.so

其实很多PAM模块对root用户是不会产生限制的。
更多PAM模块可以参考链接:https://www.cnblogs.com/kevingrace/p/8671964.html

其他参考链接:https://www.cnblogs.com/marility/articles/9235522.html

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值