linux中PAM的配置和使用方法
(2014-12-17 12:38:16
可插入认证模块(简称PAM)是基于模块化设计、具有可插入功能的一种独立于应用程序之外的验证方式。使用PAM后,应用程序可以不需要集成验证功能,而由PAM来完成。例如,在Linux系统中,Login服务为用户提供系统登录服务,它提示用户输入相应的用户名和密码来验证用户的有效性,当使用PAM后,这个验证过程可以由PAM来代替。PAM具有很大的灵活性,系统管理员可以通过它为应用程序自由选择需要使用的验证方式。鉴于PAM有这么多优点,在本文中,将以RedHat企业Linux3为应用平台,来讨论如何使用PAM来增强Linux服务器的安全性能。
当LINUX服务器中的某个应用程序或服务需要使用PAM来进行验证时,只要此应用程序或服务支持PAM验证功能,就可以通过修改其相应的PAM配置文件,加放相应的验证方式,当重新启用些服务或应用程序时,PAM模块就会通过其专用API来读取它的配置文件,根据配置文件中的内容来提供相应的验证功能。所有验证功能都是通过一些库文件来提供的。
因此,在使用PAM之前,先掌握PAM配置文件的设置方法,了解一些常用的验证模块就显得非常必要。
当某个支持PAM验证的应用程序启动时,就会通过PAM的API读取它的PAM配置文件,然后根据配置文件中验证项指定的内容,再由API调用所需的验证模块来完成配置文件中指定的验证任务。从这里可以看出,要掌握PAM的使用,就必需了解配置文件的配置规则,以及各种验证模块的意义和作用。
在这里还要注意的是,一个Linux系统下的应用程序能够使用PAM功能,最关键的是它已经将支持PAM功能的代码集成到了原代码当中。如果你能够得到一个应用程序的原代码,你也可以自行将支持PAM的功能代码加入其中。但是,如果你得到的二进制文件不具有这些PAM功能代码,那么,此应用程序就不支持PAM验证功能。查看应用程序是否具有PAM验证功能,可以使用ldd命令查看其动态连接库中有没有libpam和libpam_misc,有就支持。
1、设置PAM的配置文件
在RedHat企业Linux3系统中,每个支持PAM验证的应用程序或服务,都有一个相应的PAM配置文件,存放在/etc/pam.d/目录。要想这些配置文件有效,就必需将这些配置文件名字编写进程序源代码中。通常,这些配置文件的名字与其对应的应用程序的名字是一样的。
要想设置这些配置文件,只需要通过VI或VIM来打开它们,然后添加或删除其中的验证项就可以。
打开/etc/pam.d/目录下的任何一个配置文件,其中每行的验证规则都使用如下所示的语法格式:
Type Control-flag Module-path Module-arguments
其中每行代表一个独立的验证方式,每个配置文件可以由多种验证规则相互叠加而成。验证时PAM-API会按照从上往下的方式一一读取这些验证规则,并根据其中的控制标志做出相应的动作。
在编辑配置文件时一定要小心谨慎,由于规则的验证是有上下顺序之分的,因此你要小心确定某些危险的验证规则处于配置文件中的正确位置。因为一旦出错,可能会导致系统的部分功能或整个系统不能访问,这样你就不得不重新恢复它们的备份。
要正常配置PAM配置文件,就应当了解配置文件方法格式中每列的所包括的内容,下面是这些列的简短说明:
(1)、Type列,主要用来指定需要验证的类型。一共有以下四种验证类型:
1、 auth 验证使用者身份,提示输入帐号和密码;
2、 account 提供对帐户的进一步验证,例如验证帐户的此操作是否已经过期,权限多大,拥有此权限的时间期限是否已经过期等等;
3、 password 提供对密码的细致控制,例如控制密码的使用期限,重复输入的次数,密码锁定后的解禁时限等等。
4、 session 对每个会话进行跟踪和记录,记录的内容包括登录的用户名及登录的时间和次数等等。
(2)、Control-flag列,主要用来控制在验证过程中动作和返回结果的方式。它有两种类型的表达方式:简单的就是使用一个简单的关键字,复杂的可以使用方括号来嵌套控制标志,并可在方括号中使用value=action的方式表达。
简单的关键字有四个:
1、 required
当使用此控制标志时,当验证失败时仍然会继续进行其下的验证过程,它会返回一个错误信息,但是,由于它不会由于验证失败而停止继续验证过程,因此用户不会知道是哪个规则项验证失败。
2、 requisite
此控制标志与required的验证方式大体相似,但是,只要某个规则项验证失败则立即结束整个验证过程,并返回一个错误信息。使用此关键字可以防止一些通过暴力猜解密码的攻击,但是,由于它会返回信息给用户,因此,它也有可能将系统的用户结构信息透露给攻击者。
3、 sufficient
只要有此控制标志的一个规则项验证成功,那么PAM构架将会立即终止其后所有的验证,并且不论其前面的required标志的项没有成功验证,它依然将被忽略,然后验证通过。
4、 optional
表明对验证的成功或失败都是可有可无的,所有的都会被忽略。(通常用于session类型)
复杂的控制标志能够让管理员可以指定在验证过程中发生某种事件时可以执行的动作。这些控制标志用方括号包括起来,并由一系列的value=action 所构成,每个值之间用空格分开。
在新版PAM中,可供你选择的value列表存在于/usr/include/security/_pam_types.h文件中。其中的内容包括:success,open_err,symbol_err,ervice_err,system_err,buf_err,perm_denied,auth_err,cred_insufficient,authinfo_unavail,user_unknown,maxtries,new_authtok_reqd,acct_expired,session_err,cred_unavail,cred_expired,cred_err,no_module_data,conv_err,authtok_err,authtok_recover_err,authtok_lock_busy,authtok_disable_aging,try_again,ignore,abort,authtok_expired,module_unknown,bad_item,conv_again,incomplete,和default。
action 可以是一个无符号的整数,当在某行验证规则的控制标志的value指定期一个无符号的整数时n,就表明由此行往下的n行验证模块将被直接跳过。
Action还可以是下列所示的值:
ignore:设定此值后,指定的事件将会被忽略。
bad :设定此值后,当发生指定的事时的返回值将被认为是验证模块失败。如果此验证模块是整个验证堆叠中的第一个失败的模块, 它的状态值将作为整个堆叠的状态。
die:它的作用与bad 相同,但是,当设定此值的此类事件发生时,会终止整个验证模块的后续验证工作,立即返回到应用程序。
ok :设定此值可以用来覆盖此行验证规则前面已经返回了PAM_SUCCESS的所有值,但是如果前面有验证规则返回了一个错误的值,那么就不会被它覆盖。
done:它的作用与ok 相同,但是,当设定此值的此类事件发生时,会终止整个验证模块的后续验证工作,立即返回到应用程序。
reset :设定此值的作用是用来清除内存中原先的验证模块状态,并重新开始下一组的验证。
第三列是Module-path,用来为要验证的服务提供需要使用的验证模块。在Fedora Core 6系统中,当要引用的模块处于/lib/security/或/lib64/security/目录时,可以只输入模块的完整名称;如果要引用的模块不存在这两个默认的保存目录,就必需在模块的完整名称前加上完整的模块路径名。例如/usr/lib/security/。
第四列是Module-arguments,用来为引用的模块指定特殊的选项,多个选项之间可以通过空格隔开,还可在选项中使用“[ ]”来输入嵌套的命令或字串,当选项超过一行时用“\”符号连接下一行。
3、PAM中常用的验证模块说明
要掌握PAM的使用,我们还应当去了解一些常用的PAM验证模块的作用,毕竟PAM的具体验证功能都是由这些可插入的验证模块来完成的。在RedHat企业Linux3系统中,默认的PAM验证文件存在于/lib/security/或/lib64/security/目录,它们都是以“.so”为后缀的文件。
每个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配置文件中的每一行都由如下三个字段构成,中间用冒号隔开:
permission:users/groups:origins
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相配套。此配置文件中每一行的语法格式为:
services;ttys;users;times
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验证类型。
在/lib/security/或/lib64/security/目录中还有许多没有在上面列出的验证模块,由于它们的使用频率不高,加上文章篇幅的限制,就不再在此对它们做相应的说明,大家可以参考PAM管理员指南来得到它们的详细说明。
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99197