谈完了配置文件的语法后,现在让我们来查阅一下 CentOS 5.x 提供的 PAM 默认文件的内容是啥吧!
由于我们常常需要透过各种方式登陆 (login) 系统,因此就来看看登陆所需要的 PAM 流程为何:
[root@www ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
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 include system-auth
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions...
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
# 我们可以看到,其实 login 也呼叫多次的 system-auth ,所以底下列出该配置文件
[root@www ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet \
use_uid
session required pam_unix.so
上面这个表格当中使用到非常多的 PAM 模块,每个模块的功能都不太相同,详细的模块情报可以在你的系统中找到:
/etc/pam.d/*:每个程序个别的 PAM 配置文件;
/lib/security/*:PAM 模块文件的实际放置目录;
/etc/security/*:其他 PAM 环境的配置文件;
/usr/share/doc/pam-*/:详细的 PAM 说明文件。
例如鸟哥使用未 update 过的 CentOS 5.2 ,pam_nologin 说明文件档在:
/usr/share/doc/pam-0.99.6.2/txts/README.pam_nologin。你可以自行查阅一下该模块的功能。
鸟哥这里仅简单介绍几个较常使用的模块,详细的信息还得要您努力查阅参考书呢! ^_^
pam_securetty.so:
限制系统管理员 (root) 只能够从安全的 (secure) 终端机登陆;那什么是终端机?例如
tty1, tty2 等就是传统的终端机装置名称。那么安全的终端机配置呢?
就写在 /etc/securetty 这个文件中。你可以查阅一下该文件,
就知道为什么 root 可以从 tty1~tty7 登陆,但却无法透过 telnet 登陆 Linux 主机了!
pam_nologin.so:
这个模块可以限制一般用户是否能够登陆主机之用。当 /etc/nologin
这个文件存在时,则所有一般使用者均无法再登陆系统了!若 /etc/nologin 存在,则一般使用者在登陆时,
在他们的终端机上会将该文件的内容显示出来!所以,正常的情况下,这个文件应该是不能存在系统中的。
但这个模块对 root 以及已经登陆系统中的一般账号并没有影响。
pam_selinux.so:
SELinux 是个针对程序来进行细部管理权限的功能,SELinux 这玩意儿我们会在第十七章的时候再来详细谈论。由于 SELinux
会影响到用户运行程序的权限,因此我们利用 PAM 模块,将 SELinux 暂时关闭,等到验证通过后,
再予以启动!
pam_console.so:
当系统出现某些问题,或者是某些时刻你需要使用特殊的终端接口 (例如 RS232 之类的终端联机设备) 登陆主机时,
这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口 (console) 顺利的登陆系统。
pam_loginuid.so:
我们知道系统账号与一般账号的 UID 是不同的!一般账号 UID 均大于 500 才合理。
因此,为了验证使用者的 UID 真的是我们所需要的数值,可以使用这个模块来进行规范!
pam_env.so:
用来配置环境变量的一个模块,如果你有需要额外的环境变量配置,可以参考
/etc/security/pam_env.conf 这个文件的详细说明。
pam_unix.so:
这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管理,
可以用在会议阶段的登录文件记录等,甚至也可以用在口令升级阶段的检验!非常丰富的功能!
这个模块在早期使用得相当频繁喔!
pam_cracklib.so:
可以用来检验口令的强度!包括口令是否在字典中,口令输入几次都失败就断掉此次联机等功能,都是这模块提供的!
这玩意儿很重要!
pam_limits.so:
还记得我们在十一章谈到的 ulimit 吗?
其实那就是这个模块提供的能力!还有更多细部的配置可以参考:
/etc/security/limits.conf 内的说明。
了解了这些模块的大致功能后,言归正传,讨论一下 login 的 PAM 验证机制流程是这样的:
验证阶段 (auth):首先,(a)会先经过 pam_securetty.so 判断,如果使用者是 root 时,则会参考 /etc/securetty 的配置;
接下来(b)经过 pam_env.so 配置额外的环境变量;再(c)透过 pam_unix.so 检验口令,若通过则回报 login
程序;若不通过则(d)继续往下以 pam_succeed_if.so 判断 UID 是否大于 500 ,若小于 500则回报失败,否则再往下
(e)以 pam_deny.so 拒绝联机。
授权阶段 (account):(a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登陆;
(b)接下来以 pam_unix 进行账号管理,再以 (c) pam_succeed_if.so 判断 UID 是否小于 500 ,若小于 500
则不记录登录信息。(d)最后以 pam_permit.so 允许该账号登陆。
口令阶段 (password):(a)先以 pam_cracklib.so 配置口令仅能尝试错误 3 次;(b)接下来以
pam_unix.so 透过 md5, shadow 等功能进行口令检验,若通过则回报 login 程序,若不通过则 (c)以 pam_deny.so
拒绝登陆。
会议阶段 (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 验证啦!
经过这样的验证流程,现在你知道为啥 /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 这个模块,
你可以查阅一下该模块,由于该模块的验证阶段并没有加入 pam_securetty ,因此就没有 /etc/securetty
的限制!故可以从远程直接联机到服务器端。
另外,关于 telnet 与 ssh 的细部说明,请参考鸟哥的 Linux 私房菜服务器篇