Android安全策略Selinux小結(jié)

在 Android 4.3版本之前趾娃,Android通過DAC(Discretionary Access Control)自主訪問控制來進行權(quán)限管理。

DAC 的核心思想很簡單琼腔,通俗的來講就是“誰創(chuàng)造了我薪韩,我就擁有誰的權(quán)利”炕桨。比如, root 用戶啟動 Camera利虫,那么 Camera 就有 root 用戶的權(quán)限挨厚,在 Linux 系統(tǒng)上能干任何事情堡僻。

很顯然,DAC 管理太過寬松疫剃,只要想辦法在 Android 系統(tǒng)上獲取到 root 權(quán)限就可以了钉疫。所以在Android5.0版本之前,android系統(tǒng)很容易被破壞巢价,設(shè)備廠商也經(jīng)常在保修單中明確說明“Root不保修”的政策牲阁。

那么該如何解決這個問題呢? Google在android4.3版本上便引入了SElinux壤躲,只不過是默認關(guān)閉的狀態(tài)城菊,在Android5.0上默認強制打開。

SElinux是一種新的安全模型碉克,這中模型叫 MAC(Mandatory Access Control)凌唬,翻譯為強制訪問控制。在Linux系統(tǒng)中漏麦,相信大家都聽過一句話叫作“一切皆文件”客税,但是文件可分為兩種“活的”和“死的”,“活的”是進程撕贞,映射到軟件層面的意思是:活的進程能發(fā)起動作霎挟,例如它能打開文件并操作它,而死的文件只能被進程操作麻掸。

SELinux的政策規(guī)定進程如果想干事情,都必須在《安全策略文件》中賦予權(quán)限赐纱,凡是沒有出現(xiàn)在安全策略文件中的權(quán)限都會被拒絕脊奋。

在 SELinux 中,每種東西都會被賦予一個安全屬性疙描,官方說法叫做 Security Context诚隙,Security Context 是一個字符串,同時也分為進程和文件兩種

進程的Security Context:

例如通過 ps -Z | grep sharplogcat 命令查看sharplogcat進程:

lcd_xxgae7a:/ # ps -AZ | grep sharplogcat

u:r:sharplogcat:s0 system 2640 1 9188 3092 __skb_wait_for_more_packets 0 S sharplogcat

其中

- u 為user的意思起胰,SEAndroid 中定義了一個 SELinux 用戶久又,值為 u

- r 為 role 的意思,role 是角色之意效五,它是 SELinux 中一個比較高層次地消,更方便的權(quán)限管理思路。簡單點說畏妖,一個 u 可以屬于多個 role脉执,不同的 role 具有不同的權(quán)限。

- sharplogcat代表該進程所屬的 Domain(域) 為 init 戒劫。MAC強制訪問控制 的基礎(chǔ)管理思路其實是 Type Enforcement Access Control(簡稱TEAC半夷,一般用TE表示)婆廊,對進程來說,Type 就是 Domain巫橄,比如 sharplogcat需要什么權(quán)限淘邻,都需要通過 allow 語句在 te 文件中進行說明。

- s0 是 SELinux 為了滿足軍用和教育行業(yè)而設(shè)計的 Multi-Level Security(MLS)機制有關(guān)湘换。簡單點說宾舅,MLS 將系統(tǒng)的進程和文件進行了分級,不同級別的資源需要對應(yīng)級別的進程才能訪問

文件的Security Context:

例如通過 ls -AZ vendor/bin/sharplogcat 命令查看sharplogcat文件:

lcd_xxgae7a:/ # ls -AZ vendor/bin/sharplogcat

u:object_r:sharplogcat_exec:s0 vendor/bin/sharplogcat

其中

u:同樣是 user 之意枚尼,它代表創(chuàng)建這個文件的 SELinux user

object_r:文件是死的東西贴浙,它沒法扮演角色,所以在 SELinux 中署恍,死的東西都用 object_r 來表示它的 role

sharplogcat_exec崎溃,和進程的 Domain 是一個意思,它表示 sharplogcat 文件所屬的 Type 是 sharplogcat_exec

s0:MLS 的等級

SELinux 規(guī)范

allow domains types:classes permissions;

- Domain - 一個進程或一組進程的標簽盯质。也稱為域類型袁串,因為它只是指進程的類型。

