PAM - 可插拔认证模块

1、为什么要使用PAM

为了让用户更合理地使用系统,应用程序或服务(如sshd、login、su、password、ftp等)不可避免地需要对用户进行安全认证,若按照各自的规则去配置非常耗费时间和精力且不能重用。

而PAM提供了统一的API,使应用程序的访问控制变得简单方便。

2、介绍

官方地址:http://www.linux-pam.org/

2.1 流程说明

当某个应用程序或服务需要使用PAM来进行认证时,只要它支持PAM,就可以通过修改其相应的PAM配置文件,加放所需要的认证方式。当重新访问时,PAM就会读取相应的配置文件来提供认证功能。

2.2 PAM配置文件

PAM配置文件可能是/etc/pam.conf,或者是 /etc/pam.d/目录下对应服务名称的文件(本文以此形式进行介绍)。

PAM配置文件是由一系列规则组成,一个规则对应一行。

(1)规则语法

service type control module-path module-arguments

(2)字段说明

service (服务名称)
注:在/etc/pam.d/目录下的配置文件,是不包含service部分的,而文件的名字就是service,且文件名必须是小写。

type(account/auth/password/session)

  • account
    帐户管理,它主要用来限制/允许用户对某个服务的访问时间、当前可用的系统资源(用户的最大数量)或者用户的位置访问服务(例如:root用户只能从控制台登录)
  • auth
    识别用户身份,比如:提示用户输入密码
  • password
    升级用户的认证标记,比如:密码强度性检测
  • session
    处理为用户提供服务之前/后需要做的一些事情,比如:记录登录连接信息,挂载目录等

control(required/requisite/sufficient/optional/include/substack)

  • required
    若当前行认证失败,认证过程仍旧继续,整个栈运行完毕之后返回认证失败;若成功,继续下一个认证。
  • requisite
    若当前行认证失败,则立即中止并返回认证失败;若成功,继续下一个认证。
  • sufficient
    若当前行认证成功,并且之前没有任何required认证失败,则立即返回认证成功;若失败,不对结果造成影响并进行下一个认证。
  • optional
    仅当整个栈中只有这一个认证时才有决定性作用,否则当前行的认证跟最终结果无关。
  • include
    将其他配置文件中的所有行包含在当前的位置并运行。
  • substack
    类似include,但substack所包含的行将作为一个子栈,其运行过程不会影响到母栈,子栈的运行结果将作为当前行认证的结果输出。

module-path(模块路径)

如果以“/”开头,则表示模块的全路径,否则表示相对于/lib/security/或/lib64/security/的相对路径。

[[email protected] ~]# ls -l /lib64/security/
total 732
-rwxr-xr-x  1 root root 18552 Mar 22  2017 pam_access.so
-rwxr-xr-x. 1 root root  7504 Dec  8  2011 pam_cap.so
-rwxr-xr-x  1 root root 10272 Mar 22  2017 pam_chroot.so
-rwxr-xr-x  1 root root 27080 Mar 22  2017 pam_console.so
-rwxr-xr-x  1 root root 14432 Mar 22  2017 pam_cracklib.so
-rwxr-xr-x  1 root root 10168 Mar 22  2017 pam_debug.so
-rwxr-xr-x  1 root root  5952 Mar 22  2017 pam_deny.so
... 

 

module-arguments(模块参数)

3、可用模块

官方文档:http://www.linux-pam.org/Linux-PAM-html/sag-module-reference.html

pam_access - 日志监控风格的访问控制

pam_access.so [ debug ] [ nodefgroup ] [ noaudit ] [ accessfile=file ] [ fieldsep=sep ] [ listsep=sep ]

(1)使用介绍

当用户要访问应用程序时,accessfile(默认是/etc/security/access.conf)就会被扫描来检测用户是否具有访问权限并返回结果。

accessfile中的每一行都包括三个域,以冒号隔开,如下所示:

permission:users/groups:origins

  • 第一个域,permission,值为+或-,+表示允许访问,-表示拒绝访问;
  • 第二个域,users/groups,列出一个或多个用户名/组名,或者直接使用ALL(代表所有用户和组)。为了区分用户名和组名,组名应加上括号,例如:(group);
  • 第三个域,origins,列出一种或多种登录方式,如:tty名称(tty是本地虚拟终端,比如:在阿里云CentOS实例的远程连接中可以切换到不同的虚拟终端,CTRL+ALT+F1代表切换到tty1,CTRL+ALT+F2代表切换到tty2,如此类推),IP地址,ALL(代表所有登录方式)等

(2)参数说明

  • debug
    大量的调试信息会被syslog记录下来
  • nodefgroup
    只有写在括号内的名称才会去匹配组文件,例如:(wheel),若没有设置该参数,则先匹配用户文件再匹配组文件
  • noaudit
    当有用户从未被允许的主机或终端登录时,事件不会被报告
  • accessfile=/path/to/access.conf
    设置配置文件路径,主要用于不同的服务对应不同的配置
  • fieldsep=separators
    配置文件的域分隔符,默认的域分隔符是英文冒号,如果fieldsep=|,那么|将作为域分隔符,而英文冒号则被看作普通字符
  • listsep=separators
    每个域都是一个列表,该选项改变配置文件的列表分隔符,默认的列表分隔符是空格,如果listsep=,,那么逗号将作为列表分隔符,而空格则被看作普通字符,这可能用于用户名或组名含有空格的情况,但必须要注意的是此时字段值与分隔符之间也不能存在空格!

(3)应用场景

例1:限制用户的SSH登录

[[email protected] ~]# cp /etc/pam.d/sshd /etc/pam.d/sshd_backup

