PAM简介
1. Sun公司于1995 年开发的一种与认证相关的通用框架机制
2. PAM 是关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时,PAM是一种认证框架,自身不做认证
3. PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。当然,在不同版本的Linux统中部署PAM认证是有所不同的。它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用),将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。
PAM架构如下图所示:
PAM模块和应用程序是相分离的,通过PAM 接口库交互,管理员通过配置PAM数据去配置PAM接口库,达到管理的目的。
——————————————————————————————————————————————————————————————————
PAM认证原理
PAM认证一般遵循这样的顺序:Service(服务)—->PAM配置文件—–>pam_*.so
首先查看服务,查看服务上是否定义的有pam验证的信息,根据这些验证信息,去读取pam配置文件,之后,pam配置文件里面定义各种规则(我们管理员需要定义的),生效,调用pam_*.so模块。
PAM模块认证过程图如下
——————————————————————————————————————————————————————————————————
PAM认证过程:
1.使用者执行/usr/bin/passwd程序,并输入密码
2.passwd开始呼叫PAM模块,PAM模块会搜寻passwd程序的PAM相关设定文件,这个设定文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passed这个设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
注意:做为管理员,我们不需要去管pam_*.so模块文件,我们需要做的是去调用模块,同时要注意/etc/pam.d/下的配置文件。
——————————————————————————————————————————————————————————————————
PAM相关文件
配置文件说明:
模块文件目录:/lib64/security/*.so
环境相关的设置:/etc/security/,管理上面相对应的库文件 ,库相关的配置文件
注:/etc/security/下的文件设置部分的模块文件
主配置文件:/etc/pam.conf, 默认不存在,和服务相关的配置文件,不推荐在此文件上修改,设置自己的配置
为每种应用模块提供一个专用的配置文件:/etc/pam.d/app_pam 这个配置文件是和应用程序相关的配置文件, 管理每个应用程序,这个文件是我们系统管理员需要去配置的一个很重要的文件,当用户去执行一个命令的时候,它会根据它的程序,自动去读取/etc/pam.d/文件夹下的相关对应的配置文件,这个文件里面定义了,影响了用户相关验证的细节。这些细节里面调用了相关的库文件。
每个服务都有自己的配置
通用配置文件/etc/pam.conf格式
application type control module-path arguments
专用配置文件/etc/pam.d/*格式
type control module-path arguments
服务名(application)
telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
模块类型(module-type)—— 5项
Auth | 账号的认证和授权,身份验证,如,用户名和密码 |
---|---|
Account | 与账号管理相关的非认证类的功能,账户有效性,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录) |
Password | 用户修改密码时密码复杂度检查机制等功能 |
Session | 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等 |
-type | 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用 |
Control
PAM库如何处理与该服务相关的PAM模块成功或失败情况
两种方式实现:简单和复杂
一、简单方式实现:一个关健词实现
required | 一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序。即为必要条件 |
---|---|
requisite | 一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件 |
sufficient | 一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件 |
optional | 表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略 |
include | 调用其他的配置文件中定义的配置信息,相当于函数调用,把其他的文件调用于此 |
二、复杂详细实现:使用一个或多个“status=action”
[status1=action1 status2=action …]
Status:检查结果的返回状态
Action:采取行为ok,done,die,bad,ignore,reset
ok 模块通过,继续检查
done 模块通过,返回最后结果给应用
bad 结果失败,继续检查
die 结果失败,返回失败结果给应用
ignore 结果忽略,不影响最后结果
reset 忽略已经得到的结果
module-path: 模块路径
相对路径 | /lib64/security目录下的模块可使用相对路径如:pam_shells.so、pam_limits.so |
---|---|
绝对路径 | 模块通过读取配置文件完成用户对系统资源的使用控制/etc/security |
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
Arguments 用来传递给该模块的参数
/user/share/doc/pam-*
rpm -qd pam
man –k pam_
man 模块名如man rootok
《The Linux-PAM System Administrators’ Guide》
——————————————————————————————————————————————————————————————————
PAM模块:pam_shells.so
模块:pam_shells
功能:检查有效shell
man pam_shells
实验一:
实验目的:不允许使用/bin/csh的用户本地登录
实验材料:本机ip172.18.24.26/16,另外一台主机ip 172.18.24.17/16
[root@zhangym ~]#useradd -s /bin/csh test #创建shell类型为csh的用户test
[root@zhangym ~]#passwd test #修改test密码
[root@zhangym ~]#vim /etc/csh #修改配置文件
/bin/csh #删除这一行
#从另外一台主机上通过ssh远程连接本机可以登陆test账号
[root@zhangym ~]#ssh test@172.18.24.26 #测试可以连接
[root@zhangym ~]#su test #本机由root切换成test用户,可以切换
#test用户在本地可以登陆
[root@zhangym ~]#vim /etc/pam.d/su
auth required pam_shells.so #第一行添加此行
#注意:此配置文件保存退出后立即生效
[root@zhangym ~]#su test #不能切换到test用户
[root@zhangym ~]#vim /etc/pam.d/sshd
auth required pam_shells.so #第一行添加此行
#通过ssh协议远程登陆test账号,不能连接
[root@zhangym ~]#vim /etc/pam.d/login
auth required pam_shells.so #第一行添加此行
#本地登陆test账号,测试不能登陆
[root@zhangym ~]#vim /etc/shells
/bin/csh #添加此行
#然后再在本地登陆test用户,由root切换到test用户,通过ssh远程可以登陆test用户
试验总结:当用户去执行su test或者ssh test@172.18.24.26:命令的时候,它会根据它的程序,自动去读取/etc/pam.d/文件夹下的su、sshd、login配置文件,这三个文件里面调用了pam_shells.so库文件,pam_shells.so库文件检查用户的shell有效性,用户test的shell类型必须是/etc/shells配置文件中的一种才可本地登陆,远程登陆和切换,因为我们之前删除了/etc/shells中的/bin/csh这一shell类型,所以test用户的shell是无效的,不能做登陆切换操作。当我们恢复了/bin/csh时,又可以登陆切换了,说明执行这些登陆切换等操作时,确实读取了相关配置文件,并且调用了对应的库文件,来进行认证保护。
——————————————————————————————————————————————————————————————————
PAM模块:pam_limits.so
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-n 最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用soft(软)资源限制
-H 使用hard(硬)资源限制
ulimit -a #查看当前用户可以使用资源限制
上图可以看到此行 open file (-n)1024 ,限制用户同时创建或者打开的文件个数为1024个,如下实验验证
实验二:
本机172.18.24.26/16 另有一台主机:172.18.24.17/16
[root@zhangym~ ]#ab -c 2000 -n 10000 http://172.18.24.17/ #压力测试,并发连接http://172.18.24.17/服务器每次2000个,共10000次
并发和服务主机连接2000次,通过socket连接,每个socket要创建一个socket文件,默认同时打开的文件个数是1024,测试同时打开2000个文件,故测试失败,只需要调整一下限制的个数即可
[root@zhangym~ ]#ulimit -n 2048 #设置同时可以打开的文件数为2048个
再次测试
[root@zhangym~ ]#ab -c 2000 -n 10000 http://172.18.24.17/ #压力测试,并发连接http://172.18.24.17/服务器每次2000个,共10000次
测试成功。
实验总结:在很多大型服务中, 要 把服务跑起来,需要更多的资源,这时候就需要在此调整资源限制,来达到业务需求。
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件,每行一个定义:
domain<====>type<====>item<====>value
●domain应用于哪些对象
○Username 单个用户
○@group 组内所有用户
○* 所有用户
●type 限制的类型
○Soft 软限制,普通用户自己可以修改
○Hard 硬限制,由root用户设定,且通过kernel强制生效
○-二者同时限定
●item 限制的资源
○ nofile 所能够同时打开的最大文件数量,默认为1024
○nproc 所能够同时运行的进程的最大数量,默认为1024
●value指定具体值
○限制用户最多打开的文件数和运行进程数
实验三:设置wang用户最大可以开启的的进程数为5个
[root@zhangym~ ]#vim /etc/security/limits.conf
wang用户下打开5个以上的进程
在另外一台机器上,通过ssh远程连接本机192.168.25.107,如下图,没有更多的资源分配,没有更多的子进程可以创建,连接不上。
实验总结:通过设置/etc/security/limits.conf 文件来定义pam.limits.so模块文件,以此限制用户最多打开的文件数和运行进程数。
总结:PAM通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系 统中添加新的认证手段。