博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAM认证机制详情
阅读量:6094 次
发布时间:2019-06-20

本文共 7545 字,大约阅读时间需要 25 分钟。

               PAM(Pluggable Authentication Modules)认证机制详情
                                            作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
 
 
 一.介绍PAM
  PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。PAM可以根据用户的网段、时间、用户名、密码等实现认证。并不是所有需要验证的服务都使用PAM来验证,如MySQL-Server,httpd就没有安装相应的PAM文件(因此我们可以说pam只对简单的应用有认证功能,对于应用机制比较复杂的需要其自己编写相应的认证机制代码啦)。当然,程序通过了PAM的验证之后,PAM程序还会持续跟踪验证后的对象,对其做相应的访问限制。PAM就很像人力资源部门,当你入职一下公司的时候是人力得认证你,等认证成功后你才可以入职,而入职之后并不是人力部门就不管理了,人力资源部门还是会持续监督你在公司从入职到离职的行为并做相应的操作。
 
二.PAM的原理
1.PAM认证流程
  当一个简单的应用程序需要用到认证功能时,会找到Linux的PAM模块来进行认证功能。PAM是一个核心模块,因此它并不负责认证,而是应用程序自定义的PAM配置文件,这个自定的PAM配置文件中记录了会调用相应的模块进行认证(当然PAM也是需要依赖“/etc/nsswitch.conf”这个配置文件去找相关的文件哟)。PAM读取配置文件之后会根据读取到的内容进行相应的认证操作(会根据认证类型和控制流程进行认证,下面会有介绍),最后会将认真的结构返回给应用程序。
2.PAM配置文件格式
  如果我们使用PAM的核心配置文件可以用一个文件来管理(/etc/pam.conf),也可以用多个文件进行管理(/etc/pam.d/service)。
a>./etc/pam.conf
  如果我们使用一个配置文件进行认真的话,可以清楚的知道每一行的规则是应用在哪个服务上的,当然如果你这样做的话会导致配置文件过大!具体格式如下:“Service(服务) type(认证类型) control(控制流程,控制标记) module-path(模块路径)module-arguments(模块参数)”
b>./etc/pam.d/service
  如果想要把每个应用程序都单独用一个配置文件信息管理的话,只需要在“/etc/pam.d/”目录下建立相应的配置文件名称并做相应的配置即可。具体格式如下:” type(认证类型) control(控制) module-path(模块路径)module-arguments(模块参数)“
  
 
三.PAM模块认证类型(我们也可以把它理解为”栈“)
1.auth
  认证管理,验证使用者身份,账号和密码。
2.account
  用户认证,基于用户表,时间或密码有效期来决定是否允许访问。
3.password
  密码(口令),认证管理 进制用户方法尝试登陆,在变更密码是进行密码复杂性控制。
4.session
  会话管理,进行日志记录,或者限制用户登陆的次数,资源限制。
 
四.PAM模块的控制流程(控制标记,用于控制认证成功或失败时要采取相应的动作)
1.required
  必要条件。此关不过,仍需检测同一个栈中的其他模块,最后返回failure,认证失败。拥有参考其他模块意见基础之上的一票否决权。可以通过其它模块来检查为什么验证没有通过。
2.requisite
  必要条件,验证失败时则立即结束整个验证过程,返回fail,就好比让你答题100道,如果在答题的过程中有一道做错了直接让你出去,不会进行下面的答题过程。拥有一票否决,此关不过,立即返回failure。
3.sufficient
  充分条件,验证成功则立即返回OK,不再继续验证,否则忽略sufficient的结果并继续其它。换句话说,sufficient的验证失败对整个验证没有任何影响。
4.optional
  可选条件,无论验证结果如何,均不会影响。通常用于session类型。
5.include
  包含另外一个配置文件中类型相同的行。换句话说,包含进来指定的其他配置文件中同名栈中的规则,并以之进行验证。
6.substack
  俗称子栈,这个控制流程俺没有用过,基本上也用不到,我们可以忽略。
 
 
 
 
五.常用PAM模块介绍
1.pam_rootok.so
  功能:用户UID是0,返回成功
