《Linux權限控制的基本原理》要點:
本文介紹了Linux權限控制的基本原理,希望對您有用。如果有疑問,可以聯(lián)系我們。
本文主要介紹 Linux 系統(tǒng)中,權限控制的基本原理.
在 Linux 系統(tǒng)中,我們所有的操作實質都是在進行進程訪問文件的操作.我們訪問文件需要先取得相應的訪問權限,而訪問權限是通過 Linux 系統(tǒng)中的安全模型獲得的.
對于 Linux 系統(tǒng)中的安全模型,我們需要知道下面兩點:
注意, MAC 和 DAC 不是互斥的, DAC 是最基本的安全模型,也是通常我們最常用到的訪問控制機制是 Linux 必須具有的功能, 而 MAC 是構建在 DAC 之上的加強安全機制,屬于可選模塊.訪問前, Linux 系統(tǒng)通常都是先做 DAC 檢查, 如果沒有通過則操作直接失敗 ; 如果通過 DAC 檢查并且系統(tǒng)支持 MAC 模塊,再做 MAC 權限檢查.
為區(qū)分兩者,我們將支持 MAC 的 Linux 系統(tǒng)稱作 SELinux, 表示它是針對 Linux 的安全加強系統(tǒng).
這里,我們將講述 Linux 系統(tǒng)中的 DAC 安全模型.
DAC 的核心內容是:在 Linux 中,進程理論上所擁有的權限與執(zhí)行它的用戶的權限相同.其中涉及的一切內容,都是圍繞這個核心進行的.
用戶、組、口令信息
通過 /etc/passwd 和 /etc/group 保存用戶和組信息,通過 /etc/shadow 保存密碼口令及其變動信息, 每行一條記錄.
用戶和組分別用 UID 和 GID 表示,一個用戶可以同時屬于多個組,默認每個用戶必屬于一個與之 UID 同值同名的 GID .
對于 /etc/passwd , 每條記錄字段分別為 用戶名: 口令(在 /etc/shadow 加密保存):UID:GID(默認 UID): 描述注釋: 主目錄: 登錄 shell(第一個運行的程序)
對于 /etc/group , 每條記錄字段分別為 組名:口令(一般不存在組口令):GID:組成員用戶列表(逗號分割的用戶 UID 列表)
對于 /etc/shadow ,每條記錄字段分別為: 登錄名: 加密口令: 最后一次修改時間: 最小時間間隔: 最大時間間隔: 警告時間: 不活動時間:
舉例
以下是對用戶和組信息的舉例. /etc/shadow 中的口令信息為加密存儲,不舉例.
文件類型
Linux 中的文件有如下類型:
訪問權限控制組
分為三組進行控制:
可設定的權限
下面給出常見(但非全部)的權限值, 包括:
舉例
通過 ls -l 可以查看到其文件類型及權限,通過 chmod 修改權限.
舉例來說,
輸出中, 第 1 個字符表示文件類型,其中,普通文件 (-)、目錄文件 (d)、套接字文件 (s),管道文件 (p),字符文件 (c),塊文件 (b),鏈接文件 (l); 第 2 個字符開始的 -rwxr-xr-x 部分表示文件的權限位,共有 9 位.
對于文件 /usr/bin/qemu-i386 , 這個權限控制的含義是:
對于 test/, test2/, test3/ 設定的權限:
進程權限
對于進程,有如下屬性與文件訪問權限相關:
舉例
我們可以使用 ps 和 top 選擇查看具有 euid 和 ruid 的進程.或者通過 top 來查看進程的 euid 和 ruid
通過 top 來查看的例子:
首先輸入 top 得到類似如下
這里通過 -d 選項延長 top 的刷新頻率便于操作.此處可見,只有 USER 字段,表示相應進程的 effective user id.
打開 read user id 的顯示選項:
a. 在 top 命令運行期間,輸入 f, 可以看見類似如下行:
b. 輸入 c 即可打開 Real user name 的顯示開關.
c. 最后 Return 回車回到 top 中,即可看到 real user id 的選項.此時輸入`o`,可調整列次序.最終我們可看到包含`effective user id`和`real user id`的輸出如下:
規(guī)則
進程訪問文件大致權限控制策略
對于進程訪問文件而言,最重要的是 euid, 所以其權限屬性均以 euid 為 “中心”.
通過 exec 執(zhí)行文件修改權限屬性
通過 exec 調用可執(zhí)行文件之時:
如下:
通過 setuid(uid) 系統(tǒng)調用修改權限屬性
通過 setuid(uid) 修改權限屬性之時:
舉例
再舉幾個比較特別的例子:
設置了 set-user-id
如前所述,這個輸出的含義是,對于 /usr/bin/sudo 文件,
這樣設置之后,對于 owner,具有讀、寫、執(zhí)行權限,這一點沒有什么不同.但是對于不屬于 root 組的普通用戶進程來說,卻大不相同.
普通用戶進程執(zhí)行 sudo 命令時通過其 others 中的 x 獲得執(zhí)行權限,再通過 user 中的 s 使得普通用戶進程臨時具有了 sudo 可執(zhí)行文件屬主 ( root ) 的權限,即超級權限.
這也是為什么通過 sudo 命令就可以讓普通用戶執(zhí)行許多管理員權限的命令的原因.
設置了 stick-bit
這樣設置之后,對于 /tmp 目錄,任何人都具有讀、寫、執(zhí)行權限,這一點沒有什么不同.但是對于 others 部分設置了粘滯位 t, 其功能卻大不相同.
若目錄沒設置粘滯位,任何對目錄有寫權限者都則可刪除其中任何文件和子目錄,即使他不是相應文件的所有者,也沒有讀或寫許可 ; 設置粘滯位后,用戶就只能寫或刪除屬于他的文件和子目錄.
這也是為什么任何人都能向 /tmp 目錄寫文件、目錄,卻只能寫和刪除自己擁有的文件或目錄的原因.
舉一個 man 程序的應用片斷,描述 set-user-id 和 saved set-user-id 的使用
man 程序可以用來顯示在線幫助手冊, man 程序可以被安裝指定 set-user-ID 或者 set-group-ID 為一個指定的用戶或者組.
man 程序可以讀取或者覆蓋某些位置的文件,這一般由一個配置文件 (通常是 /etc/man.config 或者 /etc/manpath.config ) 或者命令行選項來進行配置.
man 程序可能會執(zhí)行一些其它的命令來處理包含顯示的 man 手冊頁的文件.
為防止處理出錯, man 會從兩個特權之間進行切換:運行 man 命令的用戶特權,以及 man 程序的擁有者的特權.
需要抓住的主線:當只執(zhí)行 man 之時,進程特權就是 man 用戶的特權, 當通過 man 執(zhí)行子進程(如通過 !bash 引出 shell 命令)時,用戶切換為當前用戶,執(zhí)行完又切換回去.
過程如下:
下面我們來看看如果 man 啟動一個 shell 的時候會發(fā)生什么:
實際上,我們描述 man 使用 setuid 函數的方法不是特別正確,因為程序可能會 set-user-ID 為 root . 這時候, setuid 會把所有三種 uid 都變成你設置的 id,但是我們只需要設置 effective user ID.
關于作者
呂凱,大連理工大學碩士,現(xiàn)為 TPV 資深主任工程師.關注軟件開發(fā)、系統(tǒng)運維、內容管理、行動管理等領域,喜歡計數寫作及分享.(文章來自公眾號:高效運維開發(fā))
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/3745.html