概述:

     本文介绍常见的PAM认证模块,包括每一个模块的所属类型、功能描述以及可识别的参数,有配置文件的,我们给出了配置文件的简单说明,其中一部分模块,我们还给出了配置实例。希望通过我们的介绍,使读者对常用的PAM认证模块有一定的了解。本文的介绍是基于RedHat7.x系统。水平有限,不足之处请读者批评指正。


1.pam_access认证模块
所属类型:account
功能描述:该模块提供基于登录用户名、客户ip/主机名、网络号以及登录终端号的访问控制。缺省的,该模块的配置文件是/etc/security/access.conf,可以使用accessfile参数指定自定义的配置文件。
可带参数:accessfile=/path/to/file.conf
配置文件说明: 该文件的每一行由如下三个字段构成,中间使用冒号分割: 权限 : 用户 : 来源 权限字段可以是”+”(即允许访问),”-”(禁止访问); 用户字段可以是用户名、组名以及诸如
[email=user@host]user@host[/email]
格式的用户名,ALL表示任何人, 具有多个值时,可以用空格分开。 来源字段可以是tty名称(本地登录时)、主机名、域名(以”.”开始),主机ip地址,网络号(以”.”结束)。ALL表示任何主机,LOCAL表示本地登录。 可以使用EXCEPT操作符来表示除了…之外。
配置实例: 只有bye2000可以从本地登录主机。 编辑/etc/pam.d/login如下所示:
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_access.so
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
session optional /lib/security/pam_console.so
也即加上 account required /lib/security/pam_access.so 然后在/etc/security/access.conf中加上: -:ALL EXCEPT bye2000 : LOCAL 假如禁止root以外的任何人从任何地方登录,可以在/etc/security/access.conf中加上: -:ALL EXCEPT root: ALL


2.pam_chroot认证模块

所属类型:session
    为了加强linux服务器的安全性,要求指定的用户从ssh登录后只能在指定的目录下工作并只能运行指定的命令或脚本

解决:
修改ssh的登录验证方法
[root@localhost ~]# vi /etc/pam.d/sshd
#%PAM-1.0
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
session include system-auth
session required pam_loginuid.so
session required pam_chroot.so (这是我们手动加入的一行)

设置用户目录
[root@localhost ~]# mkdir /virtual_root/chroot/lib -p
[root@localhost ~]# mkdir /virtual_root/chroot/etc -p
[root@localhost ~]# mkdir /virtual_root/chroot/bin -p
[root@localhost ~]# mkdir /virtual_root/chroot/home/ziyang -p
(你的/etc/passwd中应该有一个名为ziyang的用户)
[root@localhost ~]# chown ziyang.ziyang /virtual_root/chroot/home/ziyang

修改chroot配置文件
[root@localhost ~]# vi /etc/security/chroot.conf
ziyang /virtual_root/chroot (手动加入此行,ziyang就只能被限定在/virtual_root/chroot目录下了。

注:是通过ssh登录的用户,对本地控制台登录的用户无效。但是可以有方法去实现)

设置用户权限和可用命令
[root@localhost ~]# cp /lib/ld-linux.so.2 /lib/libc.so.6 /lib/libdl.so.2 /lib/libtermcap.so.2 /virtual_root/chroot/lib
[root@localhost ~]# cp /bin/bash /virtual_root/chroot/bin
[root@localhost ~]# grep ziyang < /etc/passwd > /virtual_root/chroot/etc/passwd

应用测试
使用ssh从其他的主机登录你的linux服务器,你会发现ziyang这个用户登录后被限定在了/virtual_root/chroot目录下,并且没有可以使用的shell命令。


3.pam_cracklib认证模块
所属类型:password
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:<n>:<hash1>,<hash2>,...,<hashn>

         以‘:’分割,第一列是用户名,第二列是用户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 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。


4.pam_deny认证模块
所属类型:account, session, auth,password
功能描述:该模块仅仅返回一个错误。用来拒绝用户访问。通常该模块被用来作为缺省的验证规则。
可带参数:无
配置实例: 请参考/etc/pam.d/system-auth文件


5.pam_env认证模块

