pam

pam Pluggable Authentication Modules for Linux
linux可植入式验证模块
先问一个问题:
我是root管理员,同时有很多普通用户也可以登录这个操作系统,我如何拒绝所有的普通用户登录?
/bin/bash --可以登录系统,可以登录ftp,可以收发邮件
/sbin/nologin --不能登录系统,可以登录ftp,可以收发邮件
/bin/false --不能登录系统,不能登录ftp,可以收发邮件
比如用下面的脚本可以实现
#!/bin/bash
awk -F: '$3>499 && $3!=65534 {print $1}' /etc/passwd |while read user
do
sed -i '/^'$user':/s/\/bin\/bash/\/sbin\/nologin/' /etc/passwd
done
# ls /lib64/security/ --这里有大量的pam模块
这么多模块,如何查看使用方法
# man pam_access --这就是查看pam_access.so的man文档,以此类推其它模块
# ldd /usr/sbin/vsftpd |grep libpam --支持这个模块,则表示这个程序可以由pam来控制
libpam.so.0 => /lib64/libpam.so.0 (0x00007f3fe253a000)
PAM的配置文件一般存放在/etc/pam.conf文件,或者/etc/pam.d/目录下。不过现在一般都会存放在/etc/pam.d/目录下,之下是相对于每个需要被PAM控制的程序的独立配置文件。当一个程序的验证方式配置在pam.conf和pam.d/下某文件中出现时,以pam.d/目录下文件为准
--你可以这样理解,用户名和密码这种简单验证就相当于是一个简单的锁,只有用户名和密码对应正确就可以成功。
--而pam的各种模块相当于是具备各种功能的锁(除了普通机械锁,可能还有看门狗,密码锁,声音识别,指纹识别,人脸识别,眼角膜识别等等).
--把这些锁安装到门或者柜子这些需要加固的东西上(门和柜子在linux里就是类似系统login,ssh登录,ftp登录这种相应的程序).
--你可以控制打开其中一个或几个锁,你就可以成功进入;也可以控制你要打开所有的锁,你就可以成功进入
# 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 required pam_loginuid.so
session optional pam_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.so force revoke
session include system-auth
-session optional pam_ck_connector.so
一般第一列指定的内容是:module-type,一共就只有4种,分别是:
auth:对用户身份进行识别,如提示输入密码,判断是否root;
account:对账号各项属性进行检查,如是否允许登录,是否达到最大用户数;
session:定义登录前,及退出后所要进行的操作,如登录连接信息,用户数据的打开和关闭,挂载fs;
password:使用用户信息来更新数据,如修改用户密码。
第二列内容是:control-flag,有很多,不过一般常用的是4种,分别是:
规定如何处理PAM模块鉴别认证的结果,简而言之就是鉴别认证成功或者失败之后会发生什么事,如何进行控制。单个应用程序可以调用多种底层模块,通常称为“堆叠”。对应于某程序按照配置文件中出现顺序执行的所有模块成为“堆”,堆中的各模块的地位与出错时的处理方式由control_flag栏的取值决定,他的四种可能的取值分别为required、Requisite、sufficient或_optional:
required:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件。换句话说,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。 反正说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。
requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。与上面的required相比,似乎要显得更光明正大一些。
sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。即便后面的层叠模块使用了requisite或者required控制标志也是一样。当标记为sufficient的模块失败时,sufficient模块会当做 optional对待。因此拥有sufficient 标志位的配置项在执行验证出错的时候并不会导致整个验证失败,但执行验证成功之时则大门敞开。所以该控制位的使用务必慎重。
optional:他表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。
include:表示在验证过程中调用其他的PAM配置文件。在RHEL系统中有相当多的应用通过完整调用/etc/pam.d/system-auth来实现认证而不需要重新逐一去写配置项。这也就意味着在很多时候只要用户能够登录系统,针对绝大多数的应用程序也能同时通过认证。
老板指定的亲戚 sufficient required
无犯罪记录 requisite optional
不要工资 sufficient optional
你吃饭了吗 optional optional
技术笔试 required optional
技术主管面试 required optional
HR面试 required optional
条件一 required
条件二 required
条件三 required
--表示不管如何三个条件都要判断,如果三个条件有一个或多个失败,最后都会告诉你失败,但你不知道是哪个失败。只有三个条件都成功,才会最终成功
条件一 required
条件二 requisite
条件三 required
--表示三个条件都成功,最终才会成功。如果第二个条件失败,则不会验证第三个条件,直接最终失败。如果第一个条件失败,第二个成功,第三个条件仍然验证(但成功与否不重要),最终是失败。
条件一  sufficient
条件二  required
条件三  required
--表示满足条件一,则验证成功。或者条件一失败,但条件二和条件三同时满足,也验证成功
条件一  requisite
条件二  sufficient
条件三  required
条件四  required
--表示条件一必须满足,否则验证直接失败。条件二成功,则验证直接成功。如果条件二失败,则需要条件三和条件四同时满足,才验证成功。
条件一 required
条件二 requisite
条件三 required
条件四 sufficient
条件五 required
条件六 required
条件七 requisite
条件八 sufficient
条件九 required
条件十 required
--注意:required如果失败,不会验证后面的sufficient
最终成功的情况有:
第一种:1,2,3,4要成功。
第二种:1,2,3,5,6,7,8要成功,4失败
第三种:1,2,3,5,6,7,9,10都成功,4,8失败
例1,根据/etc/pam.d/login的第三行来进行测试
account required pam_nologin.so
# man pam_nologin
# touch /etc/nologin
然后登出用户,再用普通用户登录测试,发现所有普通用户都登录不了系统了
# rm /etc/nologin -rf
删除此文件,普通用户又可以登录
测试时,可以用3级别的普通用户登陆来测试,或者远程用普通用户ssh来测试。不要使用su - 普通用户测试
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
可以通过查看/var/log/secure日志看到pam相关的拒绝信息
--前两个例子就是用于控制系统用户登录的,你可以将这两个模块应用到ssh,ftp,samba等相关服务也可以实现相同的效果 
例3,vim /etc/pam.d/login --把下面这句加到最前面
account requisite pam_time.so
vim /etc/security/time.conf --然后修改这个配置文件,在最后加上
login;*;abc;!Th1700-1800 --表示针对login程序实现abc用户在任何终端(只对tty终端有效,图形登录无效)非周四的17点到18点才能登录
login;tty1;abc;!We1100-1300 --abc用户在周三的11点到13点不能在tty1登录系统,但可以在tty2,tty3等其它终端正常登录
例4,vim /etc/pam.d/sshd --把下面这句加到最前面
account requisite pam_time.so
vim /etc/security/time.conf
sshd;*;abc;!Th1700-1800 --这样测试就是abc用户在周四的17点到18点不能ssh登录
--例3和例4是通过pam_time模块来控制服务的用户在特定的时间才能登录,同样也可以应用到vsftpd等服务
例5:控制密码复杂度
# vim /etc/pam.d/passwd --在此文件最前面加上下面一行
password required pam_cracklib.so minlen=8 minclass=4 difok=3  maxrepeat=3 maxsequence=5
测试:使用普通用户自己改自己的密码来测试(这里要求是长度为8,字符类型要包含4类:数字,小写字母,大写字母,符号;difok=3表示新改的密码和老密码最少需要变动3个字符)
maxrepeat=3表示重复相同字节不要超过3个,比如666可以,但6666就不行
maxsequence=5表示类似12345或febcd这种连续字节不能超过5位
例6,vim /etc/pam.d/sshd --把下面这句加到最前面
auth required pam_tally2.so deny=1 lock_time=10
--测试结果为当你ssh登录时,如果输错密码,那么你再紧接着输对密码也不能成功登录,必须要等10秒之后再输对才能成功登录,但拒绝一次,因为deny=1
例7,vim /etc/pam.d/login --验证此文件默认有的第一句pam_securetty模块
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
# vim /etc/securetty
tty2 --只留下tty2,表示只能在tty2进行root用户登录(非root用户不受影响)
例8:把例7应用到ssh进行测试
vim /etc/pam.d/sshd --最前面加上下面这一句
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
# vim /etc/securetty
tty2
ssh --在原来的基础上加上ssh才可以被root用户ssh登录(非root用户不受影响)
例9, vim /etc/pam.d/sshd --把下面这句加到最前面
account requisite pam_echo.so haha
--测试结果为ssh这台机器成功,就会显示后面的字符串haha
你想要登录ssh时显示一个信息,有哪些方法:
方法1
/etc/motd
方法2
/etc/profile
方法3
# vim /etc/ssh/sshd_config
Banner /etc/ssh/banner
# vim /etc/ssh/banner
haha
# systemctl restart sshd
方法4
pam
posted @ 2018-06-19 22:08  Sky-wings  阅读(402)  评论(0编辑  收藏  举报