【PAM】Linux登录认证限制

ops/2024/10/25 8:15:58/

PAM(Pluggable Authentication Modules,可插拔认证模块)是一种灵活的认证框架,用于在 Linux 和其他类 Unix 系统上管理用户的身份验证。PAM 允许系统管理员通过配置不同的认证模块来定制应用程序和服务的认证方式,而不需要修改这些应用程序的源代码。

0、PAM 介绍

PAM 的核心概念

PAM 提供了一个模块化的认证系统,它由一系列模块和规则组成,来决定用户如何被认证、账户如何管理、密码如何处理以及如何管理用户会话。PAM 系统的设计使得它可以根据需要轻松增加或修改认证方式,而不会影响系统上的应用程序。

PAM 的主要功能:

  1. 身份验证(Authentication):验证用户身份,通常通过密码或其他认证方式(如指纹、双因素认证等)。
  2. 账户管理(Account Management):管理用户账户的状态,如账户是否过期、是否被锁定等。
  3. 密码管理(Password Management):控制密码的设置、修改,以及强制密码策略(如复杂度、到期等)。
  4. 会话管理(Session Management):管理用户会话的开始和结束,通常用于初始化或清理用户登录/注销时的环境。

PAM 的工作流程

PAM 通过读取位于 /etc/pam.d/ 目录下的配置文件来确定如何对某个服务进行认证。每个应用程序(如 SSH、sudologin 等)都有自己独立的 PAM 配置文件。例如,SSH 服务的 PAM 配置文件是 /etc/pam.d/sshd,本地登录的配置文件是 /etc/pam.d/login

每个 PAM 配置文件定义了一组模块,这些模块按照预定顺序执行。根据模块的执行结果,决定用户是否能够通过认证,或者账户是否被允许访问。

PAM 配置文件结构

每个 PAM 配置文件由若干行组成,每行定义了一个模块的使用方式。每行的格式如下:

<模块类型>   <控制标记>   <模块路径>   <可选参数>
  • 模块类型(Module Type):定义模块的功能,分为四类:

    1. auth:身份验证模块,用于验证用户身份。
    2. account:账户管理模块,用于管理用户账户的状态(如账户是否过期等)。
    3. password:密码管理模块,用于控制密码的设置和更新。
    4. session:会话管理模块,用于处理用户登录和退出时的操作。
  • 控制标记(Control Flag):决定当模块执行成功或失败时该如何处理。常见的控制标记有:

    • required:模块必须成功执行,如果失败了,会继续执行后续模块,但最终结果为失败。
    • requisite:模块必须成功,如果失败了,立即返回失败,不继续执行其他模块。
    • sufficient:如果该模块成功,则立即返回成功,不再执行其他模块。如果失败了,继续执行其他模块。
    • optional:模块的结果不会影响最终的认证结果,除非它是唯一的模块。
  • 模块路径(Module Path):指定要调用的 PAM 模块,通常位于 /lib/security/ 目录下。

  • 可选参数(Optional Arguments):用于传递给模块的配置参数。

PAM 配置文件示例

以下是一个 PAM 配置文件 /etc/pam.d/login 的简单示例:

auth       required     pam_env.so
auth       required     pam_unix.so
account    required     pam_unix.so
password   required     pam_unix.so
session    required     pam_unix.so
  • auth

    • pam_env.so:在用户登录时设置环境变量。
    • pam_unix.so:通过传统的 Unix 方式(如 /etc/passwd/etc/shadow)验证用户密码。
  • account

    • pam_unix.so:检查账户状态,确认用户是否有权限登录,密码是否过期。
  • password

    • pam_unix.so:用于更改用户密码。
  • session

    • pam_unix.so:管理用户会话的开始和结束,负责登录/注销时的必要操作。

PAM 的灵活性

PAM 的优势在于它的模块化设计。你可以为同一个服务组合多个模块,形成定制的认证方式。例如,你可以通过以下方式配置 SSH 登录:

  • 检查 /etc/nologin 文件是否存在(维护模式时阻止登录)。
  • 使用本地 Unix 密码进行验证。
  • 引入多因素认证模块(如 pam_google_authenticator)。
  • 使用 LDAP 或 RADIUS 模块进行远程用户认证。

常见 PAM 模块

  • pam_unix.so:传统 Unix 认证模块,使用 /etc/passwd/etc/shadow 进行认证。
  • pam_env.so:设置环境变量。
  • pam_tally2.so:用于限制登录失败次数,防止暴力破解。
  • pam_nologin.so:如果 /etc/nologin 文件存在,则阻止用户登录。
  • pam_ldap.so:通过 LDAP 进行用户认证。
  • pam_google_authenticator.so:使用 Google Authenticator 进行双因素认证。