所属类型: auth
功能描述:该模块可以用来设置任意的环境变量,缺省的,该模块的配置文件是/etc/security/pam_env.conf,可以使用conffile参数指定自定义的配置文件。
配置文件说明:该配置文件每一行(一个条目)的语法如下: 变量名 [DEFAULT=[值]] [OVERRIDE=[值]] 选项DEFAULT说明这是一个缺省值;OVERRIDE则说明可以覆盖缺省值。在该配置文件中,可以使用${变量名}的形式应用变量。除此之外,该模块还可以从/etc/environment文件中读入形如“变量名=值”的环境变量,当然该文件也可以用readenv参数自己指定。需要注意的是,该文件的读入的值,将覆盖conffile文件中的缺省值。
可带参数: debug:将调试信息写入日志 conffile=filename:指定自定义的配置文件; readenv=filename:指定自定义包含“变量名=值”形式的环境变量配置文件; readenv=1/0:设置是否从readenv中读入环境变量,缺省是1,也即读入。
配置实例: 请参考/etc/pam.d/system-auth文件


6.pam_filter认证模块
所属类型:account, session, auth,password
功能描述:该模块提供对用户和应用程序交互内容的访问控制功能,目前仅仅具有大小写转换功能。该模块还有待完善。


7.pam_ftp认证模块
所属类型:auth
功能描述:该模块提供匿名ftp用户认证机制。
可带参数: debug:将调试信息写入日志 users=xxx,yyy:指定采用该模块进行认证的用户名,缺省为ftp和anonymous,可以用逗号进行分割;


8.pam_group认证模块
所属类型:auth
功能描述:该模块没有提供用户认证,而仅仅是授予该用户指定组的组权限。其缺省的配置文件为/etc/security/groups.conf。


9.pam_issue认证模块
所属类型:auth
功能描述:该模块在用户登录时,将/etc/issue文件的内容打印出来。
可带参数: issue=filename:指定其他配置文件,而不是缺省的/etc/issue. noesc:不对配置文件中的转移字符进行解释。
配置文件说明: 配置文件中可以使用形如x的转移字符来实现特定的功能。可以识别的转移字符有: d:打印当前日期 s:打印操作系统名称 l:打印当前tty名称 m:打印CPU类型(i686、sparc、powerpc等) :打印主机名 o:打印域名
:打印内核版本号 :打印当前系统时间 u:打印系统当前在线用户数 U:同u,但是在用户数后有users字样 v:打印系统安装的日期
配置文件实例: $ more /etc/issue
Welcome to
Time: d User online: U


10.pam_lastlog认证模块
所属类型:auth
功能描述:该模块在用户登录时,打印最后登录系统的信息(在/var/log/lastlog中),通常已经有其他程序在作这个工作了,所以没有必要使用该模块。


11.pam_limits认证模块
所属类型:session
功能描述:该模块限制用户会话过程中系统资源的使用率。缺省的,该模块的配置文件是/etc/security/limits.conf,可以使用conf参数指定自定义的配置文件。
可带参数: issue=filename:指定其他配置文件,而不是缺省的/etc/issue. noesc:不对配置文件中的转移字符进行解释。
配置文件说明: debug:将调试信息写入日志 conf=filename:指定配置文件
配置文件说明:该配置文件每一行(一个条目)的语法如下:
在这里 可以是 用户名 用户组名,采用@group的语法 通配符*,表示任何 可以是 soft-表示软限制,可以超过该限制 hard-表示硬限制,有root设定,内核执行,不可以超过该限制 可以是 core-core文件大小 (KB) data-最大数据大小(KB) fsize-最大文件大小(KB) memlock-最大可用内存空间(KB) nofile-最大可以打开的文件数量 rss-最大可驻留空间(KB) stack-最大堆栈空间(KB) cpu-最大CPU使用时间(MIN) nproc-最大运行进程数 as-地址空间限制 maxlogins-某一用户可以登录到系统的最多次数 locks-最大锁定文件数目 需要注意的是,如果无限制可以使用”-”号,并且针对用户限制的优先级要比针对组的 优先级高。
配置文件实例:

* soft core 0        

* hard rss 10000

@student hard nproc 20

@faculty soft nproc 20

@faculty hard nproc 50


12.pam_listfile认证模块
所属类型:auth
功能描述:该模块提供根据某种规则来对用户进行访问控制的功能。通常把访问控制规则放在一个文件中,可以用file参数指定该文件。使用pam_listfile.so模块配置的格式分为五个部分:分别是item、sense、file、onerr以及apply。 其中:

item=[tty|user|rhost|ruser|group|shell]:定义了对哪些列出的目标或者条件采用规则,显然,这里可以指定多种不同的条件。

onerr=succeed|fail:定义了当出现错误(比如无法打开配置文件)时的缺省返回值。

sense=allow|deny:定义了当在配置文件中找到符合条件的项目时的控制方式。如果没有找到符合条件的项目,则一般验证都会通过。

file=filename:用于指定配置文件的全路径名称。

apply=user|@group:定义规则适用的用户类型(用户或者组)。

