PAM介绍
PAM:可插入式认证模块,是实现认证工作的一个模块。sun公司1995年开发,PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服 务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
PAM(Pluggable Authentication Modules)是一个通用的身份验证框架,可在 Linux 和其他类 Unix 系统上使用。它允许系统管理员配置多个身份验证方法,并控制每个身份验证方法的顺序。PAM 使用一个层次结构来组织身份验证模块,管理员可以根据需要加载、卸载和组合这些模块,以定制系统的身份验证策略。
要在 Linux 系统上配置 PAM,您需要编辑 /etc/pam.d/ 目录中的配置文件。每个服务(如 SSH、sudo、login 等)都有一个对应的配置文件。例如,/etc/pam.d/sshd 文件包含用于 SSH 服务的身份验证配置。在该文件中,您可以指定要使用的身份验证模块、以及它们的顺序。
PAM 模块可以提供各种类型的身份验证,例如基于密码的身份验证、基于证书的身份验证、双因素身份验证等。每个模块都有一个特定的目的,例如检查密码、检查用户帐户是否过期、检查用户是否在允许的 IP 地址范围内等。根据需要,管理员可以组合多个模块来构建一个定制的身份验证流程。
认证库有文本文件,MySQL数据库,NIS ,LDAP等,这些库所对应的系统模块位于/lib64/security/目录下的所有库文件(以".so"后缀的文件)。
PAM架构
PAM(Pluggable Authentication Modules)架构是一个通用的身份验证框架,可用于 Linux 和其他类 Unix 系统上。PAM 提供了一种灵活的方法,用于管理系统中的身份验证和授权。以下是 PAM 的基本架构:
1、应用程序:需要进行身份验证或授权的应用程序,如 SSH、sudo、login 等。
2、PAM 库:PAM 库是一个公共库,它提供了用于进行身份验证和授权的 API。应用程序使用这些 API 与 PAM 进行交互。
3、PAM 配置文件:PAM 配置文件位于 /etc/pam.d 目录中。每个应用程序都有一个对应的 PAM 配置文件,用于指定身份验证和授权流程。配置文件中包含一个或多个 PAM 模块,它们是用于完成特定任务的代码库。
4、PAM 模块:PAM 模块是用于执行身份验证和授权任务的代码库。模块可用于检查用户密码、检查用户是否在允许的 IP 范围内、检查用户帐户是否已过期等。PAM 模块可以使用已安装的身份验证技术(如密码、Kerberos、LDAP 等)进行身份验证。
5、身份验证源:身份验证源是用于进行身份验证的数据源,如本地用户数据库、LDAP 目录等。
管理员可以通过修改 PAM 配置文件和加载不同的 PAM 模块来创建定制的身份验证和授权流程,以满足特定的安全需求。PAM 提供了灵活性和可扩展性,使管理员能够以最小的努力满足特定的身份验证和授权需求。
应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( )) 来实现对认证方法的调用。
PAM 服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( ) 供PAM 接口库调用),将不同的认证机制加入到系统中。
PAM 接口库(libpam )则读取配置文件,将应用程序和相应的PAM 服务模块联系起来
PAM相关文件
模块目录文件:/lib64/security/ 目录包含系统安装的 PAM 模块。这些模块提供各种类型的身份验证,例如基于密码的身份验证、基于证书的身份验证、双因素身份验证等;/lib64/security/..so文件
特定模块配置文件:/etc/security/
应用程序配置文件:
主配置文件:/etc/pam.conf,默认不存在,一般不使用
每个应用程序模块提供的pam配置文件:/etc/pam.d/ (注:如果该文件夹存在,则主配置文件失效)
/usr/share/doc/libpam-doc 目录:该目录包含了 PAM 的文档,包括开发人员指南、参考手册等。
/etc/nsswitch.conf 文件:该文件指定了系统如何查找用户帐户信息。例如,它可以指定使用本地 /etc/passwd 文件或使用 LDAP 目录进行身份验证。
/etc/nsswitch.conf 文件包含了一个或多个数据库的条目,每个条目都指定了要使用的数据库和查找顺序。默认情况下,nsswitch.conf 文件包含了以下数据库条目:
passwd:用户账户信息数据库;
group:组账户信息数据库;
shadow:用户密码信息数据库;
hosts:主机名和 IP 地址的映射数据库;
networks:网络名称和 ID 的映射数据库;
protocols:网络协议的名称和协议编号的映射数据库;
services:网络服务的名称和端口号的映射数据库。
每个数据库条目都由一个关键字和一个值组成。关键字指定了要查询的数据库类型,值则指定了要使用的数据库名称。例如,下面是一个 /etc/nsswitch.conf 文件的示例:
passwd: files nis
shadow: files nis
group: files nis
hosts: files dns
networks: files
protocols: db files
services: db files
第一列是数据库条目的关键字,第二列是包含要使用的数据库类型的列表。这些列表中的每个条目都将指示 nsswitch.conf 在执行查询时使用的数据库。在示例中,用户、组和密码信息将从文件和 NIS 中获取,而主机名将首先从文件中获取,然后从 DNS 中获取。其他数据库将仅从文件中获取。
查看程序是否支持PAM
PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
AM 的工作原理是检查应用程序请求的认证任务,然后根据系统的配置文件和安装的 PAM 模块来决定如何执行该任务。PAM 模块可以按特定顺序组合,以便在完成认证之前检查用户是否存在于数据库中,并验证其凭证,以及检查用户是否已经过限
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证
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.conf格式
application type control module-path arguments
专用pam配置文件格式/etc/pam.d/
type control module-path arguments
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数
type类型
Auth 账号的认证和授权
Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
Password 用户修改密码时密码复杂度检查机制等功能
Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
control类型
required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite
optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
include: 调用其他的配置文件中定义的配置信息
module-path
模块文件所在绝对路径:
模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so、pam_limits.so
有些模块有自已的专有配置文件,在/etc/security/*.conf目录
Arguments
debug :该模块应当用syslog( )将调试信息写入到系统日志文件中
no_warn :表明该模块不应把警告信息发送给应用程序
use_first_pass :该模块不能提示用户输入密码,只能从前一个模块得到输入密码
try_first_pass :该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户输入新密码
use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码
expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
常用PAM模块
pam_shells
针对/etc/pam.d/login配置文件增加如下:
pam_securetty.so
只允许root用户在/etc/securetty列出的安全终端上登陆
vi /etc/pam.d/remote
#将下面一行加上注释
#auth required pam_securetty.so
#或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
#测试用root telnet登录
pam_nologin.so
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆
pam_limits.so
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制方式
ulimit命令,立即生效,无法保存
-n 每个进程最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用 soft(软)资源限制
-H 使用 hard(硬)资源限制
配置文件
/etc/security/limits.conf
/etc/security/limits.d/*.conf
配置文件格式:
#每行一个定义
<domain> <type> <item> <value>
domain 类型
Username 单个用户
@group 组内所有用户
* 所有用户
% 仅用于限制 maxlogins limit , 可以使用 %group 语法. 只用 % 相当于 * 对所有用户
maxsyslogins limit限制. %group 表示限制此组中的所有用户总的最大登录数
限制类型
Soft 软限制,普通用户自己可以修改
Hard 硬限制,由root用户设定,且通过kernel强制生效
- 二者同时限定
限制资源
nofile 所能够同时打开的最大文件数量,默认为1024
nproc 所能够同时运行的进程的最大数量,默认为1024
core - 设置核心文件的最大大小
data - 设置数据段的最大大小
fsize - 设置文件的最大大小
memlock - 设置进程能锁定的最大内存大小
nofile - 设置进程可以打开的最大文件数量
rss - 设置进程可以使用的最大内存大小
stack - 设置进程可以使用的最大栈大小
cpu - 设置进程可以占用的最长 CPU 时间
nproc - 设置进程可以同时运行的最大进程数量
as - 设置进程可以使用的最大虚拟内存大小
locks - 设置进程可以创建的最多文件锁数量
sigpending - 设置进程未决信号的最大数量
msgqueue - 设置进程可以创建的消息队列的最大数量
nice - 设置进程可以使用的最高 nice 值
rtprio - 设置进程可以使用的最高实时优先级
rttime - 设置进程可以执行的实时时间总量
maxlogins - 设置同一用户在系统中最多同时允许的登录数
maxsyslogins - 设置系统允许的最多同时登录的用户数
priority - 设置进程的最高优先级
案例:限制用户最多打开的文件数和运行进程数,并持久保存
cat /etc/pam.d/system-auth
session required pam_limits.so
vim /etc/security/limits.conf
#用户apache可打开10240个文件
apache – nofile 10240
生产优化
vim /etc/security/limits.conf
* - core unlimited
* - nproc 1000000
* - nofile 1000000
* - memlock 32000
* - msgqueue 8192000
pam_succeed_if模块
功能:根据参数中的所有条件都满足才返回成功
案例:ubuntu默认不允许root登录桌面图形
用root登录桌面失败,查看日志,可看到Pam原因
Vim /etc/pam.d/gdm-passwd
#将下面行注释
#auth requried pam_succeed_if.so user !=root quiet_success
pam_google_authenticator
功能:实现SSH登录的两次身份验证,先验证APP的数字码,再验证root用户的密码,都通过才可以登 录。目前只支持口令验证,不支持基于key验证
cat google-authenticator.sh标签:配置文件,身份验证,PAM,etc,62,模块,认证,pam From: https://blog.51cto.com/gavenlee/6057299
#安装epel
yum install -y epel-release.noarch
yum makecache
#安装google authenticator
yum install -y google-authenticator.x86_64
bash google-authenticator.sh
google-authenticato
#/etc/pam.d/sshd文件,修改或添加下行保存
#auth required pam_google_authenticator.so
sed -i '1a\auth required pam_google_authenticator.so' /etc/pam.d/sshd
#编辑/etc/ssh/sshd_config找到下行
#ChallengeResponseAuthentication no
#更改为
#ChallengeResponseAuthentication yes
sed -i 's/.*ChallengeResponseAuthentication.*/ChallengeResponseAuthentication
yes/' /etc/ssh/sshd_config
#重启SSH服务
service sshd restart
临时口令存放在/root/.google_authenticator中,用一次删除一个,可手动加入使用