1 [root@yinzhengjie ~]# more /etc/pam.d/su | grep  pam_rootok.so 2 #auth           sufficient      pam_rootok.so 3 [root@yinzhengjie ~]#  4 [root@yinzhengjie ~]# su yinzhengjie 5 Password:  6 [yinzhengjie@yinzhengjie root]$ exit  7 exit 8 [root@yinzhengjie ~]#  9 [root@yinzhengjie ~]# more /etc/pam.d/su | grep  pam_rootok.so10 auth            sufficient      pam_rootok.so11 [root@yinzhengjie ~]# su yinzhengjie12 [yinzhengjie@yinzhengjie root]$ 13 [yinzhengjie@yinzhengjie root]$ exit 14 exit15 [root@yinzhengjie ~]#
案例展示:(限制root切换用户也需要密码)
2.pam_access.so
  功能:访问控制,默认配置文件为“/etc/security/access.conf ”,通常作用于登陆程序,如su,login,gdm,sshd等等。
1 [root@yinzhengjie ~]# more /etc/pam.d/sshd | grep pam_access.so2 auth       required     pam_access.so3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# tail -4 /etc/security/access.conf 5 #Add by yinzhengjie6 -:root:ALL EXCEPT 10.0.0.0/24            #只让root从10.0.0.0/24的网段访问7 #-:root:10.0.0.0/24                    #拒绝从10.0.0.0/24这个C的地址访问过来。8 #-:root:ALL EXCEPT 10.10.0.161        #拒绝从10.10.0.161这个IP访问过来。9 [root@yinzhengjie ~]#
案例展示:(控制访问的源IP地址)
3.pam_listfile.so
  功能:基于自定义文件允许或拒绝访问资源限制
1 [root@yinzhengjie ~]# grep listfile /etc/pam.d/sshd  2 auth       required     pam_listfile.so item=user sense=allow file=/etc/yinzhengjie_ssh_users onerr=fail             #注意,“onerr=fail”表示当文件“/etc/yinzhengjie_ssh_users”不存在时,默认为fail。 3 [root@yinzhengjie ~]# > /var/log/secure 4 [root@yinzhengjie ~]# tail -10f /var/log/secure 5 Feb  4 23:13:36 yinzhengjie sshd[6509]: reverse mapping checking getaddrinfo for bogon [10.0.0.161] failed - POSSIBLE BREAK-IN ATTEMPT! 6 Feb  4 23:13:36 yinzhengjie sshd[6509]: pam_listfile(sshd:auth): Couldn't open /etc/yinzhengjie_ssh_users 7 Feb  4 23:13:38 yinzhengjie sshd[6509]: Failed password for root from 10.0.0.161 port 55937 ssh2 8 Feb  4 23:13:44 yinzhengjie sshd[6510]: Received disconnect from 10.0.0.161: 13: The user canceled authentication.  9 ^C10 [root@yinzhengjie ~]# echo root > /etc/yinzhengjie_ssh_users11 [root@yinzhengjie ~]# 12 [root@yinzhengjie ~]# tail -10f /var/log/secure13 Feb  4 23:13:36 yinzhengjie sshd[6509]: reverse mapping checking getaddrinfo for bogon [10.0.0.161] failed - POSSIBLE BREAK-IN ATTEMPT!14 Feb  4 23:13:36 yinzhengjie sshd[6509]: pam_listfile(sshd:auth): Couldn't open /etc/yinzhengjie_ssh_users15 Feb  4 23:13:38 yinzhengjie sshd[6509]: Failed password for root from 10.0.0.161 port 55937 ssh216 Feb  4 23:13:44 yinzhengjie sshd[6510]: Received disconnect from 10.0.0.161: 13: The user canceled authentication. 17 Feb  4 23:14:13 yinzhengjie sshd[6513]: Accepted password for root from 10.0.0.161 port 55960 ssh218 Feb  4 23:14:13 yinzhengjie sshd[6513]: pam_unix(sshd:session): session opened for user root by (uid=0)19 ^C20 [root@yinzhengjie ~]#
案例展示:(sshd的黑名单或白名单)
4.pam_time.so
  功能:基于时间的访问控制,默认文件“/etc/security/time.conf ”
1 [root@yinzhengjie ~]# tail -2 /etc/security/time.conf2 #Add by yinzhengjie3 sshd;*;*;SaSu0900-1800        #表示sshd服务的所有终端的所有用户只能在8-18点可以正登陆。4 [root@yinzhengjie ~]#
案例展示:(基于时间限制sshd的访问)
5.pam_tally2.so
  功能:登陆统计