而至于file文件的写法就简单了,每行一个用户或者组名称即可。

所以,当我们需要对其它服务进行类似的访问控制的时候,就可以照葫芦画瓢。例如现在需要在SSH服务器上对ssh客户端实现基于用户的访问控制,目的是不允许admin从通过ssh登录。

针对这种需求只需要更改/etc/pam.d/sshd文件,并在该文件中添加一行(添加到第一行):

双击代码全选
1
auth required pam_listfile.so  item=user sense=deny file=/etc/pam.d/denyusers onerr=succeed

然后建立文件/etc/pam.d/denyusers,并在文件中写入用户信息——>就写admin即可。

表示用户以ssh登录必须要通过pam_listfile.so模块进行认证,认证的对象类型是用户,采用的动作是禁止,禁止的目标是/etc/pam.d/denyuser文件中所定义的用户。

这样在该条目添加到该文件之后,使用admin从其它主机远程ssh访问服务器会出现密码错误的提示。但是使用root或者其它用户则访问能够成功。

再次强调,要注意pam模块使用的顺序,刚才的规则一定要添加到auth的第一行之前,否则不会生效。


13.pam_mail认证模块
所属类型:auth,session
功能描述:检查用户的邮件目录,查看该用户是否有新邮件。通常已经有其他程序在作这个工作了,所以没有必要使用该模块。
可带参数: debug:将调试信息写入日志 dir=pathname:用于指定用户的邮箱路径,通常是/var/spool/mail,如果是以~开头表示该邮箱位于用户的宿主目录下。 nopen:不向用户提示邮件信息。 close:总是向用户提示邮件信息。 noenv:不设置MAIL环境变量。 empty:如果用户邮箱为空,也向用户提示邮件信息。 quiet:即使用户有新邮件也不向用户提示。


14.pam_mkhomedir认证模块
所属类型: session
功能描述:在用户登录时为用户兴建宿主目录,该功能在采用ldap或者数据库存储用户数据时特别有用。
可带参数: debug:将调试信息写入日志 skel=dir:指定用户包含初始化脚本的目录; umask=octal:与umask命令一样,设置用户创建文件时预设的权限掩码。


15.pam_motd认证模块
所属类型: session
功能描述:在用户成功登录系统后显示message of today(今天的信息),缺省是显示/etc/motd文件的内容,可以用motd参数指定不同的配置文件。
可带参数: motd=filename:指定自定义的配置文件。


16.pam_nologin认证模块
所属类型: auth
功能描述:提供标准的UNIX nologin登录认证。如果/etc/nologin文件存在,则只有root用户可以登录,其他用户登录时只会得到/etc/nologin文件的内容。如果/etc/nologin不存在,则该模块没有作用。
可带参数:无


17.pam_permit认证模块
所属类型: account; auth; password; session
功能描述:使用该模块具有很大的安全风险,该模块的唯一功能就是允许用户登录。
可带参数:无


18.pam_pwdb认证模块
所属类型: account; auth; password; session
功能描述:该模块是标准UNIX认证模块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,该模块完成让用户更改密码的任务;
在作为session类型使用时,此时该模块没有可识别的参数,该模块仅仅完成记录用户名和服务名到日志文件的工作。
可带参数: debug:将调试信息写入日志 audit:记录更为信息的信息 nullok:缺省情况下,如果用户输入的密码为空,则系统能够不对其提供任何服务。但是如果使用参数,用户不输入密码就可以获得系统提供的服务。同时,也允许用户密码为空时更改用户密码。 nodelay:当用户认证失败,系统在给出错误信息时会有一个延迟,这个延迟是为了防止 ***猜测密码,使用该参数时,系统将取消这个延迟。通常这是一个1秒钟的延迟。 try_first_pass:在用作auth模块时,该参数将尝试在提示用户输入密码前,使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数是为了防止用户将密码更新成使用以前的老密码。 use_first_pass:在用作auth模块时,该参数将在提示用户输入密码前,直接使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数用来防止用户将密码设置成为前面一个堆叠的password模块所提供的密码。 no_set_pass:使密码对前后堆叠的password模块无效。 use_authok:强制使用前面堆叠的password模块提供的密码,比如由pam_cracklib模块提供的新密码。 md5:采用md5对用户密码进行加密。 shadow:采用影子密码。 unix:当用户更改密码时,密码被放置在/etc/passwd中。 bigcrype:采用DEC C2算法加密用户密码。
配置实例: 参考/etc/pam.d/ftp


19.pam_rhosts_auth认证模块
所属类型: auth
功能描述:该模块为标准的网络服务(诸如rlogin、rsh)提供认证。
可带参数:请参考PAM文档说明