1、登录认证限制

有个开发任务限制SSH登录和login(串口)登录的用户名,SSH只允许A用户登录,login只允许B用户登录。需要修改PAM配置。

查看验证文件

发现两个登录方式的验证规则都是/etc/pam_withunix
在这里插入图片描述

修改pam_withunix

/etc/pam_withunix文件的开头写入:

auth       required     /lib/security/pam_nologin.so
# Configuration for login service
auth       [success=1 default=ignore]     /lib/security/pam_succeed_if.so service != login
auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/defconfig/login_users onerr=fail
# Configuration for sshd service
auth       [success=1 default=ignore]     /lib/security/pam_succeed_if.so service != sshd
auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/defconfig/ssh_users onerr=fail

然后在/etc/defconfig/目录分别添加ssh_users 、login_users 文件,文件中写入各种运行登录的用户的用户名。
/etc/defconfig/ssh_users 和 /etc/defconfig/login_users 是自定义路径名称的文件,可以随意填写。

如果是限制的用户不多,推荐方法:
不需要添加文件,对于编译更友好,无需新增系统文件了

如果login 登录必须是用户a
如果sshd  登录必须是用户b# Configuration for login service
auth       [success=1 default=ignore]     /lib/security/pam_succeed_if.so service != login
auth       requisite    /lib/security/pam_succeed_if.so user = a# Configuration for sshd service
auth       [success=1 default=ignore]     /lib/security/pam_succeed_if.so service != sshd
auth       requisite    /lib/security/pam_succeed_if.so user = b

http://www.ppmy.cn/ops/117934.html

相关文章

将图片资源保存到服务器的盘符中

服务类 系统盘符&#xff1a;file-path.disk&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;文件根路径&#xff1a;file-path.root-path&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;http协议的Nginx的映射前缀&#xff1a;PrefixConstant.…

NAT和代理服务

文章目录 NAT和代理服务1、NAT技术背景2、NAT 技术 IP 转换过程3、NAPT4、NAT 技术的缺陷5、代理服务器5.1、正向代理5.1.1、概念5.1.2、工作原理5.1.3、功能特点5.1.4、应用场景 5.2、反向代理5.2.1、概念5.2.2、工作原理5.2.3、应用场景 6、NAT 和代理服务器 NAT和代理服务 …

18.2 k8s-apiserver监控源码解读

本节重点介绍 : k8s代码库和模块地址 下载 apiserver源码 apiserver中监控源码阅读 k8s源码地址分布 k8s代码库 访问github上k8s仓库&#xff0c;readme中给出了k8s 模块的代码地址举例图片 组件仓库列表 地址 Repositories currently staged here: k8s.io/apik8s.io/a…

List几种遍历方法速度

准备数据 ArrayList<Integer> list new ArrayList<Integer>();for (int i 0; i < 100000000; i) {list.add(i); }1.for循环 for (int i 0; i < list.size(); i) {Integer str list.get(i); }2.for-each循环 for (Integer vo:list) {}3.Lambda list.forEa…

Elasticsearch黑窗口启动乱码问题解决方案

问题描述 elasticsearch启动后有乱码现象 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; 到 \config 文件下找到 jvm.options 文件 打开后 在文件末尾空白处 添加 -Dfile.encodingGBK 保存后重启即可。

前端编码规范

1、开发规范 1.1、新增 view 在 /views (opens new window)文件下 创建对应的文件夹&#xff0c;一般性一个路由对应一个文件&#xff0c; 该模块下的功能就建议在本文件夹下创建一个新文件夹&#xff0c;各个功能模块维护自己的utils或components组件。 1.2、新增 api 在 /…

Redis中BigKey与MoreKey优化笔记

1.MoreKey 在Redis中&#xff0c;MoreKey问题通常指的是当数据库中的key数量非常多时&#xff0c;使用如KEYS *这样的命令去检索所有的key&#xff0c;这会导致Redis服务阻塞&#xff0c;影响正常业务。因为Redis是单线程操作的&#xff0c;执行这类命令时会占用大量时间&…

zookeeper面试题

1. 什么是zookeeper zookeeper是一个开源的 分布式协调服务。他是一个为分布式应用提供一致性服务的软件&#xff0c;分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。 Zooke…