Linux-PAM认证模块

linux系统管理 struggling 1493次浏览 0个评论

1,PAM简介

可插入认证模块(Pluggable Authentication Modules,简称PAM)是基于模块化设计、具有可插入功能的一种独立于应用程序之外的验证方式,它是基于一堆模块组合起来的一个认证框架。使用PAM后,应用程序可以不需要集成验证功能,而由PAM来完成。PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。在过去,不同的服务常常得使用不同的机制来判断账号口令, 所以一个服务器上面拥有多个各别的认证系统,造成账号口令可能不同步,为了解决这个问题因此才有了 PAM!

PAM认证方式:

QQ图片20150723235002

2,PAM 配置文件语法

<code>
module-type     control-flag     module_path      optional
</code>

在/etc/pam.d/下的文件中,与服务名称相对应的文件,为该服务的pam验证文件,例如服务为sshd,则在/etc/pam.d下存在 sshd这个文件,里面包含sshd验证规则。其中有个一特殊的文件为other,如果有的服务与之没有向对应的文件,则对应other。

module-type

服务类型,即 auth、account、session 或 password。

验证模块(auth)用于验证用户或设置/销毁凭证。

帐户管理模块(account)将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作。

会话管理模块(session)用于初始化和终止会话。

密码管理模块(passwd)将执行与密码更改/更新有关的操作。

control-flag

用于指明在确定服务的集成成败值过程中模块所起的作用。有效的控制标志包括 include、optional、required、requisite 和 sufficient。

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

requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必要条件。

sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。

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

控制值               模块执行结果                 动作                        最终结果

requisite                   成功               继续检查下一个            取决于其他模块

————————–> 失败                                                          失败

required                    成功               继续检查下一个            取决于其他模块

————————–> 失败                   Stop                                失败

sufficient                    成功                  Stop                                成功

————————–> 失败               继续检查下一个             取决于其他模块

optional                     成功              继续检查下一个              取决于其他模块

————————–> 失败

include                       无关              执行包含文件中的验证    取决于其他模块

module-path:用于实现服务的库对象的路径,一般都只写库名,库的路径一般为/lib/security(32位),/lib64/security(64位),它们都是以“.so”为后缀的文件。

module-options:传递给服务模块的选项,可选。

几个公用的参数:

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

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

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

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

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

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

3,常用PAM模块

如果想查看某个程序是否支持PAM认证,可以用ldd命令进行检查:

例如:查看sshd是不是支持PAM模块认证:

<code>
[root@mail pam.d]# ldd `which sshd` |grep  pam
	libpam.so.0 => /lib/libpam.so.0 (0x006d1000)
</code>

由于在程序模块里链接了libpam.so.0 =< /lib/libpam.so.0 ,说明此程序可以进行PAM认证。

每个PAM验证模块的使用对象,总是与PAM的验证类型相对应的。有些验证模块只针对某一种验证方法,例如pam_access.so验证模块只与account验证类型配套使用,而有些验证模块却可以与所有的验证类型一起使用,例如pam_unix.so验证模块。你在了解这些验证模块时,应当同时了解它们的所属于验证类别。

下面是一些常用的验证模块的简要说明:

(1)pam_access验证模块

pam_access验证模块一般与account验证类型一同使用。它主要用于对访问进入管理,提供基于登录名、主机名或域名、公网IP地址或网络号,以及非网络登录时的tty名称的访问控制。pam_access验证模块主要是根据/etc/security/access.conf配置文件中的内容,来进行相应的验证工作的。如果access.conf文件不在缺省的/etc/security/目录,你可以在其后使用accessfile参数指定自定义配置文件的绝对路径。

/etc/security/access.conf配置文件中的每一行都由如下三个字段构成,中间用冒号隔开:

<code>
  permission:users/groups:origins
</code>

permission(权限)字段可以用“+”,即允许访问,“-”禁止访问来表示相应的权限。

users/groups(用户或组)字段可以是一个或几个登录名、组名及ALL(表示任何人)的一个清单。要区分哪个是用户名,哪个是组名,可以将组名加入到一个括号中,例如(groups)。

