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 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]
就可以為指定的程序創建一個配置文件,並把它放到該目錄。
建立的配置文件內容如下:
# 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