2009-08-13 追风
从第二篇开始,就是逐个介绍PAM各个模块的特点,功能和使用方法了,一共有41个模块,比较多,希望有朝一日能全部翻完...
6 模块使用指南
这一章,我们将一块介绍不懂Linux-PAM模块的用法。
6.1 pam_access - 日志监控风格的访问控制
pam_access.so [ debug ] [ nodefgroup ] [ noaudit ] [ accessfile=file ] [ fieldsep=sep ] [ listsep=sep ]
6.1.1 综述
pam_access模块主要功能是访问管理,提供日志监控风格的访问控制。这种访问控制是基于登录名称,主机明或域名,网络地址或网络号的,在不是网络登录的情况下,基于终端线名称进行访问控制。
这个模块时有一个配置文件/etc/security/access.conf,该模块的行为可以使用该文件进行修正和改动。你也可以指定其他文件作为配置文件。
6.1.2 描述
在/etc/security/access.conf中,拒绝或接受一个用户的登录是有(user/group, host), (user/group,network/netmask)或(user/group, tty)这三种组合决定的。
当某个用户登录时,模块就会扫描access.conf文件,查看申请登录的用户是否与组合(user/group, host)或
(user/group,network/netmask)一致,如果不是通过网络登录,则检查是否与(user/group, tty)组合一致。
这个访问控制表的每一行都包括三个域部分,中间用冒号分隔:
permission:users/groups:origins
第一域部分,permission,其实就是两个字符,“+”表示允许,“-”表示拒绝。
第二域部分,users/groups,可以在这里列出一个或多个用户名/组名,或者直接使用ALL(代表所有用户和组)。为了区分用户名和组名,组名外
面都要加上括号,例如:(group)。在这一部分你还可以使用这种格式"@netgroupname",来表是一个网络组。
,
第三域部分,origins,可以在这里列出一种或多种登录方式,如:tty
name(本地登录),主机名,域名(以"."开头),网络号(以"."结尾),带掩码的网络地址(掩码可以是十进制的数字,也可以是IP地址形
式),ALL(代表所有登录方式)或者LOCAL.LOCAL。
另外,在users/groups或origins中你还可以使用EXCEPT,来定义更严谨,更适用的规则。
如果没有设置nodefgroup参数(/etc/pam.d/***中),那么当一个用户名与允许登录用户不匹配时,PAM会去检查组文件。
If the nodefgroup is not set, the group file is searched when a name does not
match that of the logged-in user. On
ly groups are matched in which users are
explicitly listed. However the PAM module does not look at the primary group id
of a user.
以"#"开头的行都是注释。
6.1.3 选项
accessfile=/path/to/access.conf
设置配置文件路径,如果没有该参数,默认路径是/etc/security/access.conf。
debug
会有更多的调试信息被syslog记录下来。
noaudit
当有用户从未被允许的主机或终端登录时,事件将不会被报告。
fieldsep=separators
改变配置文件/path/to/access.conf中用的域分隔符。例如,默认情况下,配置文件的域分隔符是":",如果fieldsep=|,那么pam_access.so将会把配置文件中的"|"作为域分隔符,而“:”只当作是普通的参数字符。
listsep=separators
改变配置文件/path/to/access.conf中用的列表分隔符。每个域都是一个列表,例如users/groups域是许多个组名或用户名的列
表,如果listsep=',',那么逗号将被用作列表分隔符,而原来的列表分隔符空格则被认作为普通字符。这个功能主要用于含有空格的用户名或组名,如
Domain Users", "Domain Admins"。
nodefgroup
如果不加该参数,当用户名不匹配时,PAM会把他当做是组名,然后去查找组文件中是否有匹配项。加上该参数后,只有写在括号内的名字才会被认为是组名,例如:(wheel)
6.1.4 模块支持的类型
auth, account, password and session
6.1.5 返回值
PAM_SUCCESS
访问被接受
PAM_PERM_DENIED
访问被拒绝
PAM_IGNORE
访问被忽略
PAM_ABORT
没有得到所有应该得到的数据
PAM_USER_UNKNOWN
系统未知用户
6.1.6. 文件
/etc/security/access.conf
默认的配置文件
6.1.7. 例子
下面是配置文件/etc/security/access.conf的例子。
允许用户root通过cron,X11终端:0,tty1,...,tty5,tty6访问。
+ : root : crond :0 tty1 tty2 tty3 tty4 tty5 tty6
允许root用户通过某个具有IPv4地址的主机访问。并不是说该主机只可以有IPv4地址,在IPv4和IPv6地址同时存在于该主机上时,root用户同样可以通过该主机访问。
+ : root : 192.168.200.1 192.168.200.4 192.168.200.9
+ : root : 127.0.0.1
允许root用户通过192.168.201.这个网段的所有主机访问。但是更好的规则书写方法是网路地址加网络掩码。192.168.201.可以写成92.168.201.0/24 或 192.168.201.0/255.255.255.0
+ : root : 192.168.201.
允许root用户通过主机foo1.bar.org 和 foo2.bar.org访问
+ : root : foo1.bar.org foo2.bar.org
允许root用户通过foo.bar.org域中的主机访问
+ : root : .foo.bar.org
拒绝root用户通过任何其他的方式登录
- : root : ALL
用户foo和网络组@admin的成员,将被允许以任何方式访问。该配置只有当netgroup服务使能时才起作用。
+ : @admins foo : ALL
用户john和foo只被允许从IPv6地址为2001:db8:0:101::1的主机访问
+ : john foo : 2001:db8:0:101::1
用户john被允许从2001:db8:0:101::/64这个网段上的主机访问。
User john should get access from IPv6 net/mask.
+ : john : 2001:db8:0:101::/64
所有的本地控制台登录都被禁止,除了wheel组的成员和shutdown,sync
-:ALL EXCEPT (wheel) shutdown sync:LOCAL
任何其他用户被禁止以任何方式访问
- : ALL : ALL
6.1.8. 作者
The logdaemon style login access control scheme was designed and implemented by
Wietse Venema. The pam_access PAM module was developed by Alexei Nogin
. The IPv6 support and the network(address) / netmask
feature was developed and provided by Mike Becher
.
6.2 pam_cracklib - 密码强度检查模块
pam_cracklib.so [ ... ]
6.2.1 描述
这个模块可以插入到实现password管理组功能的层叠模块中,为给定的程序提供密码强度检查。
这个模块的工作方式是首先提醒用户输入密码,然后根据系统中的字典库和设定好的规则来检测密码强度是否到达要求。
第一步是首先调用cracklib例程检查密码强度,如果密码不易破译,就提示用户再次输入密码,用以验证第一次输入的密码是否正确。如果验证都通过,则新密码将会生效。
密码强度的检查包括一下步骤:首先调用Cracklib,验证密码是不是字典的一部分,如果验证通过,下面的强度检查将会继续,
Palindrome
新密码是不是回文,即正读反读都可的词, 例如: Madam。
Case Change Only
新密码是否只是旧密码改变了大小写?
Similar
新密码与旧密码是否有太多相似之处?这个功能通过参数difok来控制,通过这个参数,可以指定新旧密码之间必须至少有多少个字符不相同。这个参数的默认值是10或者新密码的1/2。
为了避免对一个很长、很复杂的密码进行查询,还可以使用 difignore参数。这个参数可以指定一个值,如果新的密码长度超过这个值,就不必进行这种检查,默认值是23。
Simple
是否新密码太短。由5个参数控制:minlen、dcredit、ucredit、lcredit和ocredit。关于这些参数的用法,将会在参数那一节介绍。
Rotated
新密码是否是就密码的回环?
Same consecutive characters
检查新密码中的连续字符,验证是不是以前的密码用过。
Contains user name
检查新密码中是否含有用户名
对于标准的UNIX密码加密算法,即使没有参数,这个模块也会工作得很好。但是,对于MD5加密算法,密码可以超过8个字符,使用默认的设置将使用户很难
找到满意的密码。MD5算法的默认设置中,要求新密码中和旧密码相同的字符不能超过1/2,而且这是一个的强制约束。例如:旧的密码是"the
quick brown fox jumped over the lazy
dog",那这个密码是很难被替换的。除此之外,MD5算法的默认设置还允许密码长度小于5个字符。因此,对于MD5系统需要对配置做一些调整,提高字符
数的底限,减小对不同字符的比例限制。
6.2.2. 选项
debug
把模块详细的行为信息写到syslog,但不包括密码信息。
authtok_type=XXX
修改提示信息。默认的提示信息是:"New UNIX password:"和"Retype UNIX password"。设置这个选项可以使xxx代替UNIX。
retry=N
改变输入密码的次数,默认值是1。就是说,如果用户输入的密码强度不够就退出。可以使用这个选项设置输入的次数,以免一切都从头再来。
difok=N
默认值为10。这个参数设置允许的新、旧密码相同字符的个数。不过,如果新密码中1/2的字符和旧密码不同,则新密码被接受。
difignore=N
如果密码字符长度超过了N个(默认为23个),则difok的值将会被忽略,不再起作用。
minlen=N
密码字符个数下限。如果credits被使能的话(默认是使能的),密码字符个数下限为N+1。另外,参数credit参数还可以设置其他不同类型字符的
个数(other, upper, lower and
digit)。minlen的默认值是9,这个值对于旧风格的UNIX密码是非常合适的,但是对于MD5系统来说就不太安全了。Note that
there is a pair of length limits in Cracklib itself, a"way too short"
limit of 4 which is hard coded in and a defined limit (6) that will be
checked without reference to minlen. If you want to allow passwords as
short as 5 characters you should not use this module.
dcredit=N
(N >= 0)
限制新密马中最多有多少个数字。如果密码中数字少于或者等于N个,每有一位数字密码,minlen的值就会加一,就是说,当minlen=7时,如果密码
中有3个数字,则minlen的值会被自动设为10。dcredit的默认值是1,当参数minlen设为小于10的数时,推荐使用dcredit的默认
值。
(N < 0) 限制新密码中最少有多少个数字。
ucredit=N
(N >= 0) 限制新密码中最多有多少个大写字符。如果密码中的大写字母个数少于或等于N,则每有一位大写字母,minlen的值就会加一。ucredit的默认值是1,当参数minlen设为小于10的数时,推荐使用dcredit的默认值。
(N < 0) 限制新密码中最少有多少个大写字母。
lcredit=N
(N >= 0) 限制新密码中最多有多少个小写字符。如果密码中的小写字母个数少于或等于N,则每有一位小写字母,minlen的值就会加一。lcredit的默认值是1,当参数minlen设为小于10的数时,推荐使用dcredit的默认值。
(N < 0) 限制新密码中最少有多少个小写字母。
ocredit=N
(N >= 0) 限制新密码中最多有多少个其他字符。如果密码中的其他字符个数少于或等于N,则每有一位其他字符,minlen的值就会加一。lcredit的默认值是1,当参数minlen设为小于10的数时,推荐使用dcredit的默认值。
(N < 0) 限制新密码中最少有多少个其他字符。
minclass=N
要求新密码中必须包含多少中字符。默认值为0。字符的种类有四种:数字、大写字符、小写字符、其他字符。The difference to the
credit check is that aspecific class if of characters is not required.
Instead N out of four of the classes are required.
maxrepeat=N
如果新密码中包含了N个连续的相同字符,新密码将会被拒绝。默认值为0,表示不使能该功能。
reject_username
检查新密码中是否包含用户名。如果有,则新密码将会被拒绝。
use_authtok
不让模块执行提示用户输入密码的动作,使用前面层叠的password模块提供的密码。
dictpath=/path/to/dict
cracklib字典的路径
6.2.3. 模块支持的类型
password
6.2.4. 返回值
PAM_SUCCESS
表示新密码通过了所有验证。
PAM_AUTHTOK_ERR
没有输入新密码,或者无法确定用户名,或者新密码的强度验证失败。
PAM_AUTHTOK_RECOVERY_ERR
之前层叠的模块每有提供旧密码,或者用户没有获取旧密码的要求。第一种错误发生在use_authtok被指定的时候。
PAM_SERVICE_ERR
发生内部错误
6.2.5. EXAMPLES
下面的例子展示了该模块是如何于passwd结合使用的。
#
# These lines stack two password type modules. In this example the
# user is given 3 opportunities to enter a strong password. The
# "use_authtok" argument ensures that the pam_unix module does not
# prompt for a password, but instead uses the one provided by
# pam_cracklib.
#
passwd password required pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok
下面是一个使用md5加密算法的例子,文件路径是/etc/pam.d/passwd
#%PAM-1.0
#
# These lines allow a md5 systems to support passwords of at least 14
# bytes with extra credit of 2 for digits and 2 for others the new
# password must have at least three bytes that are not present in the
# old password
#
password required pam_cracklib.so \
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_unix.so use_authtok nullok md5
下面是一个不使用credit的例子。
#%PAM-1.0
#
# These lines require the user to select a password with a minimum
# length of 8 and with at least 1 digit number, 1 upper case letter,
# and 1 other character
#
password required pam_cracklib.so \
dcredit=-1 ucredit=-1 ocredit=-1 lcredit=0 minlen=8
password required pam_unix.so use_authtok nullok md5
6.2.6. AUTHOR
pam_cracklib was written by Cristian Gafton
阅读(1444) | 评论(0) | 转发(0) |