Linux学习笔记(十六)

PAM 模块简介 (Pluggable Authentication Modules, 嵌入式模块)

PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,叧要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。由于 PAM 仅是一套验证的机制,又可以提供给其他程序所呼叫引用,因此不论你使用什么程序,都可以使用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 回传的结果决定下一个动作 (重新输入新密码或者通过验证!

我们来看看 /etc/pam.d/passwd 这个配置文件的内容是这样的! 

[root@www ~]# cat /etc/pam.d/passwd 

#%PAM-1.0  <==PAM版本的说明而已! 

auth       include      system-auth <==每一行都是一个验证的过程 

account    include      system-auth 

password   include      system-auth 

验证类别   控制标准     PAM 模块与该模块的参数

第一个字段:验证类别 (Type) 

验证类别主要分为四种,分别说明如下: 

auth 是 authentication (认证的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要密码来检验的, 所以后续接的模块是用来检验用户的身份。 

Account是 account (账号大部分是在进行 authorization (授权),这种类别则主要在检验使用者是否具有正确的权限, 举例来说,当你使用一个过期的密码来登入时,当然就无法正确的登入了。 

Session会议期间的意义,所以 session 管理的就是使用者在这次登入 (或使用这个指期间,PAM 所给予的环境设定。 这个类别通常用在记录用户登入与注销时的信息!例如,如果你常常使用 su 或者是 sudo 指令的话, 那么应该可以在 /var/log/secure 里面发现很多关于pam 的说明,而且记载的数据是『session open, session close』的信息!  

password 就是密码嘛!所以这种类别主要在提供验证的修订工作,举例来说,就是修改/变更密码啦! 

这四个验证的类型通常是有顺序的

第二个字段:验证的控制旗标 (control flag) 

那么『验证的控制旗标(control flag)』就是『验证通过的标准』啦! 这个字段在管控该验证的放行方式,主要也分为四种控制方式: 

required 此验证若成功则带有 success (成功的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后续的验证流程。 由于后续的验证流程可以继续进行,因此相当有利于资料的登录 (log) ,这也是 PAM 最常使用 required 的原因。 

requisite 若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志并继续后续的验证流程。 这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去?由于 requisite 是失败就终止, 因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。 

sufficient 若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续后续的验证流程。 这玩意儿与 requisits 刚好相反! 

optional 这个模块控件目大多是在显示讯息而已,并不是用在验证方面的。

常用模块简介

·  /etc/pam.d/*:每个程序个别的 PAM 配置文件; 

·  /lib/security/*PAM 模块档案的实际放置目录;

·  /etc/security/*:其他 PAM 环境的配置文件; 

·  /usr/share/doc/pam-*/:详细的 PAM 说明文件。

鸟哥这里仅简单介绍几个较常使用的模块,详细的信息还得要您努力查阅参考书呢! ^_^ 

pam_securetty.so:限制系统管理员 (root) 只能够从安全的(secure) 终端机登入;那什么是终端机?例如 tty1, tty2 等就是传统的终端机装置名称。那么安全的终端机设定呢? 就写在 /etc/securetty 这个档案中。你可以查阅一下该档案, 就知道为什么 root 可以从 tty1~tty7 登入,但却无法透过 telnet 登入 Linux 主机了! 

pam_nologin.so:这个模块可以限制一般用户是否能够登入主机。当 /etc/nologin 这个档案存在时,则所有一般使用者均无法再登入系统了!若 /etc/nologin 存在,则一般使用者在登入时, 在他们的终端机上会将该档案的内容显示出来!所以,正常的情况下,这个档案应该是不能存在系统中的。 但这个模块对 root 以及已经登入系统中的一般账号并没有影响。 

pam_selinux.soSELinux 是个针对程序来进行细部管理权限的功能,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 验证机制流程是这样的: 

1.  验证阶段 (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 拒绝联机。  

2.  授权阶段 (account)(a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登入; (b)接下来以 pam_unix 进行账号管理,再以 (c) pam_succeed_if.so 判断 UID 是否小于 500 ,若小于500 则不记录登录信息。(d)最后以 pam_permit.so 允许该账号登入。 

3.  密码阶段 (password)(a)先以 pam_cracklib.so 设定密码仅能尝试错误3次;(b)接下来以pam_unix.so 透过 md5, shadow 等功能进行密码检验,若通过则回报 login 程序,若不通过则 (c)以 pam_deny.so 拒绝登入。 

4.  会议阶段 (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 验证啦!

其他相关档案 

limits.conf 

我们在第十一章谈到的 ulimit 功能中, 除了修改使用者的 ~/.bashrc 配置文件之外,其实系统管理员可以统一藉由 PAM 来管理的! 那就是 /etc/security/limits.conf 这个档案的设定了。这个档案的设定很简单,你可以自行参考一下该档案内容。 我们这里仅作个简单的介绍: 

范例一:vbird1 这个用户只能建立 100MB 的档案,且大于 90MB 会警告 

[root@www ~]# vi /etc/security/limits.conf 

vbird1  soft    fsize     90000 

vbird1  hard    fsize    100000 

#账号   限制依据 限制项目   限制值 

第一字段为账号,或者是群组!若为群组则前面需要加上 ,例如 @projecta 

第二字段为限制的依据,是严格(hard),还是仅为警告(soft); 

第三字段为相关限制,此例中限制档案容量, 

第四字段为限制的值,在此例中单位为 KB。 

若以 vbird1 登入后,进行如下的操作则会有相关的限制出现!  

[vbird1@www ~]$ ulimit -a 

....(前面省略).... 

file size               (blocks, -f) 90000 

....(后面省略)....  

[vbird1@www ~]$ dd if=/dev/zero of=test bs=1M count=110 

File size limit exceeded 

[vbird1@www ~]$ ll -k test 

-rw-rw-r-- 1 vbird1 vbird1 90000 Mar  4 11:30 test 

果然有限制到了 

范例二:限制pro1 这个群组,每次仅能有一个用户登入系统 (maxlogins) 

[root@www ~]# vi /etc/security/limits.conf 

@pro1   hard   maxlogins   1 

如果要使用群组功能的话,这个功能似乎对初始群组才有效喔! 

而如果你尝试多个 pro1 的登入时,第二个以后就无法登入了。 

而且在 /var/log/secure 档案中还会出现如下的信息: 

# pam_limits(login:session): Too many logins (max 1) for pro1  

/var/log/secure, /var/log/messages 

如果发生任何无法登入或者是产生一些你无法预期的错误时,由于 PAM 模块都会将数据记载在 /var/log/secure 当中,所以发生了问题请务必到该档案内去查询一下问题点!举例来说, 我们在 limits.conf 的介绍内的范例二,就有谈到多重登入的错误可以到 /var/log/secure 内查阅了! 这样你也就知道为何第二个 pro1 无法登入啦!^_^ 

Linux 主机上的用户讯息传递

查询使用者: w, who, last, lastlog 

那如果你想要知道目前已登入在系统上面的用户呢?可以透过 或 who 来查询喔!如下范例所示: 

[root@www ~]# w 

 13:13:56 up 13:00,  1 user,  load average: 0.08, 0.02, 0.01 

USER   TTY    FROM            LOGIN@   IDLE   JCPU   PCPU WHAT 

root   pts/1  192.168.1.100   11:04    0.00s  0.36s  0.00s -bash 

vbird1 pts/2  192.168.1.100   13:15    0.00s  0.06s  0.02s w 

第一行显示目前的时间、开机 (up) 多久,几个用户在系统上平均负载等; 

第二行只是各个项目的说明, 

第三行以后,每行代表一个使用者。如上所示,root 登入并取得终端机名 pts/1 之意。 

[root@www ~]# who 

root     pts/1        2009-03-04 11:04 (192.168.1.100) 

vbird1   pts/2        2009-03-04 13:15 (192.168.1.100) 

另外,如果您想要知道每个账号的最近登入的时间,则可以使用 lastlog 这个指令喔! lastlog 会去读取 /var/log/lastlog 档案,结果将数据输出如下表: 

[root@www ~]# lastlog 

Username    Port   From           Latest 

root        pts/1  192.168.1.100  Wed Mar  4 11:04:22 +0800 2009 

bin                                        **Never logged in** 

....(中间省略).... 

vbird1      pts/2  192.168.1.100  Wed Mar  4 13:15:56 +0800 2009 

....(以下省略).... 

这样就能够知道每个账号的最近登入的时间啰~ ^_^

 

使用者对谈: write, mesg, wall 

那么我是否可以跟系统上面的用户谈天说地呢?当然可以啦!调用 write 这个指令即可。 write 可以直接将讯息传给接收者啰!举例来说,我们的 Linux 目前有 vbird1 与 root 两个人在线, 我的 root 要跟 vbird1 讲话,可以这样做: 

[root@www ~]# write 使用者账号 [用户所在终端接口

[root@www ~]# who 

root     pts/1    2009-03-04 11:04 (192.168.1.100) 

vbird1   pts/2    2009-03-04 13:15 (192.168.1.100)  <==有看到 vbird1 在线 

[root@www ~]# write vbird1 pts/2 

Hello, there: 

Please don't do anything wrong...  <==这两行是 root 写的信息! 

结束时,请按下 [crtl]-d 来结束输入。此时在 vbird1 的画面中,会出现:

Message from root@www.vbird.tsai on pts/1 at 13:23 ... 

Hello, there: 

Please don't do anything wrong... 

EOF 

怪怪~立刻会有讯息响应给 vbird1 !不过......当时 vbird1 正在查资料,哇! 这些讯息会立刻打断 vbird1 原本的工作喔!所以,如果 vbird1 这个人不想要接受任何讯息,直接下达这个动作: 

[vbird1@www ~]$ mesg n 

[vbird1@www ~]$ mesg 

is n 

不过,这个 mesg 的功能对 root 传送来的讯息没有抵挡的能力!所以如果是 root 传送讨息, vbird1 还是得要收下。 但是如果 root 的 mesg 是 ,那么 vbird1 写给 root 的信息会变这样: 

[vbird1@www ~]$ write root 

write: root has messages disabled 

了解乎?如果想要解开的话,再次下达『 mesg y 』就好啦!想要知道目前的 mesg 状态,直接下达『 mesg 』即可!瞭呼? 相对于write 是仅针对一个使用者来传『简讯』,我们还可以『对所有系统上面的用户传送简讯 (广播)』哩~ 如何下达?用 wall 即可啊!他的做法也是很简单的喔! 

[root@www ~]# wall "I will shutdown my linux server..." 

然后你就会发现所有的人都会收到这个简讯呢!  

使用者邮件信箱: mail 

使用 mail 这个指令即可!直接这样下达:『 mail username@localhost -s "邮件标题" 』即可! 一般来说,如果是寄给本机上的使用者,基本上,连『 @localhost 』都不用写啦! 举例来说,我以 root 寄信给 vbird1 ,信件标题是『 nice to meet you 』,则:

[root@www ~]# mail vbird1 -s "nice to meet you"

Hello, D.M. Tsai

Nice to meet you in the network.

You are so nice.  byebye!

.    <==这里很重要喔,结束时,最后一行输入小数点 . 即可!

Cc:  <==这里是所谓的『副本』,不需要寄给其它人,所以直接 [Enter]

[root@www ~]#  <==出现提示字符,表示输入完毕了!

如此一来,你就已经寄出一封信给 vbird1 这位使用者啰,而且,该信件标题为: nice to meet you,信件内容就如同上面提到的。不过,你或许会觉得 mail 这个程序不好用~ 因为在信件编写的过程中,如果写错字而按下 Enter 进入次行,前一行的数据很难删除ㄟ! 那怎么办?没关系啦!我们使用数据流重导向啊!呵呵!利用那个小于的符号 ( < ) 就可以达到取代键盘输入的要求了。也就是说,你可以先用 vi 将信件内容编好, 然后再以 mail vbird1 -s "nice to meet you" < filename 来将档案内容传输即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值