作者 | 趙青窕
審校 | 孫淑娟
經(jīng)過(guò)數(shù)日的分析,我才明白關(guān)閉權(quán)限僅僅是關(guān)閉安卓權(quán)限中的一部分而并非所有權(quán)限,最終通過(guò)修改文件屬性后,我的服務(wù)才可以正常啟動(dòng)了。經(jīng)歷這件事情后,我立志要把我的經(jīng)驗(yàn)總結(jié)出來(lái)并分享給志同道合的朋友們。
根據(jù)我個(gè)人的工作經(jīng)驗(yàn),我把安卓權(quán)限分為如下三部分:
- 設(shè)置文件的屬性
- 采用allow語(yǔ)句配置某一個(gè)應(yīng)用訪問(wèn)某一個(gè)文件的權(quán)限
- Linux系統(tǒng)原生的用戶,用戶組權(quán)限
第1點(diǎn)和第2點(diǎn)屬于SELinux的范疇,這兩部分是相輔相成的關(guān)系,通過(guò)設(shè)置文件屬性來(lái)配置某一文件是不是可執(zhí)行文件,緊接著我們可以采用allow語(yǔ)句來(lái)配置該可執(zhí)行文件可以訪問(wèn)的文件資源及其對(duì)文件資源的操作權(quán)限;第3點(diǎn)屬于Linux這一類(lèi)系統(tǒng)的共同特性,于前面兩點(diǎn)是完全不同的部分,用戶和用戶組及權(quán)限用來(lái)說(shuō)明某一文件所屬的用戶和用戶組,及其讀寫(xiě)執(zhí)行權(quán)限。接下來(lái),讓我們先認(rèn)識(shí)SELinux,然后再詳細(xì)地看上面三部分。
SELinux相關(guān)命令
- 關(guān)閉SELinux權(quán)限:setenforce 0,即設(shè)置SELinux 成為permissive模式,對(duì)違反Selinux規(guī)則的行為會(huì)進(jìn)行記錄,但不會(huì)阻止。
- 打開(kāi)SELinux權(quán)限:setenforce 1,即設(shè)置SELinux 成為enforcing模式,對(duì)違反Selinux規(guī)則的行為會(huì)進(jìn)行記錄,且會(huì)進(jìn)行阻止。
- 獲取SELinux權(quán)限:getenforce
下圖1是上面三個(gè)命令的執(zhí)行情況,供大家參考。
圖 1 :SELinux命令演示
- 查看SELinux權(quán)限:命令參數(shù)中增加-Z(注意此處是大寫(xiě)字母)選項(xiàng)。
如果是查看文件,則采用圖2中紅色方框內(nèi)的方式。
圖 2:查看文件權(quán)限
如果是查看進(jìn)程的權(quán)限,則可以采用圖2中所說(shuō)的方式。圖2中列出了不查看權(quán)限和查看權(quán)限的方式,方便大家比較。
圖 3:查看進(jìn)程對(duì)應(yīng)的SELinux權(quán)限
下圖4是查看屬性(property)權(quán)限的命令。
圖 4:查看property權(quán)限
配置SELinux權(quán)限
在此,我通過(guò)一個(gè)例子來(lái)說(shuō)明如何配置。假如我們有一個(gè)可執(zhí)行文件,我們用test_bin表示,該可執(zhí)行文件需要訪問(wèn)我們的驅(qū)動(dòng)節(jié)點(diǎn)/dev/test,針對(duì)這種情況,我們需要配置4處。
1.file_contexts中對(duì)文件/dev/test進(jìn)行配置,配置方法如下(先假設(shè)test_dev_node和
test_bin_exec已經(jīng)定義了,后面會(huì)進(jìn)行說(shuō)明):
est_bin_exec已經(jīng)定義了,后面會(huì)進(jìn)行說(shuō)明):
/dev/test u:object_r:test_dev_node:s0
test_bin(此處需要使用test_bin的絕對(duì)路徑) u:object_r:test_bin_exec:s0
該配置語(yǔ)句的意思就是把我們的設(shè)備節(jié)點(diǎn)/dev/test配置為test_dev_node類(lèi)型,可執(zhí)行文
件test_bin配置為test_bin_exec的類(lèi)型,其余部分也有其具體含義,只是對(duì)于使用者來(lái)
說(shuō),暫時(shí)可以忽略。在具體項(xiàng)目配置時(shí),替換上面配置文件中標(biāo)出來(lái)的內(nèi)容即可。
2.配置對(duì)應(yīng)的te文件
type test_dev_node, dev_type;
type test_bin_exec, exec_type, vendor_file_type, file_type;
allow test_bin_exec test_dev_node:chr_file rw_file_prems;
上面三條語(yǔ)句主要完成兩種工作,分別是類(lèi)型定義和allow語(yǔ)句,這兩部分都比較重要,
類(lèi)型定義好后,我們才能對(duì)資源進(jìn)行相應(yīng)類(lèi)型的配置,如上面對(duì)/dev/test和test_bin的配
置,而allow語(yǔ)句就是配置我們常說(shuō)的權(quán)限問(wèn)題,上面的allow語(yǔ)句就是設(shè)置類(lèi)型為
test_bin_exec的可執(zhí)行程序可以訪問(wèn)test_dev_node類(lèi)型的文件。我把這個(gè)過(guò)程總結(jié)為定
義類(lèi)型---配置類(lèi)型----設(shè)置權(quán)限。
除了上面涉及到的內(nèi)容外,安卓系統(tǒng)中還具有property_contexts,service_contexts,
seapp_contexts等類(lèi)型。不管什么類(lèi)型,我們套用三步驟定義類(lèi)型---配置類(lèi)型----設(shè)置權(quán)限即可,并結(jié)合需要處理的文件類(lèi)型,就可以完成權(quán)限配置,如屬性類(lèi)文件,定義類(lèi)型時(shí),其語(yǔ)句格式是type xxx property_type,倘若還是不知道如何定義,可以參考安卓基線代碼中的SELinux定義,因?yàn)榛€中的權(quán)限定義已經(jīng)包含了盡可能全的情況。
當(dāng)遇到neverallow問(wèn)題時(shí),我們就把出現(xiàn)問(wèn)題部分按照上面三步驟定義類(lèi)型---配置類(lèi)型----設(shè)置權(quán)限進(jìn)行重新定義,重新定義后的類(lèi)型名稱(chēng)不在系統(tǒng)的nerverallow范疇內(nèi),再次重新設(shè)置后就可規(guī)避nerverallow問(wèn)題。
至此,我們已經(jīng)簡(jiǎn)單了解了SElinux問(wèn)題,接下來(lái)重新思考一下文章開(kāi)始的時(shí)候說(shuō)的三大部分。
1.設(shè)置文件的屬性
此處就是指上面在file_contexts對(duì)文件/dev/test和test_bin進(jìn)行了屬性配置,當(dāng)我們關(guān)閉SELinux權(quán)限時(shí),并不能關(guān)閉系統(tǒng)對(duì)文件屬性的判斷,比如當(dāng)我們沒(méi)有對(duì)test_bin進(jìn)行配置時(shí),安卓系統(tǒng)會(huì)認(rèn)為test_bin是一個(gè)普通文件。這種情況下,不管SELinux是否關(guān)閉,test_bin都無(wú)法正常運(yùn)行。請(qǐng)記住,關(guān)閉SELinux時(shí),安卓系統(tǒng)仍然會(huì)判斷文件屬性。
2.allow語(yǔ)句
當(dāng)系統(tǒng)中沒(méi)有配置適當(dāng)?shù)腶llow語(yǔ)句,但配置了適當(dāng)?shù)奈募傩院陀脩艚M屬性,讀寫(xiě)權(quán)限時(shí),此時(shí)關(guān)閉SELinux就可以正常工作。若出現(xiàn)這種現(xiàn)象,說(shuō)明就是因?yàn)閍llow語(yǔ)句配置不恰當(dāng),這個(gè)時(shí)候應(yīng)該趕緊抓取對(duì)應(yīng)的日志,從對(duì)應(yīng)的log中過(guò)濾出AVC的日志,如下是一種AVC錯(cuò)誤:
avc: denied { read } for name="vendor" dev="tmpfs" ino=9241 scontext=u:r:dumpstate:s0 tcontext=u:object_r: test_dev_node:s0 tclass=chr_file permissive=0
分析如下:
- 上面日志中的中括號(hào)中表示缺少的權(quán)限,從日志看缺少read全校;
- scontext=u:r:dumpstate:s0用來(lái)表示缺少權(quán)限;
- tcontext=u:object_r: test_dev_node:s0用來(lái)表示訪問(wèn)哪類(lèi)文件時(shí)出現(xiàn)了權(quán)限問(wèn)題;
- tclass=chr_file表示要訪問(wèn)的文件類(lèi)型。
我們把上面四部分按照下面組合即可添加對(duì)應(yīng)的權(quán)限:
allow dumpstate test_dev_node:chr_file r read;
3.用戶,用戶組和讀寫(xiě)權(quán)限
這類(lèi)權(quán)限是Linux這一類(lèi)系統(tǒng)中原生的內(nèi)容,這類(lèi)權(quán)限與SELinux完全不相關(guān)。當(dāng)用戶組配置有問(wèn)題時(shí),即使關(guān)閉SELinux權(quán)限,其問(wèn)題會(huì)依然存在。
那在安卓系統(tǒng)中,我們?nèi)绾蝸?lái)進(jìn)行該類(lèi)權(quán)限的配置呢?其實(shí)在安卓中,有一類(lèi)init.rc文件(文件名可以是init.rc或者init.xxx.rc),rc文件除了可以同來(lái)啟動(dòng)服務(wù)等功能外,還可以在該類(lèi)文件中配置用戶和用戶組讀寫(xiě)權(quán)限,如下面的例子所示:
on init
chmod 0660 /dev/test
chown system system /dev/test
總結(jié)
本文先簡(jiǎn)單介紹了SELinux,然后進(jìn)行三大部分的說(shuō)明。這三部分有任何一部分異常,其對(duì)應(yīng)功能都無(wú)法正常工作。在配置安卓權(quán)限時(shí),需要從這三部分來(lái)考慮,缺一不可,最重要的一點(diǎn)是,關(guān)閉SELinux,僅僅能屏蔽allow語(yǔ)句對(duì)應(yīng)的權(quán)限問(wèn)題。
作者介紹
趙青窕,51CTO社區(qū)編輯,從事多年驅(qū)動(dòng)開(kāi)發(fā)。研究興趣包含安全OS和網(wǎng)絡(luò)安全領(lǐng)域,發(fā)表過(guò)網(wǎng)絡(luò)相關(guān)專(zhuān)利。