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这支程序会根据PAM回传的结果决定下一个动作(重
2、新输入新密码或者通过验证!)从上头的说明,我们会知道重点其实是/etc/pam.d/里面的配置文件,以及配置文件所呼叫的PAM模块进行的验证工作!既然一直谈到passwd这个密码修改指令,那我们就来看看/etc/pam.d/passwd这个配置文件的内容是怎样吧!rootstudy#cat/etc/pam.d/passwd#%PAM-1.0=PAM版本的说明而已!authincludesystem-auth= 1000 quiet_successauthrequiredpam_deny.soaccountrequiredpam_unix.soaccountsufficientpam_local
3、user.soaccountsufficientpam_succeed_if.so uid 1000 quietaccountrequiredpam_permit.sopassword requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=passwordsufficientpam_unix.sosha512shadownulloktry_first_passuse_authtokpasswordrequiredpam_deny.sosessionoptionalpam_keyinit.s
4、orevokesessionrequiredpam_limits.so-sessionoptionalpam_systemd.sosessionsuccess=1default=ignorepam_succeed_if.soserviceincrondquietuse_uidsessionrequiredpam_unix.so上面这个表格当中使用到非常多的PAM模块,每个模块的功能都不太相同,详细的模块情报可以在你的系统中找到:/etc/pam.d/*:每个程序个别的PAM配置文件;/lib64/security/*:PAM模块文件的实际放置目录;/etc/security/*:其他PAM环境
5、的配置文件;/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等就是传统的终端机装置名称。那么安全的终端机设定呢?就写在/etc/securetty这个文
6、件中。你可以查阅一下该文件,就知道为什么root可以从tty1tty7登入,但却无法透过telnet登入Linux主机了!pam_nologin.so:这个模块可以限制一般用户是否能够登入主机之用。当/etc/nologin这个文件存在时,则所有一般使用者均无法再登入系统了!若/etc/nologin存在,则一般使用者在登入时,在他们的终端机上会将该文件的内容显示出来!所以,正常的情况下,这个文件应该是不能存在系统中的。但这个模块对root以及已经登入系统中的一般账号并没有影响。(注意喔!这与/etc/nologin.txt并不相同!)pam_selinux.so:SELinux是个针对程序来
7、进行细部管理权限的功能,SELinux这玩意儿我们会在第十六章的时候再来详细谈论。由于SELinux会影响到用户执行程序的权限,因此我们利用PAM模块,将SELinux暂时关闭,等到验证通过后,再予以启动!pam_console.so:当系统出现某些问题,或者是某些时刻你需要使用特殊的终端接口(例如RS232之类的终端联机设备)登入主机时,这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口(console)顺利的登入系统。pam_loginuid.so:我们知道系统账号与一般账号的UID是不同的!一般账号UID均大于1000才合理。因此,为了验证使用者的UID真的是我们所需要
8、的数值,可以使用这个模块来进行规范!pam_env.so:用来设定环境变量的一个模块,如果你有需要额外的环境变量设定,可以参考/etc/security/pam_env.conf这个文件的详细说明。pam_unix.so:这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管理,可以用在会议阶段的登录文件记录等,甚至也可以用在密码更新阶段的检验!非常丰富的功能!这个模块在早期使用得相当频繁喔!pam_pwquality.so:可以用来检验密码的强度!包括密码是否在字典中,密码输入几次都失败就断掉此次联机等功能,都是这模块提供的!最早之前其实使用的是pam_
9、cracklib.so这个模块,后来改成pam_pwquality.so这个模块,但此模块完全兼容于pam_cracklib.so,同时提供了/etc/security/pwquality.conf这个文件可以额外指定默认值!比较容易处理修改!pam_limits.so:还记得我们在第十章谈到的ulimit吗?其实那就是这个模块提供的能力!还有更多细部的设定可以参考:/etc/security/limits.conf内的说明。了解了这些模块的大致功能后,言归正传,讨论一下login的PAM验证机制流程是这样的:1.验证阶段(auth):首先,(a)会先经过pam_securetty.so判断,
10、如果使用者是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_nologin.so判断/etc/nologin是否存在,若存在则不许一般使用者登入;(b)接下来以pam_unix.so及pam_localuser.so进行账号管理,再以(c)pam_s
11、ucceed_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.会议阶段(session):(a)先以pam_selinux.so暂时关闭SELinux;(b)使用pam_limits.so设定好用户能够操作的系统资源;(c)登入成功后开始记录相关信息在登
12、录文件中;(d)以pam_loginuid.so规范不同的UID权限;(e)开启pam_selinux.so的功能。总之,就是依据验证类别(type)来看,然后先由login的设定值去查阅,如果出现“include system-auth”就转到system-auth文件中的相同类别,去取得额外的验证流程就是了。然后再到下一个验证类别,最终将所有的验证跑完!就结束这次的PAM验证啦!经过这样的验证流程,现在你知道为啥/etc/nologin存在会有问题,也会知道为何你使用一些远程联机机制时,老是无法使用root登入的问题了吧?没错!这都是PAM模块提供的功能啦!例题:为什么root无法以tel
13、net直接登入系统,但是却能够使用ssh直接登入?答:一般来说,telnet会引用login的PAM模块,而login的验证阶段会有/etc/securetty的限制!由于远程联机属于pts/n(n为数字)的动态终端机接口装置名称,并没有写入到/etc/securetty,因此root无法以telnet登入远程主机。至于ssh使用的是/etc/pam.d/sshd这个模块,你可以查阅一下该模块,由于该模块的验证阶段并没有加入pam_securetty,因此就没有/etc/securetty的限制!故可以从远程直接联机到服务器端。另外,关于telnet与ssh的细部说明,请参考鸟哥的Linux私
14、房菜服务器篇其他相关文件除了前一小节谈到的/etc/securetty会影响到root可登入的安全终端机,/etc/nologin会影响到一般使用者是否能够登入的功能之外,我们也知道PAM相关的配置文件在/etc/pam.d,说明文件在/usr/share/doc/pam-(版本),模块实际在/lib64/security/。那么还有没有相关的PAM文件呢?是有的,主要都在/etc/security这个目录内!我们底下介绍几个可能会用到的配置文件喔!limits.conf我们在第十章谈到的ulimit功能中,除了修改使用者的/.bashrc配置文件之外,其实系统管理员可以统一由PAM来管理的!
15、那就是/etc/security/limits.conf这个文件的设定了。这个文件的设定很简单,你可以自行参考一下该文件内容。我们这里仅作个简单的介绍:范例一:vbird1这个用户只能建立100MB的文件,且大于90MB会警告rootstudy#vim/etc/security/limits.confvbird1softfsize90000vbird1hardfsize100000#账号限制依据限制项目限制值#第一字段为账号,或者是群组!若为群组则前面需要加上,例如projecta#第二字段为限制的依据,是严格(hard),还是仅为警告(soft);#第三字段为相关限制,此例中限制文件容量,#
16、第四字段为限制的值,在此例中单位为KB。#若以vbird1登入后,进行如下的操作则会有相关的限制出现!vbird1study$ ulimit -a.(前面省略).file size(blocks,-f) 90000.(后面省略).vbird1study$ dd if=/dev/zero of=test bs=1 Mcount=110File size limit exceededvbird1study$ ll -block-size=K test-rw-rw-r-. 1vbird1 vbird190000KJul2201:33test#果然有限制到了范例二:限制pro1这个群组,每次仅能有一个
17、用户登入系统(maxlogins)rootstudy# vim /etc/security/limits.confpro1hardmaxlogins1#如果要使用群组功能的话,这个功能似乎对初始群组才有效喔!而如果你尝试多个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无法登入啦!_