使用capability加強(qiáng)container的安全

      網(wǎng)友投稿 1189 2022-05-29

      1.簡介

      UNIX是一種安全操作系統(tǒng),它給普通用戶盡可能低的權(quán)限,而把全部的系統(tǒng)權(quán)限賦予一個(gè)單一的帳戶--root。root帳戶用來管理系統(tǒng)、安裝軟件、管理帳戶、運(yùn)行某些服務(wù)、安裝/卸載文件系統(tǒng)、管理用戶、安裝軟件等。另外,普通用戶的很多操作也需要root權(quán)限,這通過setuid實(shí)現(xiàn)。

      這種依賴單一帳戶執(zhí)行特權(quán)操作的方式加大了系統(tǒng)的面臨風(fēng)險(xiǎn),而需要root權(quán)限的程序可能只是為了一個(gè)單一的操作,例如:綁定到特權(quán)端口、打開一個(gè)只有root權(quán)限可以訪問的文件。某些程序可能有安全漏洞,而如果程序不是以root的權(quán)限運(yùn)行,其存在的漏洞就不可能對(duì)系統(tǒng)造成什么威脅。

      從2.1版開始,內(nèi)核開發(fā)人員在Linux內(nèi)核中加入了能力(capability)的概念。其目標(biāo)是消除需要執(zhí)行某些操作的程序?qū)oot帳戶的依賴。從2.2版本的內(nèi)核開始,這些代基本可以使用了,雖然還存在一些問題,但是方向是正確的。

      2.Linux內(nèi)核能力詳解

      傳統(tǒng)UNIX的信任狀模型非常簡單,就是“超級(jí)用戶對(duì)普通用戶”模型。在這種模型中,一個(gè)進(jìn)程要么什么都能做,要么幾乎什么也不能做,這取決于進(jìn)程的UID。如果一個(gè)進(jìn)程需要執(zhí)行綁定到私有端口、加載/卸載內(nèi)核模塊以及管理文件系統(tǒng)等操作時(shí),就需要完全的root權(quán)限。很顯然這樣做對(duì)系統(tǒng)安全存在很大的威脅。UNIX系統(tǒng)中的SUID問題就是由這種信任狀模型造成的。例如,一個(gè)普通用戶需要使用ping命令。這是一個(gè)SUID命令,會(huì)以root的權(quán)限運(yùn)行。而實(shí)際上這個(gè)程序只是需要RAW套接字建立必要ICMP數(shù)據(jù)包,除此之外的其它root權(quán)限對(duì)這個(gè)程序都是沒有必要的。如果程序編寫不好,就可能被攻擊者利用,獲得系統(tǒng)的控制權(quán)。

      使用能力(capability)可以減小這種風(fēng)險(xiǎn)。系統(tǒng)管理員為了系統(tǒng)的安全可以剝奪root用戶的能力,這樣即使root用戶也將無法進(jìn)行某些操作。而這個(gè)過程又是不可逆的,也就是說如果一種能力被刪除,除非重新啟動(dòng)系統(tǒng),否則即使root用戶也無法重新添加被刪除的能力。

      2.1.能力的概念

      Linux內(nèi)核中使用的能力(capability)概念非常容易被混淆。計(jì)算機(jī)科學(xué)中定義了很多種能力(capability)。能力就是一個(gè)進(jìn)程能夠?qū)δ硞€(gè)對(duì)象進(jìn)行的操作,它標(biāo)志對(duì)象以及允許在這個(gè)對(duì)象上進(jìn)行的操作。文件描述符就是一種能力,你使用open系統(tǒng)調(diào)用請(qǐng)求獲得讀或者寫的權(quán)限,如果open系統(tǒng)調(diào)用成功,系統(tǒng)的內(nèi)核就會(huì)建立一個(gè)文件描述符。然后,如果收到讀或者寫的請(qǐng)求,內(nèi)核就使用這個(gè)文件描述符作為一個(gè)數(shù)據(jù)結(jié)構(gòu)的索引,檢索相關(guān)的操作是否允許。這是一種檢查權(quán)限的有效方式,在執(zhí)行open系統(tǒng)調(diào)用是,內(nèi)核一次性建立必要的數(shù)據(jù)結(jié)構(gòu),然后的讀寫等操作檢查只需要在數(shù)據(jù)結(jié)構(gòu)中梭梭即可。對(duì)能力的操作包括:復(fù)制能力、進(jìn)程間的遷移能力、修改一個(gè)能力以及撤消一個(gè)能力等。修改一個(gè)能力類似與把一個(gè)可以讀寫的文件描述符改為只讀。目前,各種系統(tǒng)對(duì)能力的應(yīng)用程度并不相同。

      POSIX 1003.1e中也提出了一種能力定義,通常稱為POSIX能力(POSIX capabilities),Linux中的定義不大一樣。內(nèi)核使用這些能力分割root的權(quán)限,因?yàn)閭鹘y(tǒng)*NIX系統(tǒng)中root的權(quán)限過于強(qiáng)大了。

      2.2.Linux是如何使用POSIX capabilities代替?zhèn)鹘y(tǒng)的信任狀模型的

      每個(gè)進(jìn)程有三個(gè)和能力有關(guān)的位圖:inheritable(I)、permitted(P)和effective(E),對(duì)應(yīng)進(jìn)程描述符task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted。每種能力由一位表示,1表示具有某種能力,0表示沒有。當(dāng)一個(gè)進(jìn)程要進(jìn)行某個(gè)特權(quán)操作時(shí),操作系統(tǒng)會(huì)檢查cap_effective的對(duì)應(yīng)位是否有效,而不再是檢查進(jìn)程的有效UID是否為0。例如,如果一個(gè)進(jìn)程要設(shè)置系統(tǒng)的時(shí)鐘,Linux的內(nèi)核就會(huì)檢查cap_effective的CAP_SYS_TIME位(第25位)是否有效,

      cap_permitted表示進(jìn)程能夠使用的能力。在cap_permitted中可以包含cap_effective中沒有的能力,這些能力是被進(jìn)程自己臨時(shí)放棄的,也可以說cap_effective是cap_permitted的一個(gè)子集。進(jìn)程放棄沒有必要的能力對(duì)于提高安全性大有助益。例如,ping只需要CAP_NET_RAW,如果它放棄除這個(gè)能力之外的其它能力,即使存在安全缺陷,也不會(huì)對(duì)系統(tǒng)造成太大的損害。cap_inheritable表示能夠被當(dāng)前進(jìn)程執(zhí)行的程序繼承的能力。

      3.Linux支持的能力

      Linux實(shí)現(xiàn)了7個(gè)POSIX 1003.1e規(guī)定的能力,還有21個(gè)(截止到2.4.7-10版本的內(nèi)核)Linux所特有的,這些能力在/usr/src/linux/include/linux/capability.h文件中定義。其細(xì)節(jié)如下:

      能力名 數(shù)字 描述

      CAP_CHOWN 0 允許改變文件的所有權(quán)

      CAP_DAC_OVERRIDE 1 忽略對(duì)文件的所有DAC訪問限制

      CAP_DAC_READ_SEARCH 2 忽略所有對(duì)讀、搜索操作的限制

      CAP_FOWNER 3 如果文件屬于進(jìn)程的UID,就取消對(duì)文件的限制

      CAP_FSETID 4 允許設(shè)置setuid位

      CAP_KILL 5 允許對(duì)不屬于自己的進(jìn)程發(fā)送信號(hào)

      CAP_SETGID 6 允許改變組ID

      CAP_SETUID 7 允許改變用戶ID

      CAP_SETPCAP 8 允許向其它進(jìn)程轉(zhuǎn)移能力以及刪除其它進(jìn)程的任意能力

      CAP_LINUX_IMMUTABLE 9 允許修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)屬性

      CAP_NET_BIND_SERVICE 10 允許綁定到小于1024的端口

      CAP_NET_BROADCAST 11 允許網(wǎng)絡(luò)廣播和多播訪問

      CAP_NET_ADMIN 12 允許執(zhí)行網(wǎng)絡(luò)管理任務(wù):接口、防火墻和路由等,詳情請(qǐng)參考/usr/src/linux/include/linux/capability.h文件

      CAP_NET_RAW 13 允許使用原始(raw)套接字

      CAP_IPC_LOCK 14 允許鎖定共享內(nèi)存片段

      CAP_IPC_OWNER 15 忽略IPC所有權(quán)檢查

      CAP_SYS_MODULE 16 插入和刪除內(nèi)核模塊

      CAP_SYS_RAWIO 17 允許對(duì)ioperm/iopl的訪問

      CAP_SYS_CHROOT 18 允許使用chroot()系統(tǒng)調(diào)用

      CAP_SYS_PTRACE 19 允許跟蹤任何進(jìn)程

      CAP_SYS_PACCT 20 允許配置進(jìn)程記帳(process accounting)

      CAP_SYS_ADMIN 21 允許執(zhí)行系統(tǒng)管理任務(wù):加載/卸載文件系統(tǒng)、設(shè)置磁盤配額、開/關(guān)交換設(shè)備和文件等。詳情請(qǐng)參考/usr/src/linux/include/linux/capability.h文件。

      CAP_SYS_BOOT 22 允許重新啟動(dòng)系統(tǒng)

      CAP_SYS_NICE 23 允許提升優(yōu)先級(jí),設(shè)置其它進(jìn)程的優(yōu)先級(jí)

      CAP_SYS_RESOURCE 24 忽略資源限制

      CAP_SYS_TIME 25 允許改變系統(tǒng)時(shí)鐘

      CAP_SYS_TTY_CONFIG 26 允許配置TTY設(shè)備

      CAP_MKNOD 27 允許使用mknod()系統(tǒng)調(diào)用

      CAP_LEASE 28 Allow taking of leases on files

      4.能力邊界

      Linux2.2內(nèi)核提供了對(duì)能力的基本支持。但是在引入了能力之后遇到了一些困難,雖然2.2版本的內(nèi)核能夠理解能力,但是缺乏一個(gè)系統(tǒng)和用戶之間的接口。除此之外,還存在其它的一些問題。從2.2.11版本開始,這種情況發(fā)生了很大的改觀,在這個(gè)版本中引入了能力邊界集(capability bounding set)的概念,解決了和系統(tǒng)和用戶之間的接口問題。能力邊界集(capability bounding set)是系統(tǒng)中所有進(jìn)程允許保留的能力。如果在能力邊界集中不存在某個(gè)能力,那么系統(tǒng)中的所有進(jìn)程都沒有這個(gè)能力,即使以超級(jí)用戶權(quán)限執(zhí)行的進(jìn)程也一樣。

      能力邊界集通過sysctl命令導(dǎo)出,用戶可以在/proc/sys/kernel/cap-bound中看到系統(tǒng)保留的能力。在默認(rèn)情況下,能力邊界集所有的位都是打開的。

      root用戶可以向能力邊界集中寫入新的值來修改系統(tǒng)保留的能力。但是要注意,root用戶能夠從能力邊界集中刪除能力,卻不能再恢復(fù)被刪除的能力,只有init進(jìn)程能夠添加能力。通常,一個(gè)能力如果從能力邊界集中被刪除,只有系統(tǒng)重新啟動(dòng)才能恢復(fù)。

      刪除系統(tǒng)中多余的能力對(duì)提高系統(tǒng)的安全性是很有好處的。假設(shè)你有一臺(tái)重要的服務(wù)器,比較擔(dān)心可加載內(nèi)核模塊的安全性。而你又不想完全禁止在系統(tǒng)中使用可加載內(nèi)核模塊或者一些設(shè)備的驅(qū)動(dòng)就是一些內(nèi)核模塊。在這種情況下,最好使系統(tǒng)在啟動(dòng)時(shí)加載所有的模塊,然后禁止加載/卸載任何內(nèi)核模塊。在Linux系統(tǒng)中,加載/卸載內(nèi)核模塊是由CAP_SYS_MODULE能力控制的。如果把CAP_SYS_MODULE從能力邊界集中刪除,系統(tǒng)將不再允許加載/卸載任何的內(nèi)核模塊。

      CAP_SYS_MODULE能力的值是16,因此我們使用下面的命令就可以把它從能力邊界集中刪除:

      echo 0xFFFEFFFF >/proc/sys/kernel/cap-bound

      5.lcap

      雖然我們可以直接修改/proc/sys/kernel/cap-bound來刪除系統(tǒng)的某中能力,但是這樣畢竟非常的不方便。有一個(gè)程序lcap可以幫助我們更方便的從系統(tǒng)中刪除指定的能力。它可以從http://home.netcom.com/~spoon/lcap/下載。編譯之后就可以直接使用。如果不帶參數(shù),lcap可以列出系統(tǒng)當(dāng)前支持的各種能力:

      [root@nixe0n lcap-0.0.6]# ./lcap

      Current capabilities: 0xFFFFFEFF

      0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE

      2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER

      4) *CAP_FSETID 5) *CAP_KILL

      6) *CAP_SETGID 7) *CAP_SETUID

      8) CAP_SETPCAP 9) *CAP_LINUX_IMMUTABLE

      10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST

      12) *CAP_NET_ADMIN 13) *CAP_NET_RAW

      14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER

      16) *CAP_SYS_MODULE 17) *CAP_SYS_RAWIO

      18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE

      20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN

      22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE

      24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME

      使用capability加強(qiáng)container的安全

      26) *CAP_SYS_TTY_CONFIG

      * = Capabilities currently allowe

      如果我們需要?jiǎng)h除某個(gè)能力,直接把能力名作為參數(shù)就可以,例如我們要?jiǎng)h除加載/卸載內(nèi)核模塊的能力:

      [root@nixe0n lcap-0.0.6]# ./lcap CAP_SYS_MODULE

      [root@nixe0n lcap-0.0.6]# ./lcap

      Current capabilities: 0xFFFBFEFF

      0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE

      2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER

      4) *CAP_FSETID 5) *CAP_KILL

      6) *CAP_SETGID 7) *CAP_SETUID

      8) CAP_SETPCAP 9) *CAP_LINUX_IMMUTABLE

      10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST

      12) *CAP_NET_ADMIN 13) *CAP_NET_RAW

      14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER

      16) CAP_SYS_MODULE 17) *CAP_SYS_RAWIO

      18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE

      20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN

      22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE

      24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME

      26) *CAP_SYS_TTY_CONFIG

      * = Capabilities currently allowed

      6.能力邊界集的安全問題

      能力邊界集為系統(tǒng)和管理員之間提供了一個(gè)便利的交互接口,但是它存在一些的脆弱性。Patrick Reynolds在提交到BugTraq的一個(gè)郵件里詳細(xì)分析了這種脆弱性。對(duì)能力邊界集的最大威脅就是能夠被讀/寫的/dev/mem設(shè)備。在內(nèi)核內(nèi)存區(qū)中,/proc/sys/kernel/cap-bound直接影射到cap_bset變量中。如果/dev/mem可以寫,攻擊者就能夠直接修改內(nèi)存重置cap_bset變量。從而能夠越過能力邊界集打開所有的能力。使用以下命令就可以獲得cap_bset變量的地址:

      $ grep cap_bset System.map

      c01f0cd5 ? __kstrtab_cap_bset

      c01f7340 ? __ksymtab_cap_bset

      c01fb2ac D cap_bset

      從結(jié)果可以看出,cap_bset位于c01fb2ac。攻擊者獲得了/dev/mem的寫權(quán)限,只要寫入0xffffffff就能夠重新打開所有的能力。

      因此,為了維護(hù)能力邊界集的安全,你應(yīng)該放棄系統(tǒng)的CAP_SYS_RAWIO能力。這樣會(huì)造成X系統(tǒng)和其它一些需要訪問/dev/mem或I/O端口的程序無法運(yùn)行,不過對(duì)于服務(wù)器來說,這是值得的。除了關(guān)閉CAP_SYS_RAWIO,還應(yīng)該放棄CAP_SYS_MODULE能力。

      7.局限

      雖然利用能力可已經(jīng)以有效地保護(hù)系統(tǒng)的安全,但是由于文件系統(tǒng)的制約,Linux的能力控制還不是很完善。我們除了可以使用lcap從總體上放棄一些能力之外,服務(wù)器軟件程序員也應(yīng)該主動(dòng)放棄進(jìn)程的一些多余的能力。例如,xntpd程序可以通過以下的步驟放棄沒有必要的能力,以加強(qiáng)安全性:

      以完整的root權(quán)限啟動(dòng)

      綁定到ntp端口

      除了CAP_SYS_TIME能力之外,放棄其它的能力

      放棄root權(quán)限

      以普通管理帳戶的身份進(jìn)行正常的操作

      但是,并不是所有的程序員能夠注意到這個(gè)問題,如果能夠直接使用chmod和chattr命令限制程序的能力將給為方便。例如:

      [root@localhost /root]# chattr +CAP_BIND xntp

      目前,由于文件系統(tǒng)的制約,還無法實(shí)現(xiàn)。

      8.結(jié)論

      在本文,我們討論了Linux的能力,并說明了如何使用相關(guān)的工具加強(qiáng)系統(tǒng)的安全性。但是,能力還守制于文件系統(tǒng)的擴(kuò)展,并不是非常完善。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Oracle數(shù)據(jù)庫RMAN異機(jī)恢復(fù)一例
      下一篇:EI盤古研究分享【CVPR2022】自監(jiān)督預(yù)訓(xùn)練下的神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索算法DATA
      相關(guān)文章
      亚洲av中文无码| 亚洲äv永久无码精品天堂久久| 日韩国产欧美亚洲v片| 亚洲导航深夜福利| 91亚洲国产成人久久精品网站| 久久精品国产69国产精品亚洲| 国产亚洲视频在线播放| 色噜噜亚洲精品中文字幕| 久久久亚洲精品蜜桃臀| 亚洲日韩国产精品乱| 亚洲人成色77777在线观看大| 亚洲成网777777国产精品| 亚洲高清最新av网站| 亚洲日本在线观看视频| 久久久久无码专区亚洲av| 国产亚洲美日韩AV中文字幕无码成人| 亚洲精品国产成人影院| 亚洲日韩在线第一页| 日韩一卡2卡3卡4卡新区亚洲 | 国产亚洲AV无码AV男人的天堂| 亚洲愉拍99热成人精品热久久| 亚洲综合图色40p| 亚洲国产精品成人精品无码区 | 日日摸日日碰夜夜爽亚洲| 国产亚洲精品成人久久网站| 亚洲精品高清一二区久久| 亚洲欧洲自拍拍偷午夜色无码| 亚洲国产精品一区第二页 | 亚洲不卡AV影片在线播放| 亚洲人成网站18禁止一区| 亚洲综合色视频在线观看| 亚洲精品蜜桃久久久久久| 亚洲日本va午夜中文字幕一区| 亚洲国产亚洲综合在线尤物| 亚洲黄页网在线观看| 国产精品亚洲五月天高清| 国产亚洲精品线观看动态图| 亚洲国产精品无码一线岛国| 亚洲韩国在线一卡二卡| 最新国产精品亚洲| 亚洲成?Ⅴ人在线观看无码|