origins(来源)字段可以是非网络登录时的tty名称、主机名、域名(以“.”开始)、主机地址、网络号(以“.”结束)、带有子网掩码的公网IP地址,以及ALL(表示任何主机)和LOCAL只要不包含“.”的所有字符)。还可以使用EXCEPT操作符来表示除…之外。

(2)pam_cracklib验证模块

pam_cracklib验证模块通常只与password验证类型一起使用。这个验证模块可以通过插入password堆栈,为特殊的应用提供可插入式密码强度性检测。它的工作方式就是先提示用户输入密码,然后使用一个系统字典和一套规则来检测输入的密码是否不能满足强壮性要求。密码的强度检测分二次进行,第一次只是检测密码是否是提供的对比字典中的一部分,如果检测结果是否定的,那么就会提供一些附加的检测来进一步检测其强度,例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写状况,以及是否使用了特殊字符等等。

由于pam_cracklib验证模块提供了细致的密码强度检测,因此,当我们在使用时,必需为它指定相应的额外检测选项。这些选项包括:

debug:此选项表示将模块信息写入系统日志

type=xxx:此选项用来修改缺省的密码提示文本,例如,如果缺省提示输入密码的文本为“New Passwork:”,那么你就可以通过设置type=my password:来改变提示文本。

retry=N:此选项定义用户在重试输入多少次密码后,返回一个错误信息,然后不准继续输入。缺省是1次。

difok=N:此选项用来定义新密码中必须有几个字符要与旧密码不同,如果新密码中有1/2以上的字符与旧密码不同时,该新密码就会被接受。

difignore=N:此选项用来设定在difok之前收到多少个字符时,difok设置会被忽略,缺省为23。

minlen=N:此选项用来设置新密码的最小长度。

dcredit=N:此选项用来设定新密码中可以包含数字的最大数目。

ucredit=N:此选项用来设定新密码中可以包含的大写字母的最大数目。

lcredit=N:此选项用来设定新密码中可以包含的小写字母的最大数目。

ocredit=N:此选项用来设定新密码中可以包含的特殊字符的最大数目。

minclass=N:此选项用来规定新密码中的字符类别的最小数目,字符一般有四种类别:数字、大写字母、小写字母,以及特殊字符。

use_authtok:在某个与密码相关的验证模块后使用此选项,例如pam_unix.so验证模块,可以强迫此模块不提示输入密码,而使用上面设置的另一种方式,例如pam_cracklib.so。

dictpath=/path/to/dict:指定cracklib目录路径。

(3)pam_limit验证模块

pam_limits验证模块通常与session验证类别一同使用。它主要用来限制用户在会话过程中对系统资源的使用,即使UID=0的用户也受它的限制。此模块使用一个独立的配置文件来设置对系统资源的限制情况,默认的配置文件是/etc/security/limits.conf,在使用中可以用conf选项来指定配置文件所在的位置。当你使用pam_limits验证模块时,先对此配置文件进行相应的设置总是一个不错的选择。

/etc/security/limits.conf配置文件的设置语法如下:

 

配置文件语法格式中的“domain”列可以是用户名、采用@group语法的组名,还可以用通配符“*”来表示任何用户,以及使用“%”通配符来只限制maxlogins,并可以采用%group的语法格式。

配置文件语法格式中的“type”列有两个值:

soft:用来设置对系统资源的软限制,它允许用户所使用的系统资源可以在设定的硬限制值的规定范围来上下浮动。

hard:用来设置对系统资源的硬限制,这些硬限制由超级用户设置,并由系统内核来执行。普通用户对系统资源的使用率不能超过设置的硬限制设定值。

配置文件语法格式中的“item”和“value”是成对使用的,“item”表示某类具体的系统资源,而“value”就是“item”的值。在limits.conf配置文件中可以设置的系统资源有:

core: 核心文件的大小 (KB)

data: 最大的数据包大小(KB)

fsize: 最大的文件大小(KB)

memlock: 最大可用的内存空间(KB)

nofile: 最大可以打开的文件数量

rss: 最大的可驻留空间(KB)

stack: 最大的堆栈空间(KB)

cpu: 最大的CPU占用时间(minutes)

nproc: 最大允许运行的进程数量

as: 地址空间限制(KB)

maxlogins: 用户可以登录到系统的最多次数,UID=0的用户除外

priority: 优先运行的用户进程(负值越高的进程优先)

