完成实验楼上Linux安全类实验中的一个,两人一组,题目不能重复。
在本周日晚12:00前发学习博客(标题 学号《Linux内核原理与分析》第十三周作业),重点是遇到的问题和解决方案。不按时交作业会扣分。
Linux Capability探索实验
下载Libcap
libcap 库能够使用户级别的程序与 capability 特性做交互,一些linux发行版不包括这个库,在环境中已经有 /usr/include/sys/capability.h 这个文件,为了避免老版本的影响,我们还是删掉以前的,然后重新下载一个。
$ cd
$ wget http://labfile.oss.aliyuncs.com/libcap-2.21.tar.gz
$ tar xvf libcap-2.21.tar.gz
$ sudo rm /usr/include/sys/capability.h
$ sudo rm /lib/libcap.so*
$ cd /home/shiyanlou/libcap-2.21/
$ sudo make
$ sudo make install
需要熟悉以下命令:
setcap: 给一个文件分配capabilities
getcap: 显示文件所带的capabilities
getpcaps: 显示线程所在的capabilities
在一个capability系统中,当一个程序运行时,对应的线程会初始化一系列capabilities(令牌)。当线程尝试访问某个对象时,操作系统会检查该线程的capabilities,并决定是否授权访问。
3.1 感受一下Capabilities
在操作系统中,有许多只允许超级用户使用的操作,比如配置网卡,备份所有用户文件,关闭计算机等,但如果要进行这些操作就必须先成为超级用户的话,那就违背了最小权限原则。
Set-UID程序允许用户暂时以root权限进行操作,即使程序中所进行的权限操作用不到root权限的所有权利,这很危险:因为如果程序被入侵了的话,攻击者可能得到root权限。
Capabilities将root权限分割成了权利更小的权限。小权限被称作capability。如果使用capabilities,那么攻击者最多只能得到小权限,无法得到root权限。这样,风险就被降低了。
在kernel版本2.6.24之后,Capabilities可以分配给文件(比如程序文件),线程会自带程序文件被分配到的capabilities。
下面这个例子演示capabilities如何移除root特权程序中的不必要的权利。
首先,以普通用户登录并运行以下命令:
$ ping -c 3 www.baidu.com
命令成功运行,如果你查看/bin/ping的属性会发现它是一个root所有的Set-UID程序。如果ping中包含漏洞,那么整个系统就可能被入侵。问题是我们是否能移除ping的这些权限。
接下来关闭程序的suid位:
$ sudo su
(注:1. 请先which ping确认ping的真正位置,2. #开头说明以root权限运行命令,普通用户下请自行在命令前加sudo)
现在再ping百度看会发生些什么:
# exit
$ ping www.baidu.com
ping: icmp open socket: Operation not permitted
它会提示你操作不被允许。这是因为ping命令需要打开RAW套接字,该操作需要root特权,这就是为什么ping是Set-UID程序了。但有了capability,我们就可以杯酒释兵权了,让我们分配cap_net_raw给ping,看看会发生什么:
$ sudo su
# setcap cap_net_raw=ep /bin/ping
# exit
$ ping -c 3 www.baidu.com
1.取消下列程序的Set-UID并不影响它的行为。
这一步证明一开始无法修改密码,但是在分配了cap之后就可以成功修改密码:
seed 用户的密码是 dees
$