DTE Linux、SELinux與SEAndroid之間的對比分析

來源:互聯網
上載者:User

標籤:安全   android   學術   存取控制   security   

2000年,美國威廉瑪麗學院的研究人員Serge等人在USENIX的4th annual Linux Showcase &Conference會議上發表了題為“Domainand Type Enforcement for Linux”的文章。該文章第一次將DTE模型用於Linux,實現了DTE Linux原型系統。

同年,美國國家安全域NSA的Stephen Smalley等人發布了開源的Linux安全架構SELinux,SELinux第一個版本基於Linux 2.5核心,並採用GPL開源協議發布。在2003年8月,SELinux正式整合進Linux官方核心的2.6.0版本。

SELinux作為目前DTE在Linux上實現的業界標準,其理念絕大部分是與DTE Linux一致的,但是由於兩個成果分屬不同的研究團隊,因此其具體機制仍稍有差別。由於目前介紹DTE的資料很多,因此本文從另外一個角度,主要介紹DTE Linux與SELinux的區別。同時,由於本人的研究方向是Android安全,SELinux在Android系統上也進行了實現,名為SEAndroid,因此本文會結合Android系統來闡述一個配置SELinux策略的具體案例。本文檔主要包括以下兩個部分:1)DTE Linux與SELinux的異同;2)SEAndroid策略配置案例。


第1章           DTE Linux與SELinux的異同
1.1           相同之處

DTE Linux和SELinux都實現了DTE模型,主要包括以下三類存取控制:

1)Type Access

2)Domain Access

3)Domain Transition


1.2           不同之處
1)策略檔案存放模式不同

DTE Linux採用了集中式的策略檔案方案,其策略檔案儲存體路徑為/etc/dte.conf;而SELinux採用了分散式的策略檔案方案,其策略檔案儲存體在/etc/selinux/檔案夾下,包括policy.conf檔案。我個人認為SELinux的方案更優,不同的策略檔案更為模組化,方便了不同組織、公司針對自身負責的程式邏輯進行策略編寫,最後通過策略編譯,所有的SELinux策略檔案被編譯成一個完整的策略庫,在核心可以高效運行,不會產生效率損失。


2)與傳統DAC判斷邏輯之間的順序不同


DTE Linux在訪問授權時,先判斷DTE策略,再判斷DAC策略;而SELinux相反,先判斷DAC策略,再判斷DTE策略。我個人認為SELinux的實現更好,這是考慮到DTE策略是以阻止惡意攻擊為目的,只有在攻擊出現時DTE策略才會執行拒絕,正常情況下的一個訪問被DAC策略拒絕的可能性比被DTE策略拒絕的可能性高得多,因此從效能角度考慮,將DAC策略判斷邏輯放在前面是合適的。


3)代碼實現是否依靠LSM


LSM是Linux Secrity Module的簡稱,即Linux安全模組。其是一種輕量級通用存取控制架構,適合於多種存取控制模型在它上面以核心可載入模組的形實現。使用者可以根據自己的需求選擇合適的安全模組載入到核心上實現。LSM架構在2003年12月整合到Linux 2.6官方代碼中。LSM目前支援包括AppArmor,SELinux, Smack and TOMOYO Linux等多種安全架構。(文章發表幾年之後,DTE Linux也在Linux 2.6 LSM進行了實現)

DTE Linux文章是文章作者自己基於Linux 2.3版本實現的原型系統,時間較早,當時還沒有LSM架構,因此所有的函數鉤子、新增加的系統調用都是DTE for Linux原型系統自己完成的。

SELinux架構是在LSM基礎上開發的。背後還有一段插曲:2001年Linux KernelSummit大會上NSA找到Linux創始人Linus希望將SELinux整合進Linux 2.5中,Linus當時拒絕了這一請求,這是由於當時除了SELinux之外還有其他的眾多安全架構,Linux社區無法達成共識採用哪一個架構。因此Linus決定將安全架構做成“一個模組”,於是後來就有了LSM和基於LSM的SELinux。


