PAM认证机制
- PAM:Pluggable Authentication Modules
- 认证库:文本文件,MySQL,NIS,LDAP等
- Sun公司于1995 年开发的一种与认证相关的通用框架机制
- PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
- 使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
- 一种认证框架,自身不做认证
- 它提供了对所有服务进行认证的*机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM
配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。
PAM架构
PAM相关文件
- 模块文件目录:/lib64/security/*.so
- 环境相关的设置:/etc/security/
- 主配置文件:/etc/pam.conf,默认不存在
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
其中/etc/pam.d下有各种服务自身生成的应用软件:
pam认证原理
- PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
- PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/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/* 格式
type control module-path arguments
说明:
服务名(application)
- telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
- 模块类型(module-type)
- control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况
- module-path 用来指明本模块对应的程序文件的路径名
- Arguments 用来传递给该模块的参数
模块类型(module-type)
- Auth 账号的认证和授权
- Account 与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
Control:
PAM库如何处理与该服务相关的PAM模块成功或失败情况
- 两种方式实现:简单和复杂
- 简单方式实现:一个关健词实现
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
- optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include: 调用其他的配置文件中定义的配置信息
相关配置文件信息:包含了模块类型、控制、模块信息。
module-path: 模块路径
- 相对路径:
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so
- 绝对路径:
- 模块通过读取配置文件完成用户对系统资源的使用控制 /etc/security/*.conf
- 注意:修改PAM配置文件将马上生效建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
- Arguments 用来传递给该模块的参数
pam_shells.so模块:
功能:检查有效shell
我们需要对su切换普通用户和ssh远程登录的用户怎么进行控制呢?此时我们就应该在su命令模块和sshd模块进行配置数据,可以禁止普通用户进行登录:
su切换普通用户的禁止操作:
1)chsh -s /bin/csh wang 将当前的shell类型改掉
2)vim /etc/shells 将shells 里边的shell类型给注释掉
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
#/bin/csh
3)我们可以查看当前的pam_shells.so模块是否被调用,我们可以看到当前没有被su/sshd等命令被调用:
4)然后在/etc/pam.d模块里修改配置文件,vim su,内容如下:
auth required pam_shells.so 修改后就会调用shell类型的模块,禁止不在此shell类型的账号登录,此时su命令模块就会被调用。
5)然后切换账号,就无法登录;
6)su - wang 切换wang账号就无法登录
7)如果想让wang登录,将/etc/shells配置文件的/bin/csh注释去掉即可。
对ssh远程连接用户的禁止操作:
如果远程用ssh登录,shells当前没有被调用,不受控制,还会通过ssh登录,需要修改sshd里边的配置文件,vim sshd,内容如下:
auth requisite pam_shells.so 修改后远程ssh连接登录无法连接
ssh 192.168.34.100就会失败。
pam_securetty.os模块:
- 功能:只允许root用户在/etc/securetty列出的安全终端上登陆
1)root账号用telnet远程登录,将centos7的telnet服务打开,systemctl start telnet.sockes;
2)centos6上连接 telnet 192.168.34.100 普通用户可以登录,但是root用户是无法登录的,若想让root用户登录,修改以下的pam模块文件信息:
3)vim /etc/securetty
4)在最下面添加几个端口:pts/1 pts/2 pts/3
5)添加后以root身份: telnet 192.168.34.100 root用户就可以登录账号了
6)或者vim /etc/pam.d/remote里边修改配置文件
#auth required pam_securetty 将此项进行注释掉也可以root通过telnet远程登录,为了安全起见,一般不会这么修改
pam_nologin.so模块
- 功能:用于限制普通用户的登录,如果设置任何普通用户将无法登录。
1)有配置文件默认路径 /etc/nologin,配置文件默认没有创建,如果创建则代表普通用户无法登录,文件不需有任何内容,可以在文件中显示当前的信息,还要查看当前pam_nologin.so模块是否被调用,如果未被调用也是无法生效。grep pam_nologin * 可以查看命令调用此模块,我们可以看到,当前login和sshd文件都在调用此模块,创建配置文件 touch /etc/nologin,因此会生效,普通用户无法登录,删除掉/etc/nologin文件普通用户就可以登录。
2)查看当前的pam_nologin.so模块调用了哪些命令:
[root@centos6~]#ssh wang@192.168.34.101
wang@192.168.34.101's password:
Permission denied, please try again. 此时就没有权限进行远程登录
为什么我们还可以直接从root用户用su切换到普通身份?因为su命令没有被pam_nologin.so模块调用。
1)我们直接在su配置模块里写入当前的禁止登录配置文件即可:
vim su 在配置文件中添加了pam_nologin.so模块配置信息之后,su 切换普通身份也无法进行。
[root@centos7pam.d]#su - wang
su: Authentication failure 切换失败信息
pam_ulimits.so模块
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
当前系统默认最大打开1024个文件,我们可以测试当前的系统性能
- cp /var/log/messages /var/www/html/a.txt 复制一个文件到html下
- cd /var/www/html
- systemctl start httpd 开启http服务
- ab -c 100 -n 2000 http://192.168.34.6/a.txt 同时能打开100个文件,最大打开2000个文件,测试当前的系统性能。
- ulimit -n 10240 可以将最大打开文件数设置为10240个。
ulimit 中的相关配置信息:
[root@centos7~]#ulimit -a
core file size (blocks, -c) 0 #core文件的最大值为100 blocks。
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
scheduling priority (-e) 0
file size (blocks, -f) unlimited #文件可以任意大。
pending signals (-i) 98304 #最多有98304个待处理的信号。
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
real-time priority (-r) 0
stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf写在此配置文件下才会有效。
配置文件:每行一个定义;
<domain>(域) <type>(类型) <item>(组) <value>(字符)
-
- 直接在配置文件中修改才会生效,vim/etc/security/limits.conf
- 其中wang - nproc 6 含义是只能有6个进程,
- wang - maxlogins 4 含义是wang账号最大登录4次