- Type - 一個對象(例如呼巷,文件囱修、套接字)或一組對象的標簽。

- Class - 要訪問的對象(例如王悍,文件破镰、套接字)的類型。

- Permission - 要執(zhí)行的操作(例如压储,讀取鲜漩、寫入)。

= allow : 允許主體對客體進行操作

= neverallow :拒絕主體對客體進行操作

= dontaudit : 表示不記錄某條違反規(guī)則的決策信息

= auditallow :記錄某項決策信息集惋,通常 SElinux 只記錄失敗的信息孕似,應(yīng)用這條規(guī)則后會記錄成功的決策信息。

實例介紹

以上面介紹的sharplogcat為例:在系統(tǒng)rc文件創(chuàng)建sharplogcat進程(該進程類似于原生的logcat刮刑,用于記錄android log)喉祭,默認不自啟動,通過程序控制啟動

service sharplogcat /vendor/bin/sharplogcat -n 1 -r ${persist.sys.logbuffer} -v time -f ${sys.android.log}

user system

group system

disabled

oneshot

system/sepolicy/目錄下是Android系統(tǒng)默認的策略文件雷绢,這些文件在編譯后會包含 SELinux 內(nèi)核安全政策泛烙,并涵蓋上游 Android 操作系統(tǒng)。但我們在配置添加SELinux策略文件時并不是在該目錄下习寸,而是在/device/manufacturer/device-name/sepolicy 目錄中胶惰,如HISI平臺的為device/hisilicon/bigfish/external/sepolicy目錄下。

1. 配置新的sharplogcat.te政策文件霞溪,在編譯到單個 SELinux 內(nèi)核政策文件時孵滞,新的政策文件會與現(xiàn)有的政策文件組合在一起中捆,te文件中按照sharplogcat所需要的權(quán)限進行配置(切記不可為了方便,把所有的權(quán)限加進去坊饶,應(yīng)該是需要哪些加哪些):

# Policy for sharplogcat

type sharplogcat, domain;

type sharplogcat_exec, exec_type, file_type, vendor_file_type;

init_daemon_domain(sharplogcat)

allow sharplogcat sharplogcat:capability { dac_override sys_nice };

allow sharplogcat sharp_log_file:dir rw_dir_perms;

allow sharplogcat sharp_log_file:file { create read open write append rename getattr setattr rw_file_perms };

allow sharplogcat logdr_socket:sock_file { write };

allow sharplogcat logd:unix_stream_socket { connectto read };

2. file_contexts泄伪,該文件用于為文件分配標簽,并且可供多種用戶空間組件使用匿级。在創(chuàng)建新政策時蟋滴,請創(chuàng)建或更新該文件,以便為文件分配新標簽:

/(vendor|system/vendor)/bin/sharplogcat u:object_r:sharplogcat_exec:s0

SELinux 相關(guān)設(shè)置

SElinux共有兩種等級可以設(shè)置痘绎,可通過getenforce查看

- 寬容模式(permissive) - 僅記錄但不強制執(zhí)行 SELinux 安全政策津函。

- 強制模式(enforcing) - 強制執(zhí)行并記錄安全政策。如果失敗孤页,則顯示為 EPERM 錯誤尔苦。

1.臨時關(guān)閉

setenforce 命令修改的是 /sys/fs/selinux/enforce 節(jié)點的值,是 kernel 意義上的修改 selinux 的策略行施,缺點是斷電之后允坚,節(jié)點值會復(fù)位。

setenforce 0

2.永久關(guān)閉

第一種方法:修改system/core/init/Android.mk

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))

#HISILICON add begin

#reboot. Disable dumping when rebooting in non-user mode.

init_options +=

-DALLOW_LOCAL_PROP_OVERRIDE=1

-DALLOW_PERMISSIVE_SELINUX=1? //1:permissive

-DREBOOT_BOOTLOADER_ON_PANIC=1

-DDUMP_ON_UMOUNT_FAILURE=0

#HISILICON add end

else

init_options +=

-DALLOW_LOCAL_PROP_OVERRIDE=0

-DALLOW_PERMISSIVE_SELINUX=1? //1:permissive

-DREBOOT_BOOTLOADER_ON_PANIC=0

-DDUMP_ON_UMOUNT_FAILURE=0