20.pam_rootok认证模块
所属类型: auth
功能描述:使用该模块具有很大的安全风险,该模块的唯一功能就是让uid为0的用户不需输入密码就可以登录系统。
可带参数:无


21.pam_securetty认证模块
所属类型: auth
功能描述:该模块用来控制root用户只可以从包含在/etc/securetty文件中的终端登录系统。


22.pam_shell认证模块
所属类型: auth
功能描述:如果用户的shell在/etc/shells中列出,则允许用户进行验证,如果/etc/passwd中没有指定shell,则缺省使用/bin/sh.


23.pam_time认证模块
所属类型: account
功能描述:对用户访问服务提供时间控制,也就是说,用来控制用户可以访问服务的时间,配置文件为:/etc/security/pam.conf。
可带参数:无
配置文件说明:
每一行的构成语法如下:
services; ttys; users; times
services:服务名称
ttys:规则生效的终端名,可以*号表示任何终端,!表示非。
users:规则作用的用户,可以*号表示任何用户,!表示非。
times:指定时间,通常使用日期时间格式。用两个字母指定日期,比如MoTuSa就是指星期一星期二和星期六。注意重复的部分将被排除在外,比如MoTuMo就指星期二,MoWk指除了星期一以外的每一天。两个字母的组合有:
Mo Tu We Th Fr Sa Su Wk Wd Al
Mo到Su分别指从星期一到星期天,Wk指每一天,Wd指周末,Al也指每一天。
采用24小时制指定时间,也即采用HHMM的形式。比如Mo1800-0300就是每个星期一的下午6点到第二天的凌晨3点。


24.pam_unix认证模块
所属类型: account; auth; password; session
功能描述:该模块是标准UNIX认证模块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类型使用时,此时该模块没有可识别的参数,该模块仅仅完成记录用户名和服务名到日志文件的工作。
可带参数:
debug:将调试信息写入日志
audit:记录更为信息的信息
nullok:缺省情况下,如果用户输入的密码为空,则系统能够不对其提供任何服务。但是如果使用参数,用户不输入密码就可以获得系统提供的服务。同时,也允许用户密码为空时更改用户密码。
nodelay:当用户认证失败,系统在给出错误信息时会有一个延迟,这个延迟是为了防止
***猜测密码,使用该参数时,系统将取消这个延迟。通常这是一个1秒钟的延迟。
try_first_pass:在用作auth模块时,该参数将尝试在提示用户输入密码前,使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数是为了防止用户将密码更新成使用以前的老密码。
use_first_pass:在用作auth模块时,该参数将在提示用户输入密码前,直接使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数用来防止用户将密码设置成为前面一个堆叠的password模块所提供的密码。
no_set_pass:使密码对前后堆叠的password模块无效。
use_authok:强制使用前面堆叠的password模块提供的密码,比如由pam_cracklib模块提供的新密码。
md5:采用md5对用户密码进行加密。
shadow:采用影子密码。
unix:当用户更改密码时,密码被放置在/etc/passwd中。
bigcrype:采用DEC C2算法加密用户密码。
nis:使用NIS远处过程调用来设置新密码。
remember=x:记录x个使用过的旧密码,这些旧密码以MD5方式加密后被保存在/etc/security/opasswd文件中。
broken_shadow:在作为account使用时,该参数用来忽略对影子密码的读错误。
likeauth:未知。
配置实例:
参考/etc/pam.d/system-auth


25.pam_userdb认证模块
所属类型: auth
功能描述:使用该模块允许您通过一个Berkeley数据库来验证用户,假如您使用这种数据库来保存用户信息的话。
可带参数:
debug:将调试信息写入日志
icase:忽略密码大小写
dump:将数据库中的所有条目记录在日志文件中,有安全隐患。
db=filename:指定数据库文件的完整路径。
use_authok:强制使用前面堆叠的auth模块提供的密码。
unknown_ok:当数据库中没有用户信息时,不返回错误。
配置实例:
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth sufficient pam_userdb.so icase db=/tmp/dbtest
auth required pam_pwdb.so shadow nullok try_first_pass
auth required pam_shells.so
account required pam_pwdb.so
session required pam_pwdb.so


26.pam_warn认证模块
所属类型: auth,password
功能描述:记录服务、终端名、用户名、远程主机等信息到日志文件。


27.pam_stack认证模块
所属类型: auth,account, password,session
功能描述:该模块可以用来实现pam认证的递归调用。
可带参数:
debug:将调试信息写入日志
service=name:指定调用的配置文件。
配置实例:
参考/etc/pam.d/login