当前位置: 首页 > 工具软件 > SMACK > 使用案例 >

Linux LSM Smack功能简介

百里业
2023-12-01
  1. LSM简介

Linux 中的安全模块LSM是一种轻量级的访问控制框架。用户在执行系统调用时,先通过内核接口依次执行功能性的错误检查,接着进行传统的DAC检查,在访问内核之前通过LSM钩子函数调用LSM,LSM根据具体的访问控制策略来决定方法的合法性,以此来实现访问控制。访问控制的架构图(不传了,其它地方也有):

几个相关概念简介(也是来自copy):

  1. DAC (Discretionary Access Control) 自主访问控制

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

 

  1. 2LSM钩子 

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

 

3.1配置与编译

./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的规则生效

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 类似资料: