歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 如何利用capability特征加強Linux系統安全

如何利用capability特征加強Linux系統安全

日期:2017/3/2 10:04:07   编辑:關於Linux

摘要:傳統UNIX系統的訪問控制模型非常簡單--普通用戶對超級用戶。在這種模型中,一個進程或者帳戶要麼只有很小的權限,要麼具有全部的系統權限。顯然,這樣對系統的安全沒有什麼好處。從Linux-2.1內核開始,引入了能力(capability)的概念,實現了更細粒度的訪問控制。

1.簡介

UNIX是一種安全操作系統,它給普通用戶盡可能低的權限,而把全部的系統權限賦予一個單一的帳戶--root。root帳戶用來管理系統、安裝軟件、管理帳戶、運行某些服務、安裝/卸載文件系統、管理用戶、安裝軟件等。另外,普通用戶的很多操作也需要root權限,這通過setuid實現。

這種依賴單一帳戶執行特權操作的方式加大了系統的面臨風險,而需要root權限的程序可能只是為了一個單一的操作,例如:綁定到特權端口、打開一個只有root權限可以訪問的文件。某些程序可能有安全漏洞,而如果程序不是以root的權限運行,其存在的漏洞就不可能對系統造成什麼威脅。

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

2.Linux內核能力詳解

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

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

2.1.能力的概念

Linux內核中使用的能力(capability)概念非常容易被混淆。計算機科學中定義了很多種能力(capability)。能力就是一個進程能夠對某個對象進行的操作,它標志對象以及允許在這個對象上進行的操作。文件描述符就是一種能力,你使用open系統調用請求獲得讀或者寫的權限,如果open系統調用成功,系統的诤司突峤 ⒁桓鑫募 枋龇 H緩螅 绻 盞蕉粱蛘咝吹那肭螅 诤司褪褂謎飧鑫募 枋龇 魑 桓鍪 萁峁溝乃饕 焖飨喙氐牟僮魇欠裨市怼U馐且恢旨觳槿ㄏ薜撓行Х絞劍 谥蔥衞pen系統調用是,內核一次性建立必要的數據結構,然後的讀寫等操作檢查只需要在數據結構中梭梭即可。對能力的操作包括:復制能力、進程間的遷移能力、修改一個能力以及撤消一個能力等。修改一個能力類似與把一個可以讀寫的文件描述符改為只讀。目前,各種系統對能力的應用程度並不相同。

POSIX 1003.1e中也提出了一種能力定義,通常稱為POSIX能力(POSIX capabilities),Linux中的定義不大一樣。內核使用這些能力分割root的權限,因為傳統*NIX系統中root的權限過於強大了。

2.2.Linux是如何使用POSIX capabilities代替傳統的信任狀模型的

每個進程有三個和能力有關的位圖:inheritable(I)、permitted(P)和effective(E),對應進程描述符task_struct(include/linux/sched.h)裡面的cap_effective, cap_inheritable, cap_permitted。每種能力由一位表示,1表示具有某種能力,0表示沒有。當一個進程要進行某個特權操作時,操作系統會檢查cap_effective的對應位是否有效,而不再是檢查進程的有效UID是否為0。例如,如果一個進程要設置系統的時鐘,Linux的內核就會檢查cap_effective的CAP_SYS_TIME位(第25位)是否有效,

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

3.Linux支持的能力

Linux實現了7個POSIX 1003.1e規定的能力,還有21個(截止到2.4.7-10版本的內核)Linux所特有的,這些能力在/usr/src/linux/include/linux/capability.h文件中定義。其細節如下:

能力名 數字 描述
CAP_CHOWN 0 允許改變文件的所有權
CAP_DAC_OVERRIDE 1 忽略對文件的所有DAC訪問限制
CAP_DAC_READ_SEARCH 2 忽略所有對讀、搜索操作的限制
CAP_FOWNER 3 如果文件屬於進程的UID,就取消對文件的限制
CAP_FSETID 4 允許設置setuid位
CAP_KILL 5 允許對不屬於自己的進程發送信號
CAP_SETGID 6 允許改變組ID
CAP_SETUID 7 允許改變用戶ID
CAP_SETPCAP 8 允許向其它進程轉移能力以及刪除其它進程的任意能力
CAP_LINUX_IMMUTABLE 9 允許修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)屬性
CAP_NET_BIND_SERVICE 10 允許綁定到小於1024的端口
CAP_NET_BROADCAST 11 允許網絡廣播和多播訪問
CAP_NET_ADMIN 12 允許執行網絡管理任務:接口、防火牆和路由等,詳情請參考/usr/src/linux/include/linux/capability.h文件
CAP_NET_RAW 13 允許使用原始(raw)套接字
CAP_IPC_LOCK 14 允許鎖定共享內存片段
CAP_IPC_OWNER 15 忽略IPC所有權檢查
CAP_SYS_MODULE 16 插入和刪除內核模塊
CAP_SYS_RAWIO 17 允許對ioperm/iopl的訪問
CAP_SYS_CHROOT 18 允許使用chroot()系統調用
CAP_SYS_PTRACE 19 允許跟蹤任何進程
CAP_SYS_PACCT 20 允許配置進程記帳(process accounting)
CAP_SYS_ADMIN 21 允許執行系統管理任務:加載/卸載文件系統、設置磁盤配額、開/關交換設備和文件等。詳情請參考/usr/src/linux/include/linux/capability.h文件。

Copyright © Linux教程網 All Rights Reserved