//修改SSH对应的PAM配置文件,新增pam_access模块认证
[[email protected] ~]# vi /etc/pam.d/sshd

#%PAM-1.0
account    requisite     pam_access.so nodefgroup accessfile=/etc/mypam/access_ssh.conf fieldsep=| listsep=,

[[email protected] ~]# mkdir /etc/mypam

//编辑accessfile(注:匹配的顺序从第一行开始)
[[email protected] ~]# vi /etc/mypam/access_ssh.conf

#允许root和组mygroup1的成员登录
+|root (mygroup1)|ALL

#拒绝root和组mygroup1的成员以外的用户登录
-|ALL EXCEPT root (mygroup1)|ALL

#拒绝指定用户从非指定的ip进行登录
-|cjh|ALL EXCEPT 120.231.146.242

pam_nologin - 防止非root用户登录

http://www.linux-pam.org/Linux-PAM-html/sag-pam_nologin.html

pam_tally2 - 登录计数器

http://www.linux-pam.org/Linux-PAM-html/sag-pam_tally2.html

时间: 2024-11-13 07:44:08

PAM - 可插拔认证模块的相关文章

Linux可插拔认证模块(PAM)的配置文件、工作原理与流程

PAM的配置文件: 我们注意到,配置文件也放在了在应用接口层中,他与PAM API配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的.他的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模块的行为.下面是一个示例配置文件: # cat /etc/pam.d/system-auth: #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is

可插拔认证模块(PAM)概述(转载)

一.可插入验证模块(PAM)        在过去,每个程序都会使用自己的方法来对用户身份进行验证.在红帽企业Linux中,多数程序被配置使用一个集中化的用户身份验证方法叫作可插入验证模块(Pluggable Authentication Modules)(PAM).        PAM使用一个可插入式的,模块化的结构.它为系统管理员设置用户身份验证政策提供了很大的灵活性.        在多数情况下,一个支持PAM的应用程序的默认PAM配置文件就可以满足一般的要求.但是在一些情况下,还是需要

常用的Linux可插拔认证模块(PAM)应用举例(一)

pam_access.so模块 pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN).IP地址和用户实现全面的访问控制.pam_access.so模块的具体工作行为根据配置文件/etc/security/access.conf来决定.该配置文件的主体包含了三个字段——权限.用户和访问发起方.格式上是一个用“:”隔开的表. 第一个字段:权限(permission),使用“+”表示授予权限,用“-”表示禁止权限. 第二个字段:用户(user),定义了用户.组以及用

[read -p应用]插拔光模块去检查port present状态

1 #!/bin/bash 2 path="/sys/devices/platform/soc/fd880000.i2c-pld/i2c-0/i2c-4/i2c-15/15-0060" 3 arry=(module_interrupt module_present)#定义数组元素,可以扩展为多个,或仅为一个元素 4 5 for f_log in ${arry[*]} 6 do 7 rm -rf $f_log*.log 8 done 9 10 11 for i in {1..32} 12

TCP WRAPPERS、denyhosts软件的安装和配置、PAM身份认证模块应用

一.TCP WRAPPERS 1.TCP WRAPPERS的作用是什么? 保护服务器的一些服务,可以限制客户端访问这些服务. TCP WRAPPERS支持那些服务?判断一个服务是否支持TCP WRAPPERS的保护有那些方法? 查看该服务是否加载libwrap,查看该服务是不是基于xinetd服务. ssh ,vsftpd,telnet,http(不支持wrap模块)ipop3 2.检查服务是否支持被TCP WRAPPERS保护 3.防护规则存放在 /etc/hosts.allow /etc/h

Pam认证模块

pam:做认证的,nss:做用户(像ldap) /lib64/security/:所有pam模块都在这里存放着.(64位系统便是在/lib64存放着) /etc/pam.d/:pam服务的配置文件. 模块调用必须放在/lib64/security/这个目录下. 每个模块有4个功能的认证 auth:认证用户是否存在,然后再寻找pam account:比对账户的,例如账户身份是否过期. password:控制认证的更新,如密码的更改.复杂度. session:只记录事件.行为.例如:控制用户的进程.

Linux-PAM认证模块

Linux-PAM认证模块 用户访问服务器的时候,服务器的某一个服务程序把用户的谁请求发送到PAM模块进行认证.对于不同的服务器应用程序所对应的PAM模块也是不同的.如果想查看某个程序是否支持PAM认证,可以用ldd命令进行检查: 例如:查看sshd是不是支持PAM模块认证: 由于在程序模块里链接了libpam.so.0 =< /lib/libpam.so.0 ,说明此程序可以进行PAM认证. 当一个服务器请求PAM模块的时候,PAM本身是不提供服务验证的,它是调用其它的一群模块来进行服务器请求

Django-settings可插拔实现

Setting可插拔 django暴露了一个可以给用户自定义配置的文件,优先使用用户配置的信息,而且必须要大写才有效 文件目录 --about_settings --conf --__init__.py --global_settings.py 默认配置文件 --user --settings.py 用户配置文件 --start.py 启动文件 start.py import os import sys #将项目的根目录配置到模块搜索路径,提高兼容性 BASE_DIR = os.path.dir

重新开发Jumpserver用户认证模块,调用独立认证接口(一)

一.概述 Jumpserver用的是python的django框架开发,所以主要完成两个事情: 1.开发自己的认证后台 一个认证后台就是要实现如下两个方法的类: get_user(id) 和 authenticate(**credentials) . 方法 get_user 返回一个 User 对象,参数 id 可以是用户名或者数据库ID.  方法authenticate(**credentials)可以使用密码.token或者已有的认证接口实现身份认证,返回User对象.如果你的认证后台的Us