1、PAM模块简介 PAM是由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd这个指令的呼叫PAM来说明好了。当你执行passwd后,这支程序呼叫PAM的流程是: 1. 用户开始执行/usr/bin/passwd这支程序,并输入密码; 2. passwd呼叫PAM模块进行验证; 3. PAM模块会到/etc/pam.d/找寻与程序(passwd)同名的配置文件; 4. 依据/etc/pam.d/passwd内的设定,引用相关的PAM模块逐步进行验证分析; 5. 将验证结果(成功、失败以及其他讯息)回传给passwd这支程序; 6. passwd这支程序
2、会根据PAM回传的结果决定下一个动作(重新输入新密码或者通过验证!) 从上头的说明,我们会知道重点其实是/etc/pam.d/里面的配置文件,以及配置文件所呼叫的PAM模块进行的验证工作!既然一直谈到passwd这个密码修改指令,那我们就来看看/etc/pam.d/passwd这个配置文件的内容是怎样吧! [root@study~]#cat/etc/pam.d/passwd #%PAM-1.0 <==PAM版本的说明而已! auth include system-auth <==每一行都是一个验证的过程 account include system-aut
3、h password substack system-auth -password optional pam_gnome_keyring.souse_authtok password substack postlogin 验证类别 控制标准 PAM模块与该模块的参数 在这个配置文件当中,除了第一行宣告PAM版本之外,其他任何“#”开头的都是批注,而每一行都是一个独立的验证流程,每一行可以区分为三个字段,分别是验证类别(type)、控制标准(flag)、PAM的模块与该模块的参数。底下我们先来谈谈验证类别与控制标准这两项数据吧! Tips:你会发现在我们上面的表
4、格当中出现的是“include(包括)”这个关键词,他代表的是“请呼叫后面的文件来作为这个类别的验证”,所以,上述的每一行都要重复呼叫/etc/pam.d/system-auth那个文件来进行验证的意思! 第一个字段:验证类别(Type) 验证类别主要分为四种,分别说明如下: • auth是authentication(认证)的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要密码来检验的,所以后续接的模块是用来检验用户的身份。 • account是account(账号),大部分是在进行authorization(授权),这种类别则主要在检验使用者是否具有正确的权限,举
5、例来说,当你使用一个过期的密码来登入时,当然就无法正确的登入了。 • session session是会议期间的意思,所以session管理的就是使用者在这次登入(或使用这个指令)期间,PAM所给予的环境设定。这个类别通常用在记录用户登入与注销时的信息!例如,如果你常常使用su或者是sudo指令的话,那么应该可以在/var/log/secure里面发现很多关于pam的说明,而且记载的数据是“sessionopen,sessionclose”的信息! • password password就是密码嘛!所以这种类别主要在提供验证的修订工作,举例来说,就是修改/变更密码啦! 这四个验证的类
6、型通常是有顺序的,不过也有例外就是了。会有顺序的原因是,(1)我们总是得要先验证身份(auth)后,(2)系统才能够藉由用户的身份给予适当的授权与权限设定(account),而且(3)登入与注销期间的环境才需要设定,也才需要记录登入与注销的信息(session)。如果在运作期间需要密码修订时,(4)才给予password的类别。这样说起来,自然是需要有点顺序吧! 第二个字段:验证的控制旗标(controlflag) 那么“验证的控制旗标(controlflag)”又是什么?简单的说,他就是“验证通过的标准”啦!这个字段在管控该验证的放行方式,主要也分为四种控制方式: • required
7、 此验证若成功则带有success(成功)的标志,若失败则带有failure的标志,但不论成功或失败都会继续后续的验证流程。由于后续的验证流程可以继续进行,因此相当有利于资料的登录(log),这也是PAM最常使用required的原因。 • requisite 若验证失败则立刻回报原程序failure的标志,并终止后续的验证流程。若验证成功则带有success的标志并继续后续的验证流程。这个项目与required最大的差异,就在于失败的时候还要不要继续验证下去?由于requisite是失败就终止,因此失败时所产生的PAM信息就无法透过后续的模块来记录了。 • sufficient 若
8、验证成功则立刻回传success给原程序,并终止后续的验证流程;若验证失败则带有failure标志并继续后续的验证流程。这玩意儿与requisits刚好相反! • optional 这个模块控件目大多是在显示讯息而已,并不是用在验证方面的。 如果将这些控制旗标以图示的方式配合成功与否的条件绘图,会有点像底下这样: 程序运作过程中遇到验证时才会去呼叫PAM,而PAM验证又分很多类型与控制,不同的控制旗标所回报的讯息并不相同。如上图所示,requisite失败就回报了并不会继续,而sufficient则是成功就回报了也不会继续。至于验证结束后所回报的信息通常是“succes或failure
9、而已,后续的流程还需要该程序的判断来继续执行才行。 常用模块简介 谈完了配置文件的语法后,现在让我们来查阅一下CentOS5.x提供的PAM预设文件的内容是啥吧! 由于我们常常需要透过各种方式登入(login)系统,因此就来看看登入所需要的PAM流程为何: [root@study~]#cat/etc/pam.d/login #%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth
10、 include postlogin account required pam_nologin.so account include system-auth password include system-auth #pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so session optional pam
11、console.so #pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.soforcerevoke session include system-auth session include postlog
12、in -session optional pam_ck_connector.so #我们可以看到,其实login也呼叫多次的system-auth,所以底下列出该配置文件 [root@study~]#cat/etc/pam.d/system-auth #%PAM-1.0 #This file is auto-generated. #User changes will be destroyed the next time auth config is run. auth required pam_env.so auth sufficient pam
13、fprintd.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet
14、 account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.sosha512shadownulloktry_first_passuse_authtok password required pam_deny.so session optional pam_keyinit.sorevoke session
15、 required pam_limits.so -session optional pam_systemd.so session [success=1default=ignore]pam_succeed_if.soserviceincrondquietuse_uid session required pam_unix.so 上面这个表格当中使用到非常多的PAM模块,每个模块的功能都不太相同,详细的模块情报可以 在你的系统中找到: •/etc/pam.d/*:每个程序个别的PAM配置文件; •/lib64/security/*:PAM模块文件的实际放置
16、目录; •/etc/security/*:其他PAM环境的配置文件; •/usr/share/doc/pam-*/:详细的PAM说明文件。 例如鸟哥使用未update过的CentOS7.1,pam_nologin说明文件档在: /usr/share/doc/pam-1.1.8/txts/README.pam_nologin。你可以自行查阅一下该模块的功能。鸟哥这里仅简单介绍几个较常使用的模块,详细的信息还得要您努力查阅参考书呢! •pam_securetty.so: 限制系统管理员(root)只能够从安全的(secure)终端机登入;那什么是终端机?例如tty1,tty2等就是传统
17、的终端机装置名称。那么安全的终端机设定呢?就写在/etc/securetty这个文件中。你可以查阅一下该文件,就知道为什么root可以从tty1~tty7登入,但却无法透过telnet登入Linux主机了! •pam_nologin.so: 这个模块可以限制一般用户是否能够登入主机之用。当/etc/nologin这个文件存在时,则所有一般使用者均无法再登入系统了!若/etc/nologin存在,则一般使用者在登入时,在他们的终端机上会将该文件的内容显示出来!所以,正常的情况下,这个文件应该是不能存在系统中的。但这个模块对root以及已经登入系统中的一般账号并没有影响。(注意喔!这与/etc
18、/nologin.txt并不相同!) •pam_selinux.so: SELinux是个针对程序来进行细部管理权限的功能,SELinux这玩意儿我们会在第十六章的时候再来详细谈论。由于SELinux会影响到用户执行程序的权限,因此我们利用PAM模块,将SELinux暂时关闭,等到验证通过后,再予以启动! •pam_console.so: 当系统出现某些问题,或者是某些时刻你需要使用特殊的终端接口(例如RS232之类的终端联机设备)登入主机时,这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口(console)顺利的登入系统。 •pam_loginuid.so:
19、我们知道系统账号与一般账号的UID是不同的!一般账号UID均大于1000才合理。因此,为了验证使用者的UID真的是我们所需要的数值,可以使用这个模块来进行规范! •pam_env.so: 用来设定环境变量的一个模块,如果你有需要额外的环境变量设定,可以参考/etc/security/pam_env.conf这个文件的详细说明。 •pam_unix.so: 这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管理,可以用在会议阶段的登录文件记录等,甚至也可以用在密码更新阶段的检验!非常丰富的功能!这个模块在早期使用得相当频繁喔! •pam_pwqu
20、ality.so: 可以用来检验密码的强度!包括密码是否在字典中,密码输入几次都失败就断掉此次联机等功能,都是这模块提供的!最早之前其实使用的是pam_cracklib.so这个模块,后来改成pam_pwquality.so这个模块,但此模块完全兼容于pam_cracklib.so,同时提供了/etc/security/pwquality.conf这个文件可以额外指定默认值!比较容易处理修改! •pam_limits.so: 还记得我们在第十章谈到的ulimit吗?其实那就是这个模块提供的能力!还有更多细部的设定可以参考:/etc/security/limits.conf内的说明。 了
21、解了这些模块的大致功能后,言归正传,讨论一下login的PAM验证机制流程是这样的: 1.验证阶段(auth):首先,(a)会先经过pam_securetty.so判断,如果使用者是root时,则会参考/etc/securetty的设定;接下来(b)经过pam_env.so设定额外的环境变量;再(c)透过pam_unix.so检验密码,若通过则回报login程序;若不通过则(d)继续往下以pam_succeed_if.so判断UID是否大于1000,若小于1000则回报失败,否则再往下(e)以pam_deny.so拒绝联机。 2.授权阶段(account): (a)先以pam_nolog
22、in.so判断/etc/nologin是否存在,若存在则不许一般使用者登入;(b)接下来以pam_unix.so及pam_localuser.so进行账号管理,再以(c)pam_succeed_if.so判断UID是否小于1000,若小于1000则不记录登录信息。(d)最后以pam_permit.so允许该账号登入。 3.密码阶段(password):(a)先以pam_pwquality.so设定密码仅能尝试错误3次;(b)接下来以pam_unix.so透过sha512,shadow等功能进行密码检验,若通过则回报login程序,若不通过则(c)以pam_deny.so拒绝登入。 4.会议
23、阶段(session):(a)先以pam_selinux.so暂时关闭SELinux;(b)使用pam_limits.so设定好用户能够操作的系统资源;(c)登入成功后开始记录相关信息在登录文件中;(d)以pam_loginuid.so规范不同的UID权限;(e)开启pam_selinux.so的功能。 总之,就是依据验证类别(type)来看,然后先由login的设定值去查阅,如果出现“include system-auth”就转到system-auth文件中的相同类别,去取得额外的验证流程就是了。然后再到下一个验证类别,最终将所有的验证跑完!就结束这次的PAM验证啦! 经过这样的验证流程
24、现在你知道为啥/etc/nologin存在会有问题,也会知道为何你使用一些远程联机机制时,老是无法使用root登入的问题了吧?没错!这都是PAM模块提供的功能啦! 例题:为什么root无法以telnet直接登入系统,但是却能够使用ssh直接登入? 答:一般来说,telnet会引用login的PAM模块,而login的验证阶段会有/etc/securetty的限制!由于远程联机属于pts/n(n为数字)的动态终端机接口装置名称,并没有写入到/etc/securetty,因此root无法以telnet登入远程主机。至于ssh使用的是/etc/pam.d/sshd这个模块,你可以查阅一下该模块
25、由于该模块的验证阶段并没有加入pam_securetty,因此就没有/etc/securetty的限制!故可以从远程直接联机到服务器端。 另外,关于telnet与ssh的细部说明,请参考鸟哥的Linux私房菜服务器篇 其他相关文件 除了前一小节谈到的/etc/securetty会影响到root可登入的安全终端机,/etc/nologin会影响到一般使用者是否能够登入的功能之外,我们也知道PAM相关的配置文件在/etc/pam.d,说明文件在/usr/share/doc/pam-(版本),模块实际在/lib64/security/。那么还有没有相关的PAM文件呢?是有的,主要都在/etc
26、/security这个目录内!我们底下介绍几个可能会用到的配置文件喔! limits.conf 我们在第十章谈到的ulimit功能中,除了修改使用者的~/.bashrc配置文件之外,其实系统管理员可以统一由PAM来管理的!那就是/etc/security/limits.conf这个文件的设定了。这个文件的设定很简单,你可以自行参考一下该文件内容。我们这里仅作个简单的介绍: 范例一:vbird1这个用户只能建立100MB的文件,且大于90MB会警告 [root@study~]#vim/etc/security/limits.conf vbird1 soft fsize 9
27、0000 vbird1 hard fsize 100000 #账号限制依据限制项目限制值 #第一字段为账号,或者是群组!若为群组则前面需要加上@,例如@projecta #第二字段为限制的依据,是严格(hard),还是仅为警告(soft); #第三字段为相关限制,此例中限制文件容量, #第四字段为限制的值,在此例中单位为KB。 #若以vbird1登入后,进行如下的操作则会有相关的限制出现! [vbird1@study~]$ ulimit -a ....(前面省略).... file size (blocks,-f) 90000 ....(后面省略)....
28、 [vbird1@study~]$ dd if=/dev/zero of=test bs=1 Mcount=110 File size limit exceeded [vbird1@study~]$ ll --block-size=K test -rw-rw-r--. 1 vbird1 vbird1 90000K Jul 22 01:33 test #果然有限制到了 范例二:限制pro1这个群组,每次仅能有一个用户登入系统(maxlogins) [root@study~]# vim /etc/security/limits.conf @pro1 hard maxlogi
29、ns 1 #如果要使用群组功能的话,这个功能似乎对初始群组才有效喔!而如果你尝试多个pro1的登入时, #第二个以后就无法登入了。而且在/var/log/secure文件中还会出现如下的信息: #pam_limits(login:session):Too many logins (max 1) for pro1 这个文件挺有趣的,而且是设定完成就生效了,你不用重新启动任何服务的!但是PAM有个特殊的地方,由于他是在程序呼叫时才予以设定的,因此你修改完成的数据,对于已登入系统中的用户是没有效果的,要等他再次登入时才会生效喔!另外,上述的设定请在测试完成后立刻批注掉,否则下次这两个使用者登入就会发生些许问题啦!^_^ /var/log/secure,/var/log/messages 如果发生任何无法登入或者是产生一些你无法预期的错误时,由于PAM模块都会将数据记载在/var/log/secure当中,所以发生了问题请务必到该文件内去查询一下问题点!举例来说,我们在limits.conf的介绍内的范例二,就有谈到多重登入的错误可以到/var/log/secure内查阅了!这样你也就知道为何第二个pro1无法登入啦!^_^