4)支援的模型不同


相比DTE Linux文章中只涉及DTE模型而言,SELinux在實現DTE模型的同時,還實現了RBAC模型和MLS模型(可選)。


第2章           SEAndroid策略配置案例

SEAndroid全稱Security Enhancements (SE) for Android?,是SELinux在Android作業系統上的一個實現。目前SEAndroid並不受限於SELinux的功能,已經開始研發專用於Android系統的新的安全特性。

最近我在從事Android安全強化方面研究,其中涉及到一個配置SELinux策略的真實的案例。需求是:在保證生產和維護人員充分許可權的情況下,防止普通使用者取得Root許可權。我們這裡主要說下如何保證生產和維護人員的充分許可權,本質上就是實現“root命令調用路徑”。


我們提出的方案是:


提供一個運行在root權限等級的Native級服務,提供命令執行介面供上層應用進行IBinder進程間調用,該Native級服務的調用需要提供安全秘鑰,以保證只有該應用能夠通過服務進行root命令的調用。同時該Native級服務具有一定的魯棒性,當遇到以外關閉時,系統會自動重啟該Native級服務。


本方案的一些功能,如網路存取控制,需要進行iptables規則配置,而iptables配置是需要用到root許可權的。為了保證上層應用能夠使用root許可權,本方案需要設計專供上層應用使用的、足夠安全的root許可權調用路徑。該方法主要依靠Native級服務實現。當上層應用在需要特殊許可權時,會調用Native級服務,Native級服務在驗證安全秘鑰成功後,自行以root許可權調用相關的命令,並嚮應用層返回結果。

目前我們這個方案是在Android5.1上實現的,Android5.1上預設開啟了SELinux功能,並且其原則設定非常嚴格,我們的方案受到很多SELinux策略的拒絕而無法成功執行,因此需要修改SELinux策略,開一個“口子“,允許存取我們的Native級服務調用。


SELinux策略調整方案主要有兩步:
1)添加標籤:


1. 聲明peki服務的type標籤為pekiserver_service


\51droid\android-5.1.0_r3\external\sepolicy\service_contexts

Line: 123添加:

peki                                     u:object_r:pekiserver_service:s0

 

2. 定義type標籤pekiserver_service為service_manager_type的子標籤


\51droid\android-5.1.0_r3\external\sepolicy\service.te

Line: 13添加:

type pekiserver_service,        service_manager_type;

 

3. 聲明pekiserver精靈的type標籤為pekiserver_exec


\51droid\android-5.1.0_r3\external\sepolicy\file_contexts

Line: 166添加:

/system/bin/pekiserver    u:object_r:pekiserver_exec:s0

 

2)配置規則:


4. 添加TE策略檔案pekiserver.te


\51droid\android-5.1.0_r3\external\sepolicy\


添加pekiserver.te檔案

pekiserver.te檔案內容如下:


# pekiserver - Peki servicetype pekiserver, domain;type pekiserver_exec, exec_type, file_type;init_daemon_domain(pekiserver)typeattribute pekiserver mlstrustedsubject;net_domain(pekiserver)# Perform Binder IPC to system server.binder_use(pekiserver)binder_call(pekiserver, system_server)binder_call(pekiserver, appdomain)binder_service(pekiserver)# Add serviceallow pekiserver pekiserver_service:service_manager add;# Execute commandsallow pekiserver shell_exec:file { execute execute_no_trans read open};allow pekiserver system_file:file { execute_no_trans };# popen() failed to execute "iptables -L"allow pekiserver self:rawip_socket { create getopt setopt };allow pekiserver self:capability { net_raw net_admin};# Read iptables configuration file: /data/pekisafe/ctx_current/iptables_cfg.txtallow pekiserver system_data_file:file { open read };


經過SELinux策略調整後,Native級服務調用成功執行,如所示,可以在應用中正常顯示出iptables防火牆規則。 


DTE Linux、SELinux與SEAndroid之間的對比分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.