Linux 中的安全模块LSM是一种轻量级的访问控制框架。用户在执行系统调用时,先通过内核接口依次执行功能性的错误检查,接着进行传统的DAC检查,在访问内核之前通过LSM钩子函数调用LSM,LSM根据具体的访问控制策略来决定方法的合法性,以此来实现访问控制。访问控制的架构图(不传了,其它地方也有):
几个相关概念简介(也是来自copy):
Linux文件系统中对文件的操作属于DAC,DAC的主要内容包括以下几个概念: 主体、客体、权限(rwx)、所有权(ugo),由客体的属主对自己的客体进行管理,由主体决定是否将自己客体的访问权限授权给其他主体,这种控制方式是自主的。下面的例子看到bigxu用户对xgx管理的客体没有写权限,当bigxu主体对test.c文件进行写操作的时候会被拒绝,xgx用户可以决定test.c能否被bigxu用户写操作这就是DAC.在DAC系统中,文件的所有者是创建这个文件的计算机的使用者,此文件的自主访问控制权限由它的创建者来决定如何设置和分配;
bigxu@bigxu-UC7300-series:/home/xgx/smack/smack_test$ ls -lth test.c
-rw-r--r-- 1 xgx xgx 356 Jul 16 20:13 test.c
bigxu@bigxu-UC7300-series:/home/xgx/smack/smack_test$ whoami
bigxu
bigxu@bigxu-UC7300-series:/home/xgx/smack/smack_test$ echo "a" >> test.c
-bash: test.c: Permission denied
bigxu@bigxu-UC7300-series:/home/xgx/smack/smack_test$ 1234567
LSM框架下的访问策略包括selinux,smack,tomoyo,yama 用户还可以注册自己的钩子函数。每个策略都是通过各自的init函数调用register_security函数来注册,注册到LSM框架的模块被加载成功后,就可以进行访问控制。LSM里面给出了结构体security_operations,里面给出了很多钩子函数,实现了相关钩子函数就可以实现访问控制。
2 SMACK简介及内核配置方法
LSM框架下的访问策略包括selinux,smack,tomoyo,yama 用户还可以注册自己的钩子函数。每个策略都是通过各自的init函数调用register_security函数来注册,注册到LSM框架的模块被加载成功后,就可以进行访问控制。LSM里面给出了结构体security_operations,里面给出了很多钩子函数,实现了相关钩子函数就可以实现访问控制了。(LSM是软件策略,目前看来与硬件加解密模块无关)。目前信息看smack策略开销小,规则比较全面,策略简单直接,最适合嵌入式系统。
2.1内核配置
Smack需要使能网络配置,
CONFIG_NETLABEL=y (网络功能)
CONFIG_INET=y (tcp ip 那个)
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_SMACK=y
2.2 Smack 文件系统挂载
查看/proc/filesystems
如果看到smackfs,说明smack已经编进内核
执行如下的命令:
mkdir -p /smack
在文件/etc/fstab添加下面的一行
smackfs /smack smackfs defaults 0 0
然后执行下面的命令:
mount –a
可以完成smackfs 文件系统的挂载。
3 Smackload工具
Smack依赖扩展文件属性来管理,虽然attr setattr getattr等扩展文件的操作命令可以也可以配置安全标签属性,最好还是使用smackload工具操作比较方便和安全。可以保证属性和命令的正确性
源码下载地址https://github.com/smack-team/smack。
./configure -host aarch64-linux-gnu
make
编译生成的chsmack mackcipso smackload smackaccess smackctl 执行程序拷贝到自己系统。将库函数libsmack.so.1.0.2拷贝到自己系统/lib中。
3.2 命令简单说明
Smackload 这给命令可以帮助正确的加载规则到/smack/cipso
chsmack 这个命令显示smack相关的标签属性。
smackcipso 可以将cipso配置内容加入到/smack/cipso
cipso是互联网安全相关的。smackcipso配置规则后,进行网络操作后,使用tcpdump可以看到在ip选项域增加了cipso标签信息。
主要说明一下smackload和chsmack的文件访问控制功能。
4 Smack规则简介
1. 主体(Subject)
Smack主体是指Linux内核进程。
2. 客体(Object)
Smack客体是指Linux内核客体对象,如文件、消息队列、套接字、共享内存、信号量等,客体也可以是Linux进程或者IPC。
3. 安全标签(Label)
Smack安全标签是C语言的字符串,但最多包含24个字符(包括‘/0’),Smack修改了进程task_struct安全域,在进程被初始创建时,其安全标签是“_”。同样,Smack修改了虚拟文件系统的inode和super_block安全域,使得文件系统被创建时所有文件的安全标签是“_”。长度为1个字符的标签是smack系统保留或待扩展的,我们自己打标签要大于一个字符。
4. 访问方式(Access)
Smack最初版本的访问方式只有四种,即读(r或R)、写(w或W)、执行(x或X)、盲写(a或A)。其中,在进程之间通信中,一个进程发送消息或者数据包给另一个进程时,这样的操作属于写操作。
5. 安全策略(smack rule)
Smack的安全策略分为Smack内置的安全策略和用户可定制的安全策略。Smack内置的安全策略是指原本就已经被Smack访问控制代码所规定的,包括如下几条:
(1)安全标签是“*”的进程发起的任何形式的访问都被拒绝;
(2)安全标签是“^”的进程发起的读或执行的请求都被容许;
(3)任何进程对安全标签是“_”的客体发起的读或执行的请求都被容许;
(4)任何进程对安全标签是“*”的客体发起的任何形式的请求都被容许;
(5)如果主体和客体的安全标签相同,那么该主体对该客体发起的任何形式的访问都被容许。
除此之外,用户可以根据自己的安全需求,在主、客体安全标签都已经存在的前提下,通过“smackload”工具写入安全策略,例如:
(1) abc xyz rwxarW
(2) abc xyz rwr
(3) abc xyz _
smackload工具会自动配置访问方式的格式,(1)表示主体abc对客体xyz有读、写、执行、盲写的权限,(2)表示主体abc对客体xyz有读、写权限,(3)表示主体abc对客体xyz没有任何权限。当用户连续写入以上三条规则后,Smack会将相同主、客体的规则进行覆盖,最终,abc对xyz没有任何权限。
需要指出的是,Smack策略可以被特权进程绕过,正因为此,Smack不能阻止超级用户或特权进程的一切行为。
5 Smack规则测试
Smack功能会对root用户无效,所以需要建立一个新用户。
执行命令 adduser test添加用户test
我们在tmp目录下完成相应测试。记得挂载tmpfs在tmp目录上,这样空间足够
可以在fstab中加入“tmpfs on /tmp type tmpfs (rw,relatime)”
chsmack 好像无法对 /bin/目录下的各个执行程序添加主体标签。提前把cat命令拷贝到tmp目录。我测试的tmp目录信息如下
/tmp # ls
1.txt cat chsmack smackload
利用root用户创建一个1.txt,
/tmp # echo "123" > 1.txt
/tmp #./ cat 1.txt
123
这个时候切到test用户,对1.txt的访问没有任何问题
/tmp # su test
/tmp $./ cat 1.txt
123
利用exit命令切回root用户。开始为1.txt 打标签
先看一下属性。可以看到cat 和 1.txt 默认情况下被访问时(作为客体)都是 "_" 标签
/tmp # ./chsmack 1.txt
1.txt access="_"
/tmp # ./chsmack cat
cat access="_"
修改1.txt的客体标签
/tmp # ./chsmack 1.txt -a abc
/tmp # ./chsmack 1.txt
1.txt access="abc"
这样,1.txt的客体标签就变成了“abc”
切换到test用户,发现已经无法cat这个文件了,提示cat权限被禁止
/tmp # su test
/tmp $ ./cat 1.txt
cat: can't open '1.txt': Permission denied
切换回root用户,给cat 打上执行时(主体)标签为abc,这个时候test用户的cat又可以访问1.txt文件了。(主题与客体标签都是abc,符合标签一致的条件)
/tmp $ exit
/tmp # ./chsmack cat -e abc
/tmp # ./chsmack cat
cat access="_" execute="abc"
/tmp # su test
/tmp $ ./cat 1.txt
123
/tmp $ /tmp # su test
123
切回root用户,修改cat的主体标签为aaa,这个时候,test用户的cat无法访问1.txt(主体aaa 无法访问客体abc)
/tmp # ./chsmack cat -e aaa
/tmp # ./chsmack cat
cat access="_" execute="aaa"
/tmp # su test
/tmp $ ./cat 1.txt
cat: can't open '1.txt': Permission denied
/tmp $
下面配置规则,让aaa主体可以访问abc客体,可以在/smack/load看当前规则情况。
/tmp # echo "aaa abc rwxat" | ./smackload
/tmp # cat /smack/load
aaa abc rwxat
/tmp # su test
/tmp $ whoami
test
/tmp $ ./cat 1.txt
123
可以看到,aaa 访问 abc的规则生效