Apparmor——Linux內核中的強制訪問控制系統


AppArmor

因為最近在研究OJoline 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有兩種工作模式:enforcementcomplain/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] ]

了解網絡編程的應該知道domaintypeprotocol是什么。

要讓程序可以進行所有的網絡操作,只需在配置文件中寫:

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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM