基于PAM的用户权能分配

这篇报告实际上是OS安全的一个小作业,放上来感觉可能会对未来的学弟学妹有所帮助。

基于PAM用户权限设置系统

PAM简要介绍

PAM,全称Pluggable Authentication Modules for Linux,即Linux下的可拔插验证模块,可以允许系统管理员选择应用验证用户的方式。

早期,如果一个应用需要验证一个用户,需要在编译层面上加入特殊的验证机制。而传统的UNIX系统验证用户身份的方式是让用户输入一个正确的密码。这个密码,在经过加盐处理后,进行加密。然后如果这个加密的密码与系统密码数据库相同,用户就通过认证了。在这样的系统中,不是所有的权限都是按这种单一的验证机制来授予,大部分是通过组机制来授予的。

Linux-PAM的目的是将权限授予软件的开发与合适验证方案的开发分开来。应用通过使用PAM的库函数来实现用户认证机制。PAM的设置通常在/etc/pam.d/路径下,原理图如下。

  +----------------+
  | application: X |
  +----------------+       /  +----------+     +================+
  | authentication-[---->--\--] Linux-   |--<--| PAM config file|
  |       +        [----<--/--]   PAM    |     |================|
  |[conversation()][--+    \  |          |     | X auth .. a.so |
  +----------------+  |    /  +-n--n-----+     | X auth .. b.so |
  |                |  |       __|  |           |           _____/
  |  service user  |  A      |     |           |____,-----'
  |                |  |      V     A
  +----------------+  +------|-----|---------+ -----+------+
                         +---u-----u----+    |      |      |
                         |   auth....   |--[ a ]--[ b ]--[ c ]
                         +--------------+
                         |   acct....   |--[ b ]--[ d ]
                         +--------------+
                         |   password   |--[ b ]--[ c ]
                         +--------------+
                         |   session    |--[ e ]--[ c ]
                         +--------------+

使用PAM的方式就是在设置下添加相应的规则。PAM设置语法如下:

service type control module-path module-arguments
  • service:表示服务的名字,比如telnet,login,ftp等。
  • type:表示四种模块类型,有auth、account、open_session、close_session、password。
  • control:用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败的情况,有四个可能的值:required、requisite、sufficient、optional。
  • module-path:表示用来指明本模块对应的程序文件的路径名,一般采用绝对路径。
  • module-arguments:传递给该模块的参数

具体的说明可以查看PAM手册

配置实验
  1. 创建一个testping用户

在这里插入图片描述

以root权限清除ping命令的setuid位和各种权能

setcap -r /bin/ping
chmod u-s /bin/ping

切换到userping用户,并进行ping操作,发现无法ping成功。

在这里插入图片描述

切换到iskindar用户,同样进行ping操作,仍然无法成功

在这里插入图片描述

/usr/local/bin/目录下新建ping_cap.sh脚本文件,实现功能:当userping用户登录时,给/bin/ping添加权能

#!/bin/sh
[ "$PAM_TYPE" == "open_session" ] || exit 0

if [ "$PAM_USER" == "testping" ]; then
	setcap cap_net_raw=eip /bin/ping
	echo "SUCCESS"
else
	setcap -r /bin/ping
	echo "Clear Capabilities"
fi
chmod u+x /usr/loca/bin/ping_cap.sh

由于所有登录都是使用common-session模块

在这里插入图片描述
/etc/pam.d/common-session文件中添加如下规则:

vim /etc/pam.d/common-session

session  optional  pam_exec.so debug log=/tmp/pam_exec.log seteuid /usr/local/bin/ping_cap.sh

pam_exec是PAM的一个可以使用外部命令的模块。

  • session:在用户登陆前把事情给干完,比如挂载目录、记录一些关键信息等
  • optional:可选的,一般不会对身份认证起作用。这里是为了防止脚本赋权失败导致用户无法登录。
  • debug:打印debug信息
  • log=/tmp/pam_exec.log:命令的打印信息会打印到这个文件
  • seteuid: pam_exec.so会用真实用户ID执行外部命令。
  • /usr/local/bin/ping_cap.sh:外部命令

切换到userping用户,使用ping命令,这次就可以ping通了。

在这里插入图片描述
切换到iskindar用户,会发现仍然无法ping

在这里插入图片描述

查看pam_exec的日志,发现刚刚切换用户时的日志信息都成功打印了。

在这里插入图片描述

实验总结

本实验参考了网上挺多的博客,取长补短,解决了其userping用户退出会影响其他用户对ping的使用的缺点。这次实验基于PAM来设置用户权限。利用了PAM的pam_exec模块来执行外部命令,进而为userping用户赋予允许使用原生套接字的权能,从而来userping用户能够使用ping命令。当userping用户退出时,切换到别的用户时,会自动执行清除/bin/ping的权能,从而避免不该使用ping命令的用户执行ping。值得注意的是,这个外部命令的权限很大,能够赋予userping权能,但对于userping来说是可执行、不可读和不可写的状态,也避免了userping用户利用这个外部命令滥用权力。

遇到的两个小问题

1.执行脚本文件出现错误:

[: missing ]

这里是语法错误,中括号需要和前面的字符空一个空格。

错误代码:

[ "$PAM_TYPE" == "open_session"] || exit 0

在session的引号后面加个空格:

[ "$PAM_TYPE" == "open_session" ] || exit 0

2.执行脚本文件时出现以下错误:

[: XXXX: unexpected operator

原因:ubuntu默认的sh是dash,dash跟bash不兼容导致出错。

解决方法:将ubuntu解释器修改默认连接到bash

输入命令:

sudo dpkg-reconfigure dash

弹出一个窗口,选择NO即可。

参考资料

<think>好的,用户想了解单片机启动流程,特别是希望有一个图示解析。首先,我需要回忆单片机启动的基本步骤,并结合用户提供的参考资料来组织答案。用户提到的引用[2]提到了STM32F10x.s启动文件的三个主要工作,这应该是关键点。 首先,单片机后,硬件会初始化复位向量,让程序计数器指向复位处理函数。接着启动文件负责设置堆栈,分配内存空间,这是系统运行的基础。然后初始化.data段和.bss段,前者存放已初始化的全局变量,后者处理未初始化的静态变量。之后调用SystemInit函数配置时钟,确保系统时钟正确。最后跳转到main函数,开始执行用户代码。 用户可能需要更详细的步骤解释,以及每个阶段的作用。比如,堆栈初始化为什么重要,中断向量表的作用是什么。同时,结合引用[2]中的内容,可以强调启动文件的具体任务,如分配堆栈、定义复位向量和中断向量表处理。 另外,用户提到需要图示解析,虽然无法直接提供图片,但可以用文字描述各个步骤的流程图,并建议参考相关文档或教程中的图示,比如引用[1]中的Proteus和Keil联调例程可能有相关示意图。 还需要检查是否有遗漏的步骤,比如某些单片机可能有的看门狗初始化或硬件自检过程,但根据提供的引用,可能不需要深入这些细节。确保语言简洁明了,符合中文表达,避免使用Markdown格式,用自然的分段和编号来组织内容。 最后,生成相关问题时要围绕启动流程的各个部分,比如启动文件的作用、堆栈初始化、中断向量表等,帮助用户进一步理解可能遇到的疑问点。</think>### 单片机启动流程解析 单片机启动流程是系统从加复位到执行用户程序的初始化过程,其核心步骤可概括如下: 1. **硬件复位** 上后,硬件复位路触发,程序计数器(PC)指向复位向量地址(通常为`0x00000000`或特定地址)。此处存放复位处理函数的入口地址[^2]。 2. **启动文件初始化(以STM32为例)** - **堆栈分配**:分配并初始化栈(Stack)和堆(Heap)空间,栈用于函数调用和局部变量存储,堆用于动态内存分配[^2]。 - **中断向量表**:定义中断向量表,每个中断对应一个异常处理程序的入口地址。例如: ```c __Vectors DCD __initial_sp ; 栈顶地址 DCD Reset_Handler ; 复位处理函数 DCD NMI_Handler ; NMI中断处理 ... ; 其他中断向量 ``` - **初始化.data和.bss段**: - `.data`段(已初始化的全局变量)从Flash复制到RAM。 - `.bss`段(未初始化的静态变量)清零。 3. **系统时钟配置** 调用`SystemInit()`函数初始化时钟源(如HSI、HSE),配置PLL生成系统主频(如72MHz)。 4. **跳转至用户程序** 最终通过`__main`或直接调用`main()`函数进入用户代码。 ### 启动流程图示说明(文字描述) ``` 加复位 → 复位向量跳转 → 初始化堆栈 → 复制.data段 → 清零.bss段 → 配置系统时钟 → 执行main() ``` ### 相关问题 1. 启动文件中中断向量表的作用是什么?如何自定义中断服务函数? 2. 堆(Heap)和栈(Stack)在单片机运行时有什么区别? 3. 如何验证.data段和.bss段的初始化是否成功? 4. 若系统时钟配置失败会导致哪些问题? [^1]: 参考启动文件与硬件初始化关系的示例代码和仿真流程。 : 基于STM32启动文件的核心功能描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值