Linux安全认证隐匿插件:PAM配置探秘

Linux安全认证隐匿插件:PAM配置探秘

初遇PAM:踏入未知领域

案例:

现网环境升级总是报错端口已被占用,原因是执行升级包中的一条命令时,返回多了一条日志打印,导致升级包中解析命令执行结果错误

当时是第一次遇到这个问题,谁也不知道这条日志是系统在哪里配置打印的。

只能通过strace跟踪,看看执行这条命令时,进行了哪些系统调用,最后通过对比其他正常环境strace的结果,发现在打印Last Login之前,对比正常环境多执行了postlogin

简单的去搜索了一下pam.d下配置文件的作用,发现pam是linux的一个可插拔的认证模块,通过pam.d下的配置,可在不同的功能应用模块设置认证障碍。而postlogin的作用是配置在用户完成登录并且会话模块完成之后执行的一些操作

查看/etc/pam.d/postlogin.发现在postlogin配置了lastlog的pam模块,用于记录用户上次登录时间和来源

那为什么sudo命令会加载这个插件呢?

在/etc/pam.d目录下搜索了一下postlogin,发现还挺多的。此时还不知道是到底是哪个配置文件下的postlogin导致了这行日志打印

只能再通过strace  -e trace=open sudo ls (这里主要是观察sudo命令加载的认证插件)继续追踪

对比之下发现是system-auth这个配置文件。

原来这个文件的作用是定义系统上的默认身份验证规则和策略。调用 sudo 命令时会读取 /etc/pam.d/system-auth 文件是因为 sudo 是一个需要身份验证的特权管理工具。在执行 sudo 命令时,sudo 命令需要读取 /etc/pam.d/system-auth 文件以获取系统的默认身份验证规则和策略,以确定用户是否有权限执行请求的操作

解决方案:

方案1: 注释掉 /etc/pam.d/system-auth中session     include       postlogin

方案2:注释掉/etc/pam.d/postlogin 中的session     [default=1]   pam_lastlog.so  nowtmp showfailed

PAM详解:揭开神秘面纱

PAM简介

PAM全称是Pluggable Authentication Modules,可插拔认证模块,设计初衷,是将不同的底层认证机制,集中到一个高层次的API中,省去开发人员自己去设计和实现各种繁杂的认证机制的麻烦。

比如,对于常用命令su ,在执行时,需要做两件事:认证和启动相应的shell。

对于认证功能,开发人员一开始可能会判断,当前用户是不是root,如果不是root的,则要求输入 密码。这个逻辑并不复杂,容易开发。

但可能过了几天,用户提出,运维团队都属于wheel组,是否能让wheel组不用输入密码使用su切换。

等等,认证的需求,可能各式各样,如果每个命令都要去关注认证,那linux开发人员不仅不能专注自己业务模块,而且还会出现“重复造轮子”的情况。

所以伟大的PAM功能模块就出现了。

PAM的基础配置

Linux系统中每个支持pam的服务,都有一个与之对应的配置文件在/etc/pam.d/目录下

而支持这些配置的各个认证模块默认在/lib/security 或者/lib64/security目录下,以动态库文件的形式存在

/etc/pam.d/下配置文件的语法格式

模块类型(Type):PAM 配置文件中的每一行通常包含一个模块类型,指定了该行描述的模块在何时被调用。常见的模块类型包括 auth(身份验证)、account(账户)、password(密码)、session(会话)。

控制标记(Control Flags):在模块类型后面,可能会有一个或多个控制标记,用于指定模块的行为。常见的控制标记包括:

required:该模块必须成功才能继续进行认证过程。

requisite:如果该模块失败,认证过程将立即失败,且不会继续进行其他模块的认证。

sufficient:如果该模块成功,则认证过程将成功,且不会继续进行其他模块的认证。

optional:无论该模块成功或失败,认证过程都将继续进行。

include: 将其他配置文件中的流程栈包含在当前的位置

substack:运行其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出。

模块路径和参数:在控制标记后面,可以指定模块的路径和参数。路径指定了要使用的 PAM 模块的名称或路径,参数则是传递给模块的额外选项。

上述案例中其实也可以看出cat /etc/pam.d/sudo include了 system-auth模块,所以才会调用/etc/pam.d/system-auth配置中的postlogin。

PAM支持的认证插件

可以通过“man 模块”获取官方文档进行查看。此处不再赘述

