计算机学院系统安全
实验二
细粒度权限管理及实现 root 能力的分发和管理
一、实验内容
(1) 模拟系统中密码修改机制,在自主访问控制系统中实现细粒度的权
限管理。配合第 3 章 在基于用户权限管理基础上,进行细粒度的权
限管理。
(2) 利用 root 的能力机制实现系统加固,有效实现 root 能力的分发和
管理。提供程序比较进行 root 能力管理前后系统安全性的差异。配
合第 4 章 实现 root 的多种能力的有效管理,提高 root 用户权利的
合理分发,测试 root 能力管理的安全性和有效性
二、实验设计
1.1 Linux 密码修改机制,passwd 程序功能的仿制实现
1、passwd 程序功能描述
在 Linux 中,passwd 程序是可信任的,修改存储经过加密的密码的影子密码
文件(/etc/shadow),passwd 程序执行它自己内部的安全策略,允许普通用户
修改属于他们自己的密码,同时允许 root 修改所有密码。为了执行这个受信任
的作业,passwd 程序需要有移动和重新创建 shadow 文件的能力,在标准 Linux
中,它有这个特权,因为 passwd 程序可执行文件在执行时被加上了 setuid 位,
它作为 root 用户(它能访问所有文件)允许,然而,许多程序都可以作为 root
允许(实际上,所有程序都有可能作为 root 允许)。这就意味着任何程序(当以
root 身份运行时)都有可能能够修改 shadow 文件。
2、实验要求
自己编制文件和程序,仿制 passwd 程序修改/etc/shadow 的功能,包括:
a) 自己设置一个类/etc/shadow 文件 aaa,该文件中约定好内容格式,和读
取该文件的程序相配合,文件中包括超级用户及其内容、普通用户及其内容
b)编制程序使得:Root 用户能够读取和修改 aaa 文件中所有用户的内容普通
用户仅能够读取和修改 aaa 文件中属于自己用户的内容
c)普通用户能以 root 身份执行所编制的类 passwd 程序
2.1 root 的 capability 使用
1、 修改系统内核,配置 capability 的能力位,实现几种能力位的设置可验
证。
样例:redhat 2.4 下的能力
1)函数说明
getcap 可以获得程序文件所具有的能力(CAP).
getpcaps 可以获得进程所具有的能力(CAP).
setcap 可以设置程序文件的能力(CAP).
2、实验要求:
(1)实现3种基本能力位的授权和查看,并分析授权前和授权后的差异;
(2)系统启动时关闭某能力位,对系统的应用和安全性有何影响,以具体
能力位为例说明,比如 cap_sys_module,cap_linux_immutable
(3)组合系统的部分能力位,实现系统的网络管理功能,或用户管理功能、
文件管理功能。
(4)编制攻击程序,测试能力位的安全性。
三、实验过程
1. 密码修改机制,passwd 程序功能的仿制实现
把 shadow 文件复制一下:然后粘贴在文件 myshadow 里,用命令:
cat /etc/myshadow 查看复制文件。
Lab2.c 文件根据输入命令:
./lab2 show 是输出全部用户
./lab2 change [user] password 是对 password 进行修改,
默认改为 6$FaUYKA8B$。因为 shadow 其实是加密后的密码,这里用
6$FaUYKA8B$来表示新密码。
Root 用户能够读取和修改 aaa 文件中所有用户的内容普通用户仅能够读取
和修改 aaa 文件中属于自己用户的内容
普通用户能以 root 身份执行所编制的类 passwd 程序
我们可以看到普通用户的 euid 和 suid 都为 0;
而且 shadow 文件属于 root,在组 shadow 中,但是 lab2 却可以修改它。说
明用户是用 root 权限去修改的 shadow。
下图中,Sakura 用户不可以看 shadow 文件,没有权限,但是却可以通过执
行./lab2 去查看权限位和密码加密值。说明普通用户能以 root 身份执行所编制
的类 passwd 程序。
2. root 的 capability 使用
(1)实现3种基本能力位的授权和查看,并分析授权前和授权后的差异;
授权能力 1:CAP_CHOWN 0(允许改变文件的所有权)
授权前:普通用户无权修改/bin/ls 的文件拥有者
授权普通用户可以用/bin/chown 程序更改任意文件的 owner,如下:
setcap cap_chown=eip /bin/chown
查看/bin/chown 程序的能力值,如下:
getcap /bin/chown
/bin/chown = cap_chown+eip
切换到 test 用户,将/bin/ls 程序的 owner 改为 test,如下:
su - test
chown test.test /bin/ls
ls -l /bin/ls
-rwxr-xr-x. 1 test test 118736 Jun 14 2010 /bin/ls
授权后:可以看到普通用户 user1 成功修改了/bin/ls 文件的拥有者
1) cap_chown=eip:
是将 chown 的能力以 cap_effective(e),cap_inheritable(i),cap_permitted(p)三
种位图的方式授权给相关的程序文件.
2)如果改变文件名,则能力保留到新文件.
3)用 setcap -r /bin/chown 可以删除掉文件的能力.
4)重新用 setcap 授权将覆盖之前的能力.
授权能力 2:CAP_DAC_READ_SEARCH 2(忽略所有对读、搜索操作的限制)
授权前:普通用户无权查看/etc/shadow 文件的内容
授权后:普通用户可以查看/etc/shadow 文件的内容
setcap cap_dac_read_search=eip /bin/cat
切换到普通用户
su – test
查看/etc/shadow,如下:
cat /etc/shadow
root:$6$3hJf.BoIVU/cdLKb$JxLXcQScrLS032aFPAQvVc4RzKYNadcIIzxmzAIw.jejrYO
Hhqdr0oV7sNBL.IhGBo.mMOYEdevlnCp2OGku8.:15094:0:99999:7:::
bin:*:14790:0:99999:7:::
daemon:*:14790:0:99999:7:::
adm:*:14790:0:99999:7:::
授权能力 3:CAP_KILL 5 (允许对不属于自己的进程发送 kill 信号)
首先在终端 1 以 root 身份启动一个进程 top:
授权前:在终端 2 普通用户试图结束 top 进程,没有权限不够的提醒,但是
终端 1 root 用户的 top 进程还在运行。
我们先模拟没有加 CAP_KILL 能力的情况,如下:
终端 1,用 root 用户启用 top 程序,如下:
su - root
top
终端 2,用 test 用户 kill 之前的 top 进程,如下:
pgrep top
3114
/bin/kill 3114
kill: Operation not permitted
我们发现无法对不属于自己的进程发送信号.
授权后:在终端 2 普通用户 user1 成功结束了终端 1 的 top 进程
下面我们用 CAP_KILL 能力的程序向不属于自己的进程发送信号,如下:
设定 kill 命令的 kill 位,如下:
setcap cap_kill=eip /bin/kill
杀掉 3114 进程,没有问题,如下:
/bin/kill 3114
echo $?
0
注意:普通用户要用/bin/kill 这种绝对路径的方式,而不能用 kill 这种方式.
除了以上的一步步操作,也可以直接运行以下代码:
(2)系统启动时关闭某能力位,对系统的应用和安全性有何影响,以具体能
力位为例说明,比如 cap_sys_module,cap_linux_immutable
早期 linux 上信任状模型非常简单,就是"超级用户对普通用户"模型。普
通用户的很多操作需要 root 权限,这通过 setuid 实现。如果程序编写不好,
就可能被攻击者利用,获得系统的控制权。使用能力机制(capability)减小这
种风险。系统管理员为了系统的安全可以剥夺 root 用户的能力,这样即使root
用户也将无法进行某些操作。而这个过程又是不可逆的,也就是说如果一种
能力被删除,除非重新启动系统,否则即使 root 用户也无法重新添加被删除
的能力。
系统引导时删除部分能力能保护系统。如保护系统工具和日志的完整性。
CAP_SYS_MODULE:插入和删除内核模块:(但是对于在启动时,尚未加