基于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即可。

参考资料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章