PAM介绍
认证库:文本文件, MySQL, NIS, LDAP等
Sun公司于1995 年开发的一种与认证相关的通用框架机制
PAM 是关注如何为服务验证用户的 API, 通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无
需更改服务程序。
一种认证框架,自身不做认证
它提供了对所有服务进行认证的中央机制,适用于login,远程登录( telnet,rlogin,fsh,ftp,点对点协议( PPP)), su等应用程序中。
PAM相关文件
主配置文件:/etc/pam.conf,默认不存在;使用/etc/pam.d 作为主配置文件
/etc/pam.d 主配置文件
/lib64/security/*.so 模块文件目录:
/etc/security/ 环境相关的设置
为每种应用模块提供一个专用的配置文件: /etc/pam.d/APP_NAME
注意:如/etc/pam.d存在, /etc/pam.conf将失效
[root@localhost ~]# rpm -ql pam ##其中每一个.so文件就代表给一个pam模块
/etc/security
/etc/security/access.conf
/etc/security/chroot.conf
/lib64/security
/lib64/security/pam_access.so
/lib64/security/pam_chroot.so
/etc/security/time.conf
/lib64/security/pam_time.so
...............
PAM认证原理
1、PAM认证一般遵循这样的顺序: Service(服务)→PAM(配置文件)→pam_*.so
2、PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证
PAM认证过程:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块, PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件, 即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
PAM认证机制
专用配置文件/etc/pam.d/* 格式
1、type(模块类型) 2、control(控制) 3、module-path(模块路径) 4、arguments(参数复杂的调用配置文件)
说明:
- 服务名( application)
- telnet、 login、 ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
模块类型( module-type)
control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况
module-path 用来指明本模块对应的程序文件的路径名
Arguments 用来传递给该模块的参数
1、模块类型( module-type)
Auth 账号的认证和授权
Account 与账号管理相关的非认证类的功能
Password 用户修改密码时密码复杂度检查机制等功能
Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,
2、control(控制)
required : 一票否决, 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序。 即为必要条件
sufficient : 一票通过, 表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略, 即为充分条件
optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
include: 调用其他的配置文件中定义的配置信息
3、module-path: 模块路径
相对路径:
/lib64/security目录下的模块可使用相对路径
如: pam_shells.so、 pam_limits.so
绝对路径:
/etc/security/*.conf
pam文档说明
pam文档中详细说明了pam每个模块的使用方法:
URL:http://www.linux-pam.org/ ###此文档中详细介绍了Linux系统中的pam.d模块的使用方法
PAM模块pam_shells示例
模块: pam_shells
功能:检查有效shell
man pam_shells
示例:不允许使用/bin/csh的用户本地登录
命令执行如下:
[root@localhost ~]#cd /etc/pam.d/
用户登陆默认不会调用pam.d中的login登陆模块,所以用户的登陆是不会收pam认证的影响
下面我们使用系统中wang用户来做PAM认证的过程。
[root@localhost ~]# getent passwd wang ###查看wang用户的shell类型
wang:x:500:500::/home/wang:/bin/bash
用户登陆的shell类型都在/etc/shells 目录中;
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash ###wang用户使用的shell是/bin/bash
/sbin/nologin
/bin/dash
/bin/csh
[root@localhost ~]# usermod -s /bin/csh wang ###修改wang用户的shell类型
[root@localhost pam.d]# su - wang ###切换的用户
[wang@localhost ~]$ echo $SHELL
/bin/csh
目前wang用户的登陆不受shell的改变而受影响
[wang@localhost ~]$ exit ###退出回到root用户
[root@localhost ~]# vim /etc/shells
# /bin/csh ###注释掉/bin/csh 在次登陆
因为wang使用的shell还没有调用shell模块,所以wang用户还是可以登陆的
现在我们修改登陆的配置文件
[wang@localhost ~]$ exit
[root@localhost ~]# cd /etc/pam.d/
[root@localhost pam.d]# vim 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
加入 auth required pam_shells.so ###以上的第五行代码
在次登陆wang用户的时候就会失败;因为用户登陆的时候用的shell类型必须是在/etc/shells可用的shell类型,而wang用的是/bin/csh类型。所以wang用户登陆失败。
注意:在这里我们用 su - wang 切换的时候 ,我们是可以登陆的因为su使用的是pam.d中的su认证模块,而非login认证模块。所以wang用户可以登陆切换。
su 认证模块可以做pam用户切换认证
[root@localhost pam.d]# vim su
加入 auth required pam_shells.so
再次使用su - wang 时也会失败
改完之后记着恢复配置文件噢!!!
PAM模块pam_securetty.so示例
模块: pam_securetty.so
功能: 只允许root用户在/etc/securetty列出的安全终端上登陆
示例: 允许root在telnet登陆
vi /etc/pam.d/remote
#auth required pam_securetty.so #将这一行加上注释
或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
PAM模块示例
模块: pam_nologin.so
功能:
如果/etc/nologin文件存在,将导致非root用户不能登陆
如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin
文件内容,并拒绝登陆
[root@localhost ~]# touch /etc/nologin
所有普通用户将不能登陆
[root@localhost ~]# rm -f /etc/nologin
删除后普通用户可以正常登陆。