再遇PAM:ssh秘钥登录缓慢,密码登录正常

案例:

产品部署失败,因为使用秘钥连接worker节点缓存,需要接近30s,导致节点认证失败

思路:使用traceroute和mtr排除了网络问题,怀疑是ssh的配置导致秘钥登录的方式过于缓慢,但是对比了现网环境和正常环境的ssh配置,发现也并无差异。

查看系统日志(由于环境开启了auditd审计日志,所以系统日志可能打印得比较多,先过滤ssh)

tail -f /var/log/messages | grep ssh

锁定这个时间段的日志,这是ssh开始到ssh成功结束的日志,再vim查看,发现在ssh期间一直在通过PAM插件进行session open 和session close

跟会话相关的PAM插件是pam_systemd.so, 负责在会话期间创建和关闭 systemd 作用域。

搜索/etc/pam.d/下是否配置了pam_systemd.so

发现在/etc/pam.d/password-auth中配置了,并且在/etc/pam.d/sshd中也include了password-auth

推测是 SSH 在每次进行认证时都会触发 PAM 模块的执行,这样会导致不断触发 pam_systemd.so 创建和关闭会话,并且记录审计日志,导致连接缓慢。

解决方案

在/etc/pam.d/password-auth注释掉-session     optional      pam_systemd.so

注释掉后,ssh秘钥登录响应时间立马从30s变成1s内,连接期间,审计日志也不再重复打印session open和session close的审计日志了

总结:

这些问题排查的难点是:

  1. 问题出在不了解的领域时,很难想到,特别是系统层面。遇到问题,在业务层面没有思路了时,strace和系统日志是很好的工具,因为所有的程序都是从业务层再到系统再到硬件的(有时还涉及到网络),这是一条完整的链路。
  2. 根据完整的链路,再逐个去查询单个的知识点,了解整个过程,那就没有什么问题可以难倒你了。

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

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

相关文章

【图论】图的存储--链式前向星存图法以及深度优先遍历图

图的存储 介绍 无向图-就是一种特殊的有向图-> 只用考虑有向图的存储即可 有向图 邻接矩阵邻接表 邻接表 存储结构: (为每一个点开了一个单链表,存储这个点可以到达哪个点) 1:3->4->null2:1->4->null3:4->null4:null 插入一条新的边 比如要插一条边&am…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (e)