sigpending: 最大数量的等待信号(Linux2.6及以上内核)

msqqueue: POSIX信息队列的最大可使用的内存(bytes)(Linux2.6及以上内核)

locks: 最大可锁定文件的数目(Linux2.4及以上内核的系统)

上面这些“item”项目是一些对系统资源使用情况非常有用的,新版本的PAM中还新加入了其它一些项目,你可以通过它的帮助文档得到它们的说明。需要注意的是,用户的限制优先级要高于组的限制,如果你为一个组设置了某种系统资源限制,但是其中的某个用户设置了另一级别的系统资源限制,那么,系统将会优先按用户级别的限制处理。另外,如果无限制可以使用“-”号表示。
优先级高。

(4)pam_time验证模块

pam_time验证模块通常与account验证类型一起使用。它并不对用户提供验证服务,而是用来限制用户在指定的日期、时间及终端线路上对系统或特定应用程序进行访问。

要正确使用Pam_time验证模块,必需有一个正确的/etc/security/time.conf相配套。此配置文件中每一行的语法格式为:

<code>
services;ttys;users;times
</code>

services字段:表示应用PAM功能的服务名称。

ttys字段:应用此规则的终端名,可以“*”号表示任何终端,“!”表示非。

users字段:应用此规则的用户名单或网络组名,可以“*”号表示任何用户,“!”表示非。

times字段:指定时间,通常使用日期/时间范围的格式来表示。可以用星期几英文单词前两个字母来表示具体的日期,例如MoTuSa就是指星期一星期二和星期六。注意:重复的日期将会被取消,比如MoMo表示任何一天都没有。两个字母的组合有: Mo、Tu、We、Th、Fr、Sa、Su、Wk、Wd、Al, Mo到Su分别指从星期一到星期天,Wk指每一天,Wd指周末,Al也指每一天,例如AlFr指除星期五外的每一天。 时间采用24小时制,即HHMM(时分)的形式。日期/时间范围前可有“!”表表除此以外的所有日期/时间,用“-”连接指定的时间范围,如果结束时间小于开始时间,就表明时间持续到第二天的结束时间,例如Al1800-0800就是指每天下午6点整到第二天的早晨8点整。

(5)pam_listfile验证模块

pam_listfile验证模块通常与auth验证类型一起使用。此模块提供根据某个指定的文件来允许或禁止用户访问某个应用程序或服务的功能,这些被指定的文件必需事先存在,然后通过file参数来指定该文件。pam_listfile验证模块可以根据用户名、tty、rhost、ruser、用户组、使用的shell来对用户进行访问控制。

Pam_listfile验证模块可以使用的选项有:

item=[tty|user|rhost|ruser|group|shell]:设置访问控制的对象类型。

sense=allow|deny:用来指定当在保存“item”对象的文件中找不到item指定的对象时的动作方式,如果在文件中找不到相应的对象,则执行相反的动作。

onerr=succeed|fail:用来指定当某类事件(如无法打开配置文件)发生时的返回值。

file=filename:指定保存有“item”对象的文件位置。

apply=[user|@group]:用指定使用非用户和组类别时,这些规则所适用的对象。当item=[user|ruser|group]时,这个选项没有任何意义,只有当item=[tty|rhost|shell]时才有意思。

(6)pam_unix验证模块

pam_unix提供基于/etc/passwd 和 /etc/shadow文件的类UNIX风格的认证。它适用所有的验证类型,包括:auth、account、 password、session。

当pam_unix验证模块与auth验证类型一起使用时,此模块可以使用的选项有debug、audit、use_first_pass、try_first_pass、nullok和nodelay,主要功能是验证用户密码的有效性,在缺省情况下(即不带任何参数时),该模块的主要功能是禁止密码为空的用户提供服务;
在作为account类型使用时,此时该模块可识别的参数有debug、audit,该模块主要执行建立用户帐号和密码状态的任务,然后执行提示用户修改密码,用户采用新密码后才提供服务之类的任务;

在作为password类型使用时,此时该模块可识别的参数有debug、 audit、 nullok;、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis、

remember,该模块完成让用户更改密码的任务;

在作为session类型使用时,此时该模块没有可识别的参数,该模块仅仅完成记录用户名和服务名到日志文件的工作。

