前言:
使用Linux快三年了,从未想过Linux用户密码策略,从未把一本Linux的书从头看到尾(上学时的教材除外),故不知书上有无介绍,直到最近参加公司的信息安全稽核会议后才开始考虑Linux用户密码策略…
系统版本:
Red Hat Enterprise Linux AS release 4
Linux用户密码策略
Linux用户密码的有效期,是否可以修改密码可以通过login.defs文件控制.对login.defs文件修只影响后续建立的用户,如果要改变以前建立的用户的有效期等可以使用chage命令.
Linux用户密码的复杂度可以通过pam pam_cracklib module或pam_passwdqc module控制,两者不能同时使用. 个人感觉pam_passwdqc更好用.
/etc/login.defs密码策略
PASS_MAX_DAYS 99999 #密码的最大有效期, 99999:永久有期
PASS_MIN_DAYS 0 #是否可修改密码,0可修改,非0多少天后可修改
PASS_MIN_LEN 5 #密码最小长度,使用pam_cracklib module,该参数不再有效
PASS_WARN_AGE 7 #密码失效前多少天在用户登录时通知用户修改密码
pam_cracklib主要参数说明:
tretry=N:重试多少次后返回密码修改错误
difok=N:新密码必需与旧密码不同的位数
dcredit=N: N >= 0:密码中最多有多少个数字;N < 0密码中最少有多少个数字.
lcredit=N:小宝字母的个数
ucredit=N大宝字母的个数
ocredit=N:特殊字母的个数
minclass=N:密码组成(大/小字母,数字,特殊字符)
pam_passwdqc主要参数说明:
mix:设置口令字最小长度,默认值是mix=disabled。
max:设置口令字的最大长度,默认值是max=40。
passphrase:设置口令短语中单词的最少个数,默认值是passphrase=3,如果为0则禁用口令短语。
atch:设置密码串的常见程序,默认值是match=4。
similar:设置当我们重设口令时,重新设置的新口令能否与旧口令相似,它可以是similar=permit允许相似或similar=deny不允许相似。
random:设置随机生成口令字的默认长度。默认值是random=42。设为0则禁止该功能。
enforce:设置约束范围,enforce=none表示只警告弱口令字,但不禁止它们使用;enforce=users将对系统上的全体非根用户实行这一限制;enforce=everyone将对包括根用户在内的全体用户实行这一限制。
non-unix:它告诉这个模块不要使用传统的getpwnam函数调用获得用户信息,
retry:设置用户输入口令字时允许重试的次数,默认值是retry=3
密码复杂度通过/etc/pam.d/system-auth实施
如:
要使用pam_cracklib将注释去掉,把pam_passwdqc.so注释掉即可.
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
password requisite /lib/security/$ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
新密码至少有一位与原来的不同.
#########################################
服
务器的系统安全确实是一件让大多数用户头痛的事情:如何确保系统中使用应用程序或服务的用户确是用户本人?如何给这些用户指定限制访问服务的时间段?以及
如何限制各种应用程序或服务对系统资源的使用率等等?所有的这些问题,常规的安全措施并不能妥善地解决。在使用Linux内核的RedHat企业
Linux3中,已经集成了一种叫做可插入式认证模块(Pluggable Authentication
Modules)的安全验证方式,能够用它来完成上面所示的任务。
可插入认证模块(简称PAM)是基于模块化设计、具有可插入功能的一种独立于应用程序之外的验证方式。使用PAM后,应用程序可以不需要集成验证功能,而
由PAM来完成。例如,在Linux系统中,Login服务为用户提供系统登录服务,它提示用户输入相应的用户名和密码来验证用户的有效性,当使用PAM
后,这个验证过程可以由PAM来代替。PAM具有很大的灵活性,系统管理员可以通过它为应用程序自由选择需要使用的验证方式。鉴于PAM有这么多优点,在
本文中,将以RedHat企业Linux3为应用平台,来讨论如何使用PAM来增强Linux服务器的安全性能。
一、PAM入门必读
当
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管理员指南来得到它们的详细说明。
sag-pam_cracklib.html
如何在Linux系统中限制密码长度的同时对密码的复杂程度也进行管理,最近发现有人的密码符合长度规则,但是却很简单很容易被猜出来,查了相关资料后发现了PAM中的pam_cracklib模块就是用来做密码复杂度检测的。
先简单的介绍一下PAM,PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。 PAM模块是一种嵌入式模块,修改后即时生效。
pam的重要文件如下:
/usr/lib/libpam.so.* ## PAM核心库
/etc/pam.conf ## PAM配置文件
/etc/pam.d/* ## PAM各个模块的配置文件
/lib/security/pam_*.so ## 可动态加载的PAM模块
PAM配置文件的每一行的格式:Module-type Control-flag Module-path Arguments
模块类型 控制字符 模块路径 模块参数
Module-type:
auth:确定有关用户认证的两方面。第一,他确认用户就是他们自己,这通过应用程序提示用户输入密码 或者其他正式身份的办法。第二,这类模块会赋予成员资格。
account:处理非认证级的账号管理。典型的用法是基于一天的不同时间来限制、允许访问某服务。限制 当前可用的系统资源(最大用户数)或者限制特定用户—root只能从控制台登陆。
session:一系列有关动作,只在用户得到/失去服务时要做的事。这包括记录用户的登录/退出、挂载必要 的目录等。
password:设置密码。
Control-flag:
required:表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即 通知用户,而是要等到同一stack中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必 要条件。
requisite:与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行 同一stack内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件。注:Solaris不支持。
sufficient:表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是 如果本模块返回失败的话可以忽略。可以认为是一个充分条件。
optional:表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
include,从字面就知道什么意思了。包含另外一个配置文件。
Module-path:
Debian的PAM module存放目录默认是在/lib/security。在各个模块的配置文件里,不用写绝对路径,直接 写这个默认目录下面的模块名就可以了。当然,也可以写绝对路径。
Arguments:
各个模块的参数都不一样,具体的要开发者的man手册。无效参数不会对结果有影响,但是会被日志记录 下来。首先,看看/lib/security有没有这个模块,再:man 模块名
下面开始介绍cracklib模块
pam_cracklib是一个PAM模块,用来检查密码是否违反密码字典,这个验证模块可以通过插入password堆 栈,为特殊的应用提供可插入式密码强度性检测。 它
的工作方式就是先提示用户输入密码,然后使用一个系统
字典和一套规则来检测输入的密码是否不能满足强壮性要求。密码的强度检测分二次进行,第一次只是检测密
码是否是提供的对比字典中的一部分,如果检测结果是否定的,那么就会提供一些附加的检测来进一步检测其
强度,例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写状况,以及是否使用了特 殊字符等等。(libpam-cracklib)
下面是cracklib模块的一些参数:
debug:将debug信息写入syslog
type=XXX:提示输入密码的文本内容。默认是"New UNIX password: " and "Retype UNIX password: ",可自定
retry=N:用户最多可以几次输入密码后报错。默认是1次。
difok=N:新密码有几个字符不能和旧密码相同,默认是5个。另外如果新密码有1/2的字符于旧不同,也会被接受。
diginore=N:默认当新密码有23个字符时,difok选项会被忽略。
minlen=N:最小密码长度。
dcredit=N:当N>=0时,N代表新密码最多可以有多少个阿拉伯数字。当N<0时,N代表新密码最少要有多少个阿拉伯数字。
ucredit=N:和dcredit差不多,但是这里说的是大写字母。
lcredit=N:和dcredit差不多,但是这里说的是小写字母。
ocredit=N:和dcredit差不多,但是这里说的是特殊字符。
use_authtok:在某个与密码相关的验证模块后使用此选项,例如pam_unix.so验证模块
pam_cracklib 模块式PAM配置接口的基本模块,在Debian系统中配置文件是
/etc/pam.d/common-password 但是在Redhat系统中配置文件是 /etc/pam.d/system-auth
他的配置看起来像以下这样:
password required pam_cracklib.so retry=3 minlen=6 difok=3
password required pam_unix.so md5 use_authtok
第一行是 pam_cracklib模块和设置的几个模块参数
第二行是 pam_unix模块,MD5表示采用MD5加密
pam_cracklib可以记录用户使用的历史密码,并且不允许用户重复使用旧的密码,实际上存储用户旧密码的是通过pam_unix模块实现的。
第一步是建立一个空文件用来存储旧密码/etc/security/opasswd,如果你没有建立文件却使用了历史密码记录功能的话,所有的密码更新都会失败,因为pam_unix模块会报错。
opasswd就像/etc/shadow文件,因为他记录用户密码的哈希
touch /etc/security/opasswd
chown root:root /etc/security/opasswd
chmod 600 /etc/security/opasswd
一旦建立了opasswd文件,就可以在pam_unix模块后面加上参数remember=N来开始记录旧密码,remember参数记录你想记录多少旧密码,他的最大值是400,如果你设置的值超过400会当做400来对待,例如:
password required pam_cracklib.so retry=3 minlen=12 difok=4
password required pam_unix.so md5 remember=12 use_authtok
opasswd文件内容格式如下:
hal:1000::,,...,
以‘:’分割,第一列是用户名,第二列是用户ID,第三列是目前记录了该用户多少个旧密码,hashN是每次密码的MD5值,opasswd在某些系统安装PAM模块时会自动建立。
密码字典检查
pam_cracklib 也可以检查用户设置的密码是不是违反系统内部的密码字典,在Debian系统中pam_cracklib的 密码字典在/var/cache/cracklib目录下,而且每天晚上update-cracklib脚本会自动的rebuild密码字典。
/etc/login.defs
文件设置密码过期时间等一系列参数,注意login.defs中设置的参数只有是用系统的useradd程序新建的一个用户时才会有login.defs
中设置的属性,如果是用其他机器新建的用户,则没有以上属性,不过可以试用chage命令手动添加相关属性。
chage参数如下:
-m 密码可更改的最小天数。 为零时代表任何时候都可以更改密码。
-M 密码保持有效的最大天数。
-W 用户密码到期前,提前收到警告信息的天数。
-E 帐号到期的日期。过了这天,此帐号将不可用。
-d 上一次更改的日期
-i 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
在密码管理方面one time password(OTP)也很有效果,动态密码管理,有兴趣的同学可以研究一下。