如何通过PAM禁止部分用户登录

news2024/9/30 11:23:24

如何通过 PAM 限制对 SSH 服务的根访问

如题。客户提出这样一个需求:限制和允许部分账号的SSH登录,限制名单可调。乍一看,这需求完全不合理啊?这又要改多少代码?但——PAM从脑海中一闪而过,想到一个办法,不改代码,也有办法。

PAM是如何运作的?

在这里插入图片描述

Linux-PAM(从Unix-PAM架构演变而来的可插拔身份验证模块的缩写)是一套功能强大的共享库,用于对Linux系统中的应用程序(或服务)动态验证用户。

它将多个低级身份验证模块集成到一个高级 API 中,为应用程序提供动态身份验证支持。这允许开发人员编写需要身份验证的应用程序,独立于基础身份验证系统。

许多现代Linux发行版默认支持Linux-PAM(以下简称“PAM”)。在本文中,我们将解释如何在 Ubuntu 和 CentOS 系统中配置高级 PAM。

在我们继续之前,请注意:

  1. 作为系统管理员,最重要的是掌握 PAM 配置文件如何定义应用程序(服务)和执行实际身份验证任务的可插拔身份验证模块 (PAM) 之间的连接。您不一定需要了解 PAM 的内部工作原理。
  2. PAM有可能严重改变Linux系统的安全性。错误的配置可能会部分或完全禁用对系统的访问。例如,意外删除 /etc/pam.d/*//etc/pam.conf 下的配置文件可能会将您锁定在自己的系统之外!

如何检查程序是否可识别 PAM

要使用 PAM,应用程序/程序需要“识别 PAM”;它需要专门编写和编译才能使用 PAM。要确定程序是否“PAM 感知”,请使用 ldd 命令检查它是否已使用 PAM 库编译。例如sshd:

$ sudo ldd /usr/sbin/sshd | grep libpam.so
    ................
	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)
    ................

在这里插入图片描述

如何在 Linux 中配置 PAM

PAM 的主配置文件是 /etc/pam.conf/etc/pam.d/ 目录包含每个 PAM 感知应用程序/服务的 PAM 配置文件。如果目录存在,PAM 将忽略该文件。

主配置文件的语法如下。该文件由写在一行上的规则列表组成(您可以使用 “\” 转义字符扩展规则),注释前面带有 “#” 标记并延伸到行的下一端。

每个规则的格式都是以空格分隔的标记集合(前三个不区分大小写)。我们将在后续部分中解释这些令牌。

service type control-flag module module-arguments

  1. service:服务:实际应用程序名称。
  2. type:类型:模块类型/上下文/接口。
  3. control-flag:指示模块在其身份验证任务中失败时 PAM-API 的行为。
  4. module:PAM 的绝对文件名或相对路径名。相对路径的根一般是/lib
  5. module-arguments:用于控制模块行为的空格分隔的标记列表。若模块本身不接收参数则可以忽略。

/etc/pam.d/ 中每个文件的语法类似于主文件的语法,由以下形式的行组成:

type control-flag module module-arguments

这是在 /etc/pam.d/sshd 文件中找到的规则定义(没有模块参数)的示例,当 /etc/nologin 存在时,该文件不允许非 root 登录:

account required pam_nologin.so

了解 PAM 管理组和控制标志

PAM 身份验证任务分为四个独立的管理组。这些组管理典型用户对受限服务的请求的不同方面。模块与以下管理组类型之一相关联:

  1. account:提供账号验证服务:用户密码是否过期?是否允许此用户访问请求的服务?
  2. authentication:对用户进行身份验证并设置用户凭据。
  3. password:负责更新用户密码并与身份验证模块协同工作。
  4. session:管理在会话开始时和会话结束时执行的操作。即登录成功时和注销退出时。用的最多的是在登录成功时创建用户的HOME目录。

PAM 可加载对象文件(模块)应位于以下目录中:/lib/security//lib64/security,具体取决于体系结构。支持的控件标志包括:

  1. requisite:必要条件:故障立即将控制权返回给应用程序,指示第一个模块故障的性质。
  2. required:PAM认证要求所有这些模块成功才能成功,全部成功后才能将成功返回给应用程序,无视两个模块中间的返回操作。有的同学的某些配置不起作用,原因就是在这里了。
  3. sufficient:足够:假设前面的所有模块都已成功,则此模块的成功会导致立即成功返回到应用程序(忽略此模块的失败)。
  4. optional:可选:此模块的成功或失败一般不记录。

除了上述关键字之外,还有另外两个有效的控制标志:includesubstack:包括指定为此控件的参数的配置文件中给定类型的所有行。

如何通过 PAM 限制对 SSH 服务的根访问

例如,我们将配置如何使用 PAM 禁用根用户通过 SSH 和登录程序对系统的访问。在这里,我们希望通过限制对登录和 sshd 服务的访问来禁用 root 用户对系统的访问。

我们可以使用 /lib/security/pam_listfile.so 模块,它在限制特定帐户的权限方面提供了极大的灵活性。在 /etc/pam.d/ 目录中打开并编辑目标服务的文件,如下所示。

$ sudo vim /etc/pam.d/sshd
OR
$ sudo vim /etc/pam.d/login

在两个文件中添加此规则:

auth    required       pam_listfile.so \
        onerr=succeed  item=user  sense=deny  file=/etc/ssh/deniedusers

再详细解释上述规则中的令牌:

  1. auth:身份验证:是模块类型(或上下文)。
  2. required:必需:是一个控制标志,表示如果使用模块,则无论其他模块的状态如何,它都必须通过,否则总体结果都将失败。
  3. pam_listfile.so:一个模块,它提供了一种基于任意文件拒绝或允许服务的方法。
  4. onerr=succeed:模块参数。出错返回成功。防止操作失误:文件不存在导致所有账号都无法登录。
  5. item=user:模块参数,指定文件中列出并应检查的内容。
  6. sense=deny:模块参数,指定在文件中找到时要执行的操作,如果在文件中找不到该项,则请求相反的操作。此操作就是客户需求的关键实现。
  7. file=/etc/ssh/deniedusers:模块参数,指定每行包含一个项目的文件。

接下来,我们需要创建文件 /etc/ssh/deniedusers 并在其中添加名称 root:从现在开始,上述规则将告诉 PAM 查阅 /etc/ssh/deniedusers 文件,并拒绝任何列出的用户访问 SSH 和登录服务。

如何在 Linux 中配置高级 PAM

若要编写更复杂的 PAM 规则,可以使用以下形式的有效控制标志:

type [value1=action1 value2=action2 …] module module-arguments

其中 valueN 对应于为其定义行的模块中调用的函数的返回代码。您可以从在线 PAM 管理员指南中找到支持的值。特殊值是默认值,这意味着所有值 N 都没有明确提及。操作 N 可以采用以下形式之一:

  1. ignore:忽略:如果此操作用于模块堆栈,则模块的返回状态不会对应用程序获取的返回代码产生影响。
  2. bad:错误:指示应将返回代码视为模块失败的指示。如果此模块是堆栈中第一个失败的模块,则其状态值将用于整个堆栈的状态值。
  3. die:等同于坏,但可能会终止模块堆栈,PAM 会立即返回到应用程序。
  4. ok:确定:这指示 PAM 系统管理员认为此返回代码应直接影响整个模块堆栈的返回代码。
  5. done:等效于 ok,但可能会终止模块堆栈,PAM 会立即返回到应用程序。
  6. N(无符号整数):等效于 ok,但可能会跳过堆栈中接下来的 N 个模块。
  7. reset:重置:此操作将清除所有内存中的模块堆栈状态,并使用下一个堆叠模块重新启动。

四个关键字中的每一个: required; requisite; sufficient; optional,在 [...] 语法方面有一个等效的表达式,它允许您编写更复杂的规则,它们是:

  1. required: [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  2. requisite: [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  3. sufficient: [success=done new_authtok_reqd=done default=ignore]
  4. optional: [success=ok new_authtok_reqd=ok default=ignore]

以下是现代 CentOS 7 系统的示例。让我们从 /etc/pam.d/postlogin PAM 文件中考虑这些规则:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
session     [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session     [default=1]   pam_lastlog.so nowtmp showfailed
session     optional      pam_lastlog.so silent noupdate showfailed

下面是 /etc/pam.d/smartcard-auth PAM 文件中的另一个示例配置:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    required      pam_pkcs11.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

总结

在这里插入图片描述

PAM 是一个功能强大的高级 API,它允许依赖于身份验证的程序向 Linux 系统中的应用程序提供真实用户。它功能强大,但理解和使用起来非常具有挑战性。在本文中,我们已经解释了如何在 Ubuntu 和 CentOS 中配置 PAM 的高级功能。如果您有任何问题或意见要分享,欢迎留言评论。

作者:岬淢箫声
日期:2023年10月24日
版本:1.0
链接:http://caowei.blog.csdn.net

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axi接口的DDR3:参数,时序,握手机制

参考 AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事&#xff1f;_axi wrap-CSDN博客 还有官方手册&#xff0c;名字太长想起来再写。 Transaction/Burst/Transfer/Beat Transaction指一次传输事务&#xff0c;实际上包括了address phase, data phase与response ph…

Git版本管理及使用规范

git是目前为止版本管理的最常用工具之一&#xff0c;利用git的功能&#xff0c;可以很容易的实现版本的发布和留档&#xff0c;让原本杂乱的版本管理问题变得较为简单。 Git分支管理和常用流程 Git的常用分支包括&#xff1a;tag(git的功能&#xff0c;并不是真正的分支)、ma…

测试报告和结果分析 —— allure整合pytest生成测试报告

一、生成HTML测试报告的三种方式&#xff1a; 1、unittest和HTMLTestRunner整合 2、allure和pytest整合 3、Jenkins中安装allure插件&#xff08;Jenkins安装插件出错&#xff0c;不能正常使用&#xff09; 二、allure整合pytest生成html测试报告&#xff1a; 1.下载allur…

云服务介绍

云服务 1.概念 云服务&#xff0c;顾名思义就是云上的服务&#xff0c;简单的来说就是在云厂商&#xff08;例如 AWS、阿里云&#xff09;那里买的服务。 目前国内云厂商有阿里云、腾讯云、华为云、天翼云、Ucloud、金山云等等&#xff0c;国外有亚马逊的 AWS、Google 的 GC…

C++ 读MTK代码 综测校准 PSU经典接口读各种型号开关电源电压或电流 visa

为啥要使用接口&#xff1f;因为有多个电源&#xff0c;接口都相似的。再加型号上层很少改动(类型切换)或不用改。 为啥要使用友元&#xff1f;友元函数的主要作用是允许外部函数或类访问被声明为友元的类的私有成员。 如果不使用友元怎么做&#xff1f;最后回答。 1.C定义dl…

SpringBoot Web 分层解耦

目录 分层解耦三层架构介绍代码拆分 分层解耦耦合问题解耦思路 IOC&DIIOC&DI入门IOC详解bean的声明组件扫描 DI详解 在SpringBoot Web请求响应这篇文章的案例中提到&#xff0c;解析XML数据&#xff0c;获取数据的代码&#xff0c;处理数据的逻辑的代码&#xff0c;给页…

教你如何给『linux』打补丁

前言 我们在参与某些开源项目的过程当中&#xff0c;经常会遇到漏洞之类的问题&#xff0c;需要我们打补丁解决。尤其是 Linux 源码&#xff0c;源码代码量较多&#xff0c;在修改完内核并发布新内核的时候&#xff0c;基本采用补丁的方式进行发布&#xff0c;而不是将整个内核…

【LeetCode刷题】2两数相加

2. 两数相加 JAVA代码 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xf…

MAC-设置mysql开机自启动

mac 设置mysql开机自启动 - MoonyHee - 博客园

学习网络编程No.8【应用层协议之HTTP】

引言&#xff1a; 北京时间&#xff1a;2023/10/9/13:03&#xff0c;一晃好多天过去了&#xff0c;9月14号的文章终于在昨天发出去了&#xff0c;也是许久没有更文了&#xff0c;国庆放假期间由于各种原因&#xff0c;在王者峡谷和铲子世界遨游的不亦乐乎&#xff0c;有待改善…

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下&#xff0c;方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

Node编写获取用户信息接口

目录 前言 初始化路由模块 使用postman发送get获取用户信息请求 初始化路由处理函数模块 获取用户基本信息 前言 在前两篇文章中已经介绍了如何编写用户注册接口以及用户登录接口&#xff0c;这篇文章介绍如何获取用户信息&#xff0c;本篇文章建立在Node编写用户登录接口…

国民技术N32G031 keil开发环境搭建

国民技术N32G031 keil开发环境搭建 目录 国民技术N32G031 keil开发环境搭建1 keil uVison5安装2 安装N32G031的pack包3 JLink添加Device&#xff08;非必须&#xff09;结束语 1 keil uVison5安装 这个网上的教程大把&#xff0c;我这里就不说了&#xff0c;同学们自行下载安装…

图像压缩(2)《数字图像处理》第八章 8.1节 基础知识

图像压缩&#xff08;1&#xff09;《数字图像处理》第八章8.1节基础知识 一. 前言二.引言三.基础知识8.1.1 编码冗余8.1.2 空间冗余和时间冗余8.1.3 不相关的信息8.1.4图像信息的度量8.1.5保真度准则8.1.6 图像压缩模型8.1.7 图像格式、容器和压缩标准四. 小结 一. 前言 始于…

Linux阻塞IO(高级字符设备二)

阻塞IO属于同步 IO&#xff0c;阻塞IO在Linux内核中是非常常用的 IO 模型&#xff0c;所依赖的机制是等待队列。 一、等待队列介绍 在 Linux 驱动程序中&#xff0c;阻塞进程可以使用等待队列来实现。等待队列是内核实现阻塞和唤醒的内核机制&#xff0c;以双循环链表为基础结…

【嵌入式开源库】timeslice的使用,完全解耦的时间片轮询框架构

完全解耦的时间片轮询框架构 简介项目代码timeslice.htimeslice.clist.hlist.c 创建工程移植代码实验函数说明timeslice_task_inittimeslice_task_addtimeslice_tak_deltimeslice_get_task_num 结尾 简介 timeslice是一个时间片轮询框架&#xff0c;他是一个完全解耦的时间片轮…

力扣刷题 day54:10-24

1.十进制整数的反码 每个非负整数 N 都有其二进制表示。例如&#xff0c; 5 可以被表示为二进制 "101"&#xff0c;11 可以用二进制 "1011" 表示&#xff0c;依此类推。注意&#xff0c;除 N 0 外&#xff0c;任何二进制表示中都不含前导零。 二进制的反…

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…

【数据结构练习题】消失的数字 --- 三种解法超详解

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;数据结构练习题 &#x1f388;相关博文&#xff1a;添加逗号 消失的数字 1. &#x1f388;题目2. &#x1f388;解题思路✨方法一&#xff1a;先排序&#xff0c;再找缺失的值✨方法二&#xff1a;按位…

怎么禁止员工上班追剧

怎么禁止员工上班追剧 安企神终端安全管理软件下载使用 说到员工上班追究打游戏摸鱼&#xff0c;其实是一种不负责任的行为&#xff0c;这样的行为不仅会影响到工作效率&#xff0c;还会给周围的同事带来不好的工作氛围&#xff0c;会造成恶性循环&#xff0c;所以&#xff0…