Apparmor——Linux内核中的强制访问控制系统
AppArmor
因为最近在研究OJ(oline judge)后台的安全模块的实现,所以一直在研究Linux下沙箱的东西,同时发现了Apparmor可以提供访问控制。
AppArmor(Application Armor)是Linux内核的一个安全模块,AppArmor允许系统管理员将每个程序与一个安全配置文件关联,从而限制程序的功能。简单的说,AppArmor是与SELinux类似的一个访问控制系统,通过它你可以指定程序可以读、写或运行哪些文件,是否可以打开网络端口等。作为对传统Unix的自主访问控制模块的补充,AppArmor提供了强制访问控制机制,它已经被整合到2.6版本的Linux内核中。
目前Ubuntu已自带了Apparmor, 可以在手册中获得相应的资料。文章是从很多英文资料中整理总结出来的,可能会有不准确的地方,请各位见谅。
一、与程序绑定的访问控制
Apparmor提供的访问控制是与程序绑定的:
AppArmor's unique security model is to bind access control attributes to programs rather than to users.
假设有一个可执行文件的路径为/home/lei/demoexe,如果要用Apparmor对其进行访问控制的话,就要新建一个配置文件(后面我再讲怎么写这个配置文件),文件名为home.lei.demoexe,并把这个配置文件放到Apparmor专门放置配置文件的目录下(/etc/apparmor.d)。所以每一个可执行文件都是与一个配置文件绑定的,因此如果修改demoexe的文件名的话,配置文件将失效。
二、两种工作模式
Apparmor有两种工作模式:enforcement、complain/learning
Enforcement – 在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。
Complain – 在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。例如程序可以写一个在配置文件里注明只读的文件,但Apparmor不会对程序的行为进行限制,只是进行记录。
那既然complain不能限制程序,为什么还需要这种模式呢,因为——如果某个程序的行为不符合其配置文件的限制,可以将其行为记录到系统日志,并且可以根据程序的行为,将日志转换成配置文件。
当然我们可以随时对配置文件进行修改,选择自己需要的模式。
三、访问控制与资源限制等
Apparmor可以对程序进行多方面的限制,这里我只介绍自己用到的。
(1)文件系统的访问控制
Apparmor可以对某一个文件,或者某一个目录下的文件进行访问控制,包括以下几种访问模式:
|
r |
Read mode |
|
w |
Write mode (mutually exclusive to a) |
|
a |
Append mode (mutually exclusive to w) |
|
k |
File locking mode |
|
l |
Link mode |
|
linkfile->target |
Link pair rule (cannot be combined with other access modes) |
可读、可写、可扩展、可链接等(还有可执行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 wordcapabilityfollowed by the name of the POSIX.1e capability as defined in thecapabilities(7)man page.
在linux的手册页里面有一个capablities列表,apparmor可以限制程序是否可以进行列表里的操作,如:
capability setgid,(允许程序进行setgid操作)
四、配置文件的编写
前面提到,编写完配置文件后,要把文件放到/etc/apparmor.d这个目录下,其实有更方便的方法,直接在命令行里面用:
sudo genprof [filename]
就可以为指定的程序创建一个配置文件,并把它放到该目录。

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

# Last Modified: Fri Feb 1 20:06:09 2013
#include <tunables/global> /home/lei/apparmor-helper/demoexe {
#include <abstractions/base> }

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

# Last Modified: Fri Feb 1 20:06:09 2013
#include <tunables/global> /home/lei/apparmor-helper/demoexe flags=(complain){
#include <abstractions/base> }

红字前面的部分是文件的路径,作用是为这个配置文件绑定某个程序。
好,那接下来就可以在配置文件中添加相应的内容,在大括号中加上:
/home/lei/apparmor-helper/data rw,
set rlimit stack<=1M,
然后再执行命令:
sudo /etc/init.d/apparmor reload
就可以重新加载配置文件,使配置文件生效。

注意如果配置文件中语法有错误的话会加载失败。
这篇文章只是我在使用apparmor过程中的一点小总结,并不完善,例如配置文件还有很多细节我没提到,有一些工具可以比较方便地管理配置文件我也没提到,大家要研究apparmor的话还是要查阅其他更详细的资料。
转载请注明原作者及文章原地址
本文作者:Lei
地址:http://www.cnblogs.com/-Lei/archive/2013/02/24/2923947.html
Apparmor——Linux内核中的强制访问控制系统的更多相关文章
- SELinux 与强制访问控制系统
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- 剖析linux内核中的宏---------container_of
#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr = (ptr); ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- Linux 内核中的 Device Mapper 机制
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...
- Linux内核中双向链表的经典实现
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- (十)Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
随机推荐
- jquery 学习
地址:http://www.w3school.com.cn/jquery/jquery_dom_add.asp
- LocalStorage在Chrome里的实现
前段时间我们在实现CanTK-Runtime时,也曾在V8基础上模拟过浏览器的LocaleStorage功能,其实现非常简单:每个domain的数据使用的单独文件存储,因为同一时间只有一个游戏运行,所 ...
- ajax 动态获取json的例子
1.前台脚本: //用于切换图片列表的ajax function changePhoto(title,hotelId){ $.ajax({ contentType: "application ...
- Nginx内置常用变量
nginx用到的全局变量 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123&a ...
- mysql 各种运算对于null值的处理
1.A,B,C作为列名时,任意一项为null 则A+B+C为null; 2.count对于null值处理; count(*)包含null项:count(具体列名)忽略null项;count(null) ...
- Qt之Meta-Object系统
简述 Qt的元对象系统(Meta-Object System)提供了信号与槽机制,可用于对象间通信.运行时类别信息和动态属性系统. 元对象系统基于三个方面: QObject类:为objects提供了一 ...
- webform工程中aspx页面为何不能调用appcode文件夹下的类(ASP.NET特殊文件夹的用法)
App_code 只有website类型的工程才有效. App_Code 下创建的.cs文件仅仅是“内容”不是代码.你设置那个文件为“编译”就行了. 其他特殊文件夹 1. Bin文件夹 Bin文件夹包 ...
- VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
问题:VMware 5.0 客户端提示VMRC控制台的连接已断开...正在尝试重新连接,系统是win8的 网上解决办法: WIN8,在安装vmware vsphere client 5.0时出现兼容性 ...
- JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51 来源: 作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...
- DOM中元素节点、属性节点、文本节点的理解
DOM中元素节点.属性节点.文本节点的理解 节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是:nodeName(节点名称) nodeValue(节点值) nodeType(节点类型) ...