这篇报告实际上是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手册。
配置实验
- 创建一个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即可。