Apparmor——Linux内核中的强制访问控制系统

Apparmor——Linux内核中的强制访问控制系统
最新回答
冰依湄凌

2021-01-13 12:41:08

AppArmor

近期在进行OJ(在线评测系统)后台安全模块的研究时,我深入了解了Linux下的沙箱技术,并发现了AppArmor提供的访问控制功能。

AppArmor是Linux内核的一个安全模块,它允许系统管理员将每个程序与一个安全配置文件关联,以限制程序的功能。简而言之,AppArmor类似于SELinux的访问控制系统,可以指定程序可以访问哪些文件、是否可以打开网络端口等。作为对传统Unix自主访问控制模块的补充,AppArmor提供了强制访问控制机制,并已整合到2.6版本的Linux内核中。

目前,Ubuntu已自带AppArmor,相关资料可在手册中查阅。本文整理自英文资料,可能存在不准确之处,请读者谅解。

一、与程序绑定的访问控制

AppArmor提供的访问控制是与程序绑定的:

AppArmor的独特安全模型是将访问控制属性绑定到程序,而不是绑定到用户。

假设有一个可执行文件的路径为/home/lei/demoexe,如果要用AppArmor对其进行访问控制,则需要新建一个配置文件(后续将介绍如何编写配置文件),文件名为home.lei.demoexe,并将其放置在AppArmor专门放置配置文件的目录下(/etc/apparmor.d)。因此,每个可执行文件都与一个配置文件绑定,如果修改demoexe的文件名,配置文件将失效。

二、两种工作模式

AppArmor有两种工作模式:enforcement、complain/learning

Enforcement – 在这种模式下,配置文件中列出的限制条件都会得到执行,违反限制条件的程序将进行日志记录。

Complain – 在这种模式下,配置文件中的限制条件不会得到执行,AppArmor仅对程序的行为进行记录。例如,程序可以写入配置文件中注明只读的文件,但AppArmor不会对程序的行为进行限制,仅进行记录。

虽然complain模式不能限制程序,但它为何存在呢?因为——如果某个程序的行为不符合其配置文件的限制,可以将其行为记录到系统日志,并根据程序的行为,将日志转换为配置文件。

当然,我们可以随时修改配置文件,选择所需的模式。

三、访问控制与资源限制等

AppArmor可以对程序进行多方面的限制,以下仅介绍自己用到的方面。

(1)文件系统的访问控制

AppArmor可以对某个文件或某个目录下的文件进行访问控制,包括以下访问模式:

可读、可写、可扩展、可链接等(表中未列出可执行x)……

在配置文件中的写法:

如 /tmp r, (表示可对/tmp目录下的文件进行读取)

注意:未在配置文件中列出的文件,程序无法访问,这有点像白名单。

(2)资源限制

Apparmor可以提供类似系统调用setrlimit的方式来限制程序可以使用的资源。要限制资源,可在配置文件中这样写:

set rlimit [resource] <= [value],

其中resource代表某一种资源,value代表某一个值,

要对程序可以使用的虚拟内存做限制时,可以这样写:

set rlimit as<=1M, (可使用的虚拟内存最大为1M)

注意:Apparmor可以对程序要使用的多种资源进行限制(fsize,data,stack,core,rss,as,memlock,msgqueue等),但暂不支持对程序可以使用CPU时间进行限制。(现在OJ一般都对ACMer提交的程序的运行时间有严格的限制,所以要将Apparmor用于OJ后台安全模块,必须自己另外实现对CPU时间的限制。)

(3)访问网络

Apparmor可以限制程序是否可以访问网络,在配置文件中的语法是:

network [ [domain] [type] [protocol] ]

了解网络编程的应该知道domain、type和protocol是什么。

要让程序可以进行所有的网络操作,只需在配置文件中写:

network,

要允许程序使用在IPv4下使用TCP协议,可以这样写:

network inet tcp,

(4)capability条目

Capability statements are simply the word capability followed by the name of the POSIX.1e capability as defined in the capabilities(7) man page.

在linux的手册页里面有一个capablities列表,apparmor可以限制程序是否可以进行列表里的操作,如:

capability setgid,(允许程序进行setgid操作)

四、配置文件的编写

前面提到,编写完配置文件后,需要将其放置在/etc/apparmor.d目录下。实际上,有更方便的方法,直接在命令行中使用:

sudo genprof [filename]

就可以为指定的程序创建一个配置文件,并放置在该目录。

建立的配置文件内容如下:

注意,该文件默认使用enforcement模式,要修改模式,只需将配置文件改为:

红字前面的部分是文件的路径,作用是为这个配置文件绑定某个程序。

接下来,就可以在配置文件中添加相应的内容,在大括号中加上:

然后再执行命令:

sudo /etc/init.d/apparmor reload

就可以重新加载配置文件,使配置文件生效。

注意:如果配置文件中语法有错误,将加载失败。

这篇文章只是我在使用AppArmor过程中的一点小总结,并不完善。例如,配置文件还有很多细节未提及,还有一些工具可以方便地管理配置文件也未提及。大家要研究AppArmor,还是要查阅其他更详细的资料。