1 [root@yinzhengjie ~]# grep pam_tally2.so /etc/pam.d/sshd 2 auth       required     pam_tally2.so deny=2 even_deny_root root_unlock_time=60 unlock_time=60   #表示当用户输入次数超过2次时,锁定用户60秒,因此这里的“even_deny_root ”表示包括root用户,“root_unlock_time”表示root用户锁定的时间,“unlock_time”表示其他用户锁定的时间。3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# pam_tally2 --reset -u root            #这里表示手动解锁。5 Login           Failures Latest failure     From6 root                0    7 [root@yinzhengjie ~]#
案例展示:(实现防止对sshd暴力破解)
6.pam_limits.so
  功能:限制用户会话过程中对各种资源的使用情况。缺省情况下该模块的配置文件是“/etc/security/limits.conf ”或“/etc/security/limits.d/*.conf”
1 [root@yinzhengjie ~]# ulimit -a 2 core file size          (blocks, -c) 0 3 data seg size           (kbytes, -d) unlimited 4 scheduling priority             (-e) 0 5 file size               (blocks, -f) unlimited 6 pending signals                 (-i) 3810 7 max locked memory       (kbytes, -l) 64 8 max memory size         (kbytes, -m) unlimited 9 open files                      (-n) 102410 pipe size            (512 bytes, -p) 811 POSIX message queues     (bytes, -q) 81920012 real-time priority              (-r) 013 stack size              (kbytes, -s) 1024014 cpu time               (seconds, -t) unlimited15 max user processes              (-u) 381016 virtual memory          (kbytes, -v) unlimited17 file locks                      (-x) unlimited18 [root@yinzhengjie ~]# ulimit -n19 102420 [root@yinzhengjie ~]# 21 [root@yinzhengjie ~]# tail -5 /etc/security/limits.conf 22 #Add by yinzhengjie23 *               soft    nofile          1024024 *               hard    nofile          1024025 *               soft    nproc           1024026 *               soft    cpu             127 [root@yinzhengjie ~]#28 [root@yinzhengjie ~]# exit 29 logout30 Last login: Sun Feb  4 23:31:27 2018 from 10.0.0.16131 [root@yinzhengjie ~]# ulimit -n32 1024033 [root@yinzhengjie ~]#
案例展示:(调整最大打开的文件数)

 

六.查看进程文件是否支持PAM认证
  注意:PAM资源限制仅针对用户,不针对进程。换句话说,通一个进程如果被不同的用户执行,他们的影响是不一样的。如果进程以root运行,就不会受到PAM的限制。
1 [root@yinzhengjie ~]# which sshd 2 /usr/sbin/sshd 3 [root@yinzhengjie ~]# which login 4 /bin/login 5 [root@yinzhengjie ~]# ldd /usr/sbin/sshd | grep pam 6         libpam.so.0 => /lib64/libpam.so.0 (0x00007f2c196cf000) 7 [root@yinzhengjie ~]#  8 [root@yinzhengjie ~]# ldd `which login` | grep pam        #注意,ldd命令是查看进程文件支持的动态库,而ldconfig是可以查看已经加载的动态库。我们可以用“ldconfig -p”来打印当前操作系统已经加载的动态库。 9         libpam.so.0 => /lib64/libpam.so.0 (0x000000323b200000)10         libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x0000003230a00000)11 [root@yinzhengjie ~]#

 

 
 
 
 
 
你可能感兴趣的文章
索尼将出售电池业务 未来或投资人工智能等新兴技术领域
查看>>
甲骨文宣布在亚太区推出重要销售转型战略,全面拓展云业务
查看>>
创建 ECS 支持使用镜像预设密码
查看>>
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)...
查看>>
特斯拉又创新举,太阳能电场为Gigafactory电池工厂供电
查看>>
finally关键字小复习
查看>>
[Spring]01_环境配置
查看>>
用AliOS Things在Developer Kit 上点亮一个LED
查看>>
Hadoop集群nodes unhealthy解决方法
查看>>
云栖科技评论NO.3 | 新技术正在打破“新药26亿美元”魔咒
查看>>
因为聊天机器人的表现太令人失望,Facebook决定削减AI投入
查看>>
搭建了一个小型VR游乐园,Topshop的营业额蹭蹭上涨
查看>>
「镁客·请讲」EAI科技龙军:从模块化切入,做服务机器人整体解决方案
查看>>
用户对物联网设备的“宽容”会让物联网陷入反乌托邦?
查看>>
FBS2017: 伊利智慧 惊艳登场
查看>>
安卓问题集-Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
查看>>
MySQL复制表结构和内容到另一张表(转)
查看>>
React Native在Windows下修改js代码后reload无效
查看>>
阿里首席技术官王坚:互联网将被区块链彻底重构,未来区块链将用于数据价值的交换...
查看>>
rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
查看>>