PAM(Pluggable Authentication Modules)
PAM认证机制
1 认证库:文本文件,MySQL,NIS,LDAP等
2 PAM 是关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
3 使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
4 一种认证框架,自身不做认证

它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议((PPP)),su等应用程序中;
系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;
应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;
PAM服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用),将不同的认证机制加入到系统中;
PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来;
telnet不允许以root身份登录,但是可以切换;

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/passewd这个设置文件;
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
PAM相关文件
模块文件目录:/lib64/security/*.so
环境相关的设置:/etc/security/(模块配置文件)
主配置文件:/etc/pam.conf,默认不存在——不建议用(所有文件配置写在一个文件里,过大,不易于查询)
为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME(服务配置文件)——建议使用
注意:如/etc/pam.d存在,/etc/pam.conf将失效
通用配置文件/etc/pam.conf格式
application type control module-path arguments
专用配置文件/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:
调用其他的配置文件中定义的配置信息(有些设置是通用的,可以定义到一个文件里)
-----------------------------------------------------------------
复杂详细实现:使用一个或多个“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/*.conf
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
Arguments 用来传递给该模块的参数
pam文档说明
/user/share/doc/pam-*
rpm -qd pam 查询文档
man -k pam_
man 模块名 如man rootok
《The Linux-PAM System Administrators' Guide》

PAM模块示例
模块:pam_shells
功能:检查有效shell,用户的shell类型在/etc/shells文件列表里,即可访问系统;
man pam_shells
示例:不允许使用/bin/csh的用户本地登录
vim /etc/pam.d/login
auth required pam_shells.so
vim /etc/shells
#注释掉 /bin/csh
useradd -s /bin/csh testuser
testuser将不可登录
tail /var/log/secure
其他主机上:ssh test@host_ip 可以连接成功(login和ssh是不同的配置文件)
vim /etc/pam.d/sshd
auth required pam_shells.so (ssh再次连接,即失败)
--------------------------------------------------------
模块:pam_securetty.so
功能:只允许root用户在/etc/securetty列出的安全终端上登陆
示例:允许root在telnet登陆
centos7
yum -y install telnet; telnet centos6_ip 不允许root登录,原因是登录终端不在/etc/securetty文件里
centos6
chkconfig --list telnet; chkconfig telnet on; service xinetd restart
vim /etc/pam.d/login
#auth required pam_securetty.so (将这一行加上注释)
或者
vim /etc/securetty 文件中加入pts/0,pts/1…pts/n
---------------------------------------------------------
模块:pam_nologin.so
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆;
如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin.txt文件内容,并拒绝登陆;
centos6
touch /etc/nologin; echo disable common user login > /etc/nologin
feng 用户不能登录; su - feng 可以切换; 原因是ksu配置文件里无pam_nologin.so模块
account required pam_nologin.so ksu文件里添加此命令,即可su失败
cd /etc/pam.d/; grep pam_nologin.so * 查询应用pam_nologin.so模块的程序
模块:pam_limits.so
模块:pam_limits.so
功能:在用户级别实现对其可使用的资源的限制
例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存(内部命令)
bash里有ulimit,csh里无此工具
-n 最多的打开的文件描述符个数 更改最大值(普通用户只能改小,root不受限)
-u 最大用户进程数
-S 使用'soft'(软)资源限制
-H 使用'hard'(硬)资源限制
-m 最大内存大小 cat /etc/sysctl.conf(shmmax——centos6可以设置,centos7无)
cd /etc/pam.d/; grep pam_limits.so *
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件:每行一个定义;
<domain> <type> <item> <value>



<domain> 应用于哪些对象
Username 单个用户(如:Oracle数据库,不能用root用户直接建立,权限太大,应该用Oracle用户名)
@group 组内所有用户
* 所有用户
<type> 限制的类型
Soft 软限制,普通用户自己可以修改
Hard 硬限制,由root用户设定,且通过kernel强制生效
- 二者同时限定
<item> 限制的资源
nofile 所能够同时打开的最大文件数量,默认为1024
nproc 所能够同时运行的进程的最大数量,默认为1024
rss 最大内存数,真正的内存,不包括交换分区(交换分区在磁盘,不属于内存)
<value> 指定具体值


示例:限制用户最多打开的文件数和运行进程数
/etc/pam.d/system-auth
session required pam_limits.so
#?(建立Oracle数据库时,注释掉或者required——>optional)
vim /etc/security/limits.conf
apache - nofile 10240 apache用户可打开10240个文件
feng hard nproc 3 不能运行超过3个进程(建立Oracle数据库时,把值调大)
思考
用户的ftp账号放在mysql数据库里,需要安装并调用模块,自己配置;
不同模块,功能不同;
练习
1、限制centos用户只能够在工作时间通过ssh远程连接本机
man -k pam_ ; man 5 time.conf
2、限制只有admins组内的用户可ssh到本机
网友评论