Pam_unix验证模块可以使用的选项有:

debug:将调试信息写入系统日志,当pam_unix验证模块与所有验证类别使用时都有效。

audit:提供比debug更多诊断调试,它只有当pam_unix验证模块与 auth、account及password验证类型使用时有效。

nullok:默认情况下,如果密码为空,那么就不允许用户访某项服务,而使用此项后将则覆盖这个默认动作。它只有当pam_unix验证模块与 auth、和password验证类型使用时有效。
nodelay:当用户验证失败后,系统在给出错误信息时会有一个延迟,默认为2秒钟。当使用此选项后,将取消这个延迟。它只有当pam_unix验证模块与 auth验证类型使用时有效。

try_first_pass:当pam_unix验证模块与auth验证类型一起使用时,使用该选项将在提示用户输入密码前,尝试使用以往的密码验证方式来对用户进行验证。而当pam_unix验证模块与password验证类型一起使用时,该选项主要用来防止用户新设定的密码与以前的旧密码相同。

use_first_pass:当pam_unix验证模块与auth验证类型一起使用时,使用该选项将在提示用户输入密码前,直接使用以往的密码验证方式来对用户进行验证。而当pam_unix验证模块与password验证类型一起使用时,该选项主要用来防止用户新设定的密码与前面password提供的密码相同。
use_authok:当用户修改时,使用此选项强制用户使用前面堆叠验证模块提供的密码,例如由pam_cracklib验证模块提供的新密码。当pam_unix验证模块与password验证类型一起使用时有效。

md5:采用md5对用户密码进行加密, 当pam_unix验证模块与password验证类型一起使用时有效。

shadow:使用用shadow密码,当pam_unix验证模块与password验证类型一起使用时有效。

sha256:使用此选项,当下次修改密码时将用SHA256算法加密,如果SHA256的libcrypt不存在,就会重新使用MD5加密密码。Sha512与此选项相同,只是加密强大不同而已。当pam_unix验证模块与password验证类型一起使用时有效。

rounds=n:用来指定使用SHA256和SHA512算法加密密码时重复哈希算法的次数。当pam_unix验证模块与password验证类型一起使用时有效。

remember=n:使用此选项将会将n个使用过的旧密码,以MD5的方式加密后保存到/etc/security/opasswd文件中。当pam_unix验证模块与password验证类型一起使用时有效。

(7)pam_deny验证模块可以用来禁止所有的访问,当你设置PAM配置文件时,为了安全,在开始的行可以使用它来禁止所有的访问,以减少错误配置引起的安全风险。而pam_permit验证模块却总是允许所有的访问,你要谨慎的使用此验证模块。它们都适用于所有的验证类型。

(8)pam_rootok验证模块允许/etc/pam.d/su中的用户不需要任何验证就可以登录系统。因此,你应当小心设置/etc/pam.d/su文件,并且在使用时要与pam_wheel验证模块一同使用,以保证root权限只允许在pam_wheel的限制中进行。它只适用于auth验证类型。

(9)pam_security验证模块只对root用户有影响。当root用户登录时,pam_security验证模块会参考/etc/securetty目录中的控制终端列表,来保证root用户不会从不安全的终端登录。它一般与auth验证类型一现使用。

(10)pam_nologin验证模块,如果/etc/nologin文件存在,此模块将禁止所有的登录。它一般与auth和account验证类型一同使用。

(11)pam_echo验证模块用来给用户显示通过file选项指定的文件中的内容,它适用于所有的验证类型。pam_motd验证模块允将/etc/motd文件中的内容显示给用户,它只适用于session验证类型。

(12)pam_lastlog显示用户上次登录的日期和时间,它主要通过读取/var/log/lastlog文件来显示。它只适用与session验证类型。

(13)pam_warn将刚登录的信息记录到系统日志当中,它一般与auth和password验证类型一同使用。

(15)pam_wheel验证模块,当使用此验证模块后,只有加入到了一个wheel group中的的根用户,并且提交的密码有效,才能访问指定的服务或系统。将它与pam_rootok一同使用能增加对根用户的限制。它只适用于auth和account验证类型。

更多模块请查看此书中的内容 Linux-PAM_SAG.pdf





DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址