endif

第二種方法:修改system/core/init/init.cpp蛾号,需要重新編譯boot分區(qū)并燒錄該分區(qū)稠项。

static bool selinux_is_enforcing(void) //直接注釋掉內(nèi)容,reture false即可鲜结。

{

if (ALLOW_PERMISSIVE_SELINUX) {

return selinux_status_from_cmdline() == SELINUX_ENFORCING;

}

return true;

}

第三種方法:開機時修改bootargs展运。開機時不斷Ctrl+c進入fastboot模式,printenv獲取當前參數(shù)配置精刷,修改其中androidboot.selinux=permissive乐疆,再setenv->saveenv->reset即可。

bootargs=selinux=1 androidboot.selinux=permissive firmware_class.path=/vendor/firmware/ console=ttyAMA0,115200 loglevel=7 no_console_suspend blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),40M(recovery),8M(panelparam),2M(deviceinfo),38M(logo),2M(btfw),40M(kernel),1M(dtb),2M(atf),25M(trustedcore),10M(securestore),1M(versioninfo),1M(misc),3072M(system),300M(vendor),50M(atv),50M(db),2048M(cache),-(userdata) mtdparts=hi_sfc:-(hi_sfc) pci=nomsi mem=3072M dma_zone=2G mmz=ddr,0,1996M,48M mdlid=0 cmode=0 finit=0 panelsize=0 androidboot.sharp.serialno= androidboot.productname=--

ver=Fastboot 3.3.0-00015-g327655d-dirty (build@serd-build-008) (Mar 18 2019 - 09:17:15)

在實際的開發(fā)中贬养,配置selinux是非常繁瑣和枯燥的,但是作為官方推廣的安全策略琴庵,還是希望大家能夠了解一些误算,以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助迷殿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儿礼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庆寺,更是在濱河造成了極大的恐慌蚊夫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦尝,死亡現(xiàn)場離奇詭異知纷,居然都是意外死亡壤圃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門琅轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伍绳,“玉大人,你說我怎么就攤上這事乍桂〕迳保” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵睹酌,是天一觀的道長权谁。 經(jīng)常有香客問我,道長憋沿,這世上最難降的妖魔是什么旺芽? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮卤妒,結(jié)果婚禮上甥绿,老公的妹妹穿的比我還像新娘。我一直安慰自己则披,他們只是感情好共缕,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著士复,像睡著了一般图谷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阱洪,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天便贵,我揣著相機與錄音,去河邊找鬼冗荸。 笑死承璃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚌本。 我是一名探鬼主播盔粹,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼开镣,長吁一口氣:“原來是場噩夢啊……” “哼冯勉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莉钙,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嵌莉,失蹤者是張志新(化名)和其女友劉穎进萄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡中鼠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年可婶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兜蠕。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扰肌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熊杨,到底是詐尸還是另有隱情曙旭,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布晶府,位于F島的核電站桂躏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏川陆。R本人自食惡果不足惜剂习,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望较沪。 院中可真熱鬧鳞绕,春花似錦、人聲如沸尸曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽控轿。三九已至冤竹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茬射,已是汗流浹背鹦蠕。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留在抛,地道東北人钟病。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像刚梭,于是被迫代替她去往敵國和親档悠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,694評論 0 3
  • 快速閱讀 框架 SELinux介紹 看Android怎么寫望浩? 如何確認是SELinux 約束引起? 怎么抓取SEL...
    鋤禾豆閱讀 36,608評論 12 17
  • 如果懷疑是sepolicy權(quán)限導(dǎo)致的問題惰说,首先需要確認是否真的是權(quán)限導(dǎo)致的磨德。 確認方法是:關(guān)閉SELinux,查看...
    祝三壯閱讀 10,312評論 0 5
  • 1、第八章 Samba服務(wù)器2典挑、第八章 NFS服務(wù)器3酥宴、第十章 Linux下DNS服務(wù)器配站點,域名解析概念命令:...
    哈熝少主閱讀 3,719評論 0 10
  • 負載均衡是我們大流量網(wǎng)站要做的一個東西您觉,下面我來給大家介紹在Nginx服務(wù)器上進行負載均衡配置方法拙寡。 測試環(huán)境 測...
    owen_he閱讀 303評論 0 0