接上文,继续来看这个函数: /*** brief Initializes the GPIOx peripheral according to the specified* parameters in the GPIO_InitStruct.* param GPIOx: where x can be (A..G) to select the GPIO peripheral.* param GPIO_InitStruct:…

C++ stl容器vector的认识与简单使用

目录 前言: 本篇文档图片引用自:https://cplusplus.com/reference/vector/vector/ 1.vector的结构 2.迭代器类型 3.构造函数 4.迭代器 反向迭代器遍历 const迭代器 5.容量 maxsize shrink_to_fit reverse resize 6.修改 insert和erase 7.…

[C#]OpenCvSharp利用MatchTemplate实现多目标匹配

【效果展示】 原图 模板图 匹配结果: 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using…

单链表专题

文章目录 目录1. 链表的概念及结构2. 实现单链表2.1 链表的打印2.2 链表的尾插2.3 链表的头插2.4 链表的尾删2.5 链表的头删2.6 查找2.7 在指定位置之前插入数据2.8 在指定位置之后插入数据2.9 删除pos节点2.10 删除pos之后的节点2.11 销毁链表 3. 链表的分类 目录 链表的概念…

苹果电脑怎么彻底删除软件 苹果电脑卸载软件在哪里 cleanmymac x怎么卸载 mac废纸篓怎么删除

苹果电脑卸载软件的方法相对直观和简单,尤其是对于习惯使用Mac操作系统的用户来说。以苹果MacBook Pro为例,以下是卸载软件的详细步骤、使用方法、注意事项与建议。 一、卸载软件的详细步骤: 1. 打开Mac电脑,进入桌面&#xff0c…

React面试

React渲染流程(重点) jsx描述界面 jsx babel render function>vdom vdom fiber 在进行渲染 vdom 转换fiber reconcile 转换过程创建dom commit 到domvdom React Element 对象, 只记录了子节点, 没有记录兄弟节点, 因为渲染不可中断 fiber fiberNode 对象, 是一个链表 父节…

linux大文件IO

在Linux中处理大文件(通常指大小超过2GB的文件)时,需要使用特定的系统调用和标志,以确保程序能够正确地处理大文件的读写。这主要是因为在32位系统上,传统的文件偏移量和文件大小使用off_t类型表示,它通常是…

HarmonyOS 开发-MpChart运动健康场景实践案例

介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI,MpChart主要包括线形图、柱状图、饼状图、蜡烛图、气泡图、雷达图、瀑布图…

GIF在线生成器

上传图片就能生成GIF的前端WEB工具 源码也非常简单 <!DOCTYPE html> <html lang"zh" class"dark"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1, m…

【opencv】示例-drawing.cpp画线、箭头、矩形、多边形、椭圆、圆形以及在图像上渲染文本并通过循环实现动态绘制效果...

#include "opencv2/core.hpp" // 引入opencv2核心头文件 #include "opencv2/imgproc.hpp" // 引入opencv2图像处理头文件 #include "opencv2/highgui.hpp" // 引入opencv2高级GUI(head-up display)头文件 #include <stdio.h> // 引入标准输…

生成随机图片验证码

随着互联网的不断发展&#xff0c;安全性问题日益突出。为了保障用户账号的安全性&#xff0c;很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序&#xff0c;可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验…

论文笔记:面向实体的多模态对齐与融合网络假新闻检测

整理了2022TMM期刊 Entity-Oriented Multi-Modal Alignment and Fusion Network for Fake News Detection&#xff09;论文的阅读笔记 背景模型改进的动态路由算法Cross-Modal Fusion 实验 背景 现有的假新闻方法对多模态特征进行各种跨模态交互和融合&#xff0c;在检测常见假…

MT3022 召唤神龙

思路&#xff1a;二分答案 。check():检查组p套卡是否成立&#xff0c;即检查r卡是否足够组成p套卡。 &#xff08;易错点&#xff1a;check的思路&#xff0c;开long long&#xff09; #include <bits/stdc.h> using namespace std; long long int n, m; long long int…

【VScode】同时编辑多处

【VScode】同时编辑多处 1. 多光标自定义批量编辑2. 选择多个&#xff0c;同时操作(批量选中局部匹配项)3. 取消选择4. 在不移动光标的情况下滚动屏幕5. 批量选中全局匹配项6.重点6.1 通过上下键选择多行6.2 同时选中所有行的末尾6.3 选中多列另一种方式6.4 通过正则的方式配置…

东方博宜 1582. 马里奥的银币2

东方博宜 1582. 马里奥的银币2 思路&#xff1a;这道题好简单~ 注意的点是 n/2 要记得变成浮点数 n/2.0 或者 n*1.0/2 #include<iostream> using namespace std; int main() {int a[1001] ;int n ;cin >> n ;for(int i 0 ; i < n ; i){cin >> a[i] ;}…

C++奇迹之旅:探索类对象模型内存的存储猜想

文章目录 &#x1f4dd;前言&#x1f320; 类的实例化&#x1f309;类对象模型 &#x1f320; 如何计算类对象的大小&#x1f309;类对象的存储方式猜想&#x1f320;猜想一&#xff1a;对象中包含类的各个成员&#x1f309;猜想二&#xff1a;代码只保存一份&#xff0c;在对象…

CST电磁仿真基本单位设置和保存结果【仿真教程】

保存结果的Result Navigator 积累的结果一目了然&#xff01; 用户界面上的Result Navigator 在一个仿真工程中更改变量取值进行仿真分析或者改变设置进行仿真分析时&#xff0c;之前的1DResult会不会消失呢&#xff1f; 1D Result&#xff1a;CST中1D Result指的是Y值取决…

VirusTaxo:病毒物种注释

https://github.com/omics-lab/VirusTaxo 安装 git clone https://github.com/omics-lab/VirusTaxo mamba create -n VirusTaxo python3.10 mamba activate VirusTaxo cd VirusTaxo python3 -m venv environment source ./environment/bin/activate pip install -r require…

DSP笔记12-PWM基础知识及EPWM

PWM pulse width modulation 脉冲宽度调制&#xff0c;宽度可调节的方波脉冲&#xff0c;驱动开关器件&#xff0c; 参数&#xff1a; 1.频率f 1kHz&#xff0c;2kHz开关损耗 2.周期T 3.幅值&#xff0c;高低电平之间电压 gpio输出3.3V&#xff0c;转换成5V高电平输出 4.占…