來源:Linux愛好者
ID:LinuxHub
以下是對使用者和組資訊的舉例。 /etc/shadow 中的口令資訊為加密儲存,不舉例。
$cat /etc/passwd |head –n 5
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
$cat /etc/group |head –n 5
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:miracle
輸出中, 第1個字元表示檔案型別,其中,普通檔案(-)、目錄檔案 (d)、套接字檔案(s),管道檔案(p),字元檔案(c),塊檔案(b),連結檔案(l); 第2個字元開始的 -rwxr-xr-x 部分表示檔案的許可權位,共有9位。
對於檔案 /usr/bin/qemu-i386 , 這個許可權控制的含義是:
-
第2~4位的 rwx 表示該檔案可被它的 owner (屬主)以 r 或 w 或 x 的許可權訪問。
-
第5~7位的 r-x 表示該檔案可被與該檔案同一屬組的使用者以 r 或 x 的許可權訪問
-
第8~10位的 r-x 表示該檔案可被其它未知使用者以 r 或 x 的許可權訪問。
對於 test/, test2/, test3/ 設定的許可權:
-
r,w,x 許可權對每一許可權控制組的許可權用一位8進位制來表示; 例如: 755 表示 rwxr-xr-x。
-
s,t 許可權會替代 x 位置顯示;設定 s,t 許可權則需在對應的、用於控制 r,w,x 的8進位制許可權控制組前追加數字; s 許可權用於屬主屬組控制, t 用於其它控制。
-
設定屬主 s 需追加 4, 設定屬組 s 追加 2, 設定其它者 t 許可權追加 1 ; 例如前面對 test/ 設定 t, 則用 1775, 表示 rwxrwxr-t 。
行程許可權控制資訊
行程許可權
對於行程,有如下屬性與檔案訪問許可權相關:
-
effective user id : 行程訪問檔案許可權相關的 UID (簡寫為 euid )。
-
effective group id : 行程訪問檔案許可權相關的 GID (簡寫為 egid )。
-
real user id : 建立該行程的使用者登入系統時的 UID (簡寫為 ruid )。
-
real group id : 建立該行程的使用者登入系統時的 GID (簡寫為 rgid )。
-
saved set user id : 複製自 euid 。
-
saved set group id : 複製自 egid 。
舉例
我們可以使用 ps 和 top 選擇檢視具有 euid 和 ruid 的行程。或者透過 top 來檢視行程的 euid 和 ruid
透過 top 來檢視的例子:
-
首先輸入 top 得到類似如下
其中, PID 是對應行程, USER 是對應的 effective user, RUSER 是對應的 real user 。
行程訪問檔案的許可權控制策略
規則
行程訪問檔案大致許可權控制策略
對於行程訪問檔案而言,最重要的是 euid, 所以其許可權屬性均以 euid 為 “中心”。
-
行程的 euid 一般預設即為 其 ruid 值
-
若可執行檔案的可執行許可權位為 s ,行程對其呼叫 exec 後,其 euid 被設定為該可執行檔案的 user id
-
行程的 saved set user id 複製自 euid.
-
當行程的 euid 與檔案的 user id 匹配時,行程才具有檔案 user 許可權位所設定的許可權
-
組許可權 egid 的控制規則類似。
透過 exec 執行檔案修改許可權屬性
透過 exec 呼叫可執行檔案之時:
-
行程 ruid 值始終不變;
-
saved set-user ID 始終來自 euid ;
-
euid 值取決於檔案的 set-user-ID 位是否被設定。
如下:
舉例
再舉幾個比較特別的例子:
– 設定了 set-user-id
$ ls –l /usr/bin/sudo
–rwsr–xr–x 1 root root 71288 2月 28 2013 /usr/bin/sudo
如前所述,這個輸出的含義是,對於 /usr/bin/sudo 檔案,
-
第1~3位的 rws 表示該檔案可被它的owner(屬主)以 r 或 w 或 s 的許可權訪問
-
第4~6位的 r-x 表示該檔案可被與該檔案同一屬組的使用者以 r 或 x 的許可權訪問。
-
第7~9位的 r-x 表示該檔案可被其它未知使用者以 r 或 x 的許可權訪問。
這樣設定之後,對於owner,具有讀、寫、執行許可權,這一點沒有什麼不同。但是對於不屬於 root 組的普通使用者行程來說,卻大不相同。
普通使用者行程執行 sudo 命令時透過其 others 中的 x 獲得執行許可權,再透過 user 中的 s使得普通使用者行程臨時具有了 sudo 可執行檔案屬主( root )的許可權,即超級許可權。
這也是為什麼透過 sudo 命令就可以讓普通使用者執行許多管理員許可權的命令的原因。
– 設定了 stick-bit
$ ls –l / |grep tmp
drwxrwxrwt 25 root root 12288 7月 20 09:09 tmp
這樣設定之後,對於 /tmp 目錄,任何人都具有讀、寫、執行許可權,這一點沒有什麼不同。但是對於 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 程式可能會執行一些其它的命令來處理包含顯示的 man 手冊頁的檔案。
為防止處理出錯, man 會從兩個特權之間進行切換:執行 man 命令的使用者特權,以及 man程式的擁有者的特權。
需要抓住的主線:當只執行 man 之時,行程特權就是 man 使用者的特權, 當透過 man 執行子行程(如透過 !bash 引出shell命令)時,使用者切換為當前使用者,執行完又切換回去。
過程如下:
-
假設 man 程式檔案被使用者 man 所擁有,並且已經被設定了它的 set-user-ID 位,當我們 exec 它的時候,我們有如下情況:
-
real user ID = 我們的使用者UID
-
effective user ID = man使用者UID
-
saved set-user-ID = man使用者UID
man 程式會訪問需要的配置檔案和 man 手冊頁。這些檔案由 man 使用者所擁有,但是由於 effective user ID 是 man,檔案的訪問就被允許了。
在 man 為我們執行任何命令的時候,它會呼叫 setuid(getuid())) (getuid() 傳回的是 real user id).因為我們不是 superuser 行程,這個變化只能改變 effective user ID. 我們會有如下情況:
現在 man 行程執行的時候把我們得UID作為它的 effective user ID.這也就是說,我們只能訪問我們擁有自己許可權的檔案。也就是說,它能夠代表我們安全地執行任何 filter.
-
real user ID = 我們的使用者UID(不會被改變)
-
effective user ID = 我們的使用者UID
-
saved set-user-ID = man 的使用者UID(不會被改變)
當 filter 做完了的時候, man 會呼叫 setuid(euid).這裡, euid 是 man 使用者的UID.(這個ID是透過 man 呼叫 geteuid 來儲存的)這個呼叫是可以的,因為 setuid 的引數和 saved set-user-ID 是相等的。(這也就是為什麼我們需要 saved set-user-ID).這時候我們會有如下情況:
-
real user ID = 我們的使用者UID(不會被改變)
-
effective user ID = man的UID
-
saved set-user-ID = man 的使用者UID(不會被改變)
由於 effective user ID 是 man,現在 man 程式可以操作它自己的檔案了。透過這樣使用 saved set-user-ID,我們可以在行程開始和結束的時候透過程式檔案的 set-user-ID 來使用額外的許可權。然而,期間我們卻是以我們自己的許可權執行的。如果我們無法在最後切換回 saved set-user-ID,我們就可能會在我們執行的時候保留額外的許可權。
下麵我們來看看如果 man 啟動一個 shell 的時候會發生什麼:
-
這裡的 shell 是 man 使用 fork 和 exec 來啟動的。
-
因為這時 real user ID 和 effective user ID 都是我們的普通使用者UID(參見step3), 所以 shell 沒有其它額外的許可權.
-
啟動的 shell 無法訪問 man 的 saved set-user-ID(man) ,因為 shell 的 saved set-user-ID 是由 exec 從 effective user ID 複製過來的。
-
在執行 exec 的子行程( shell )中,所有的 user ID 都是我們的普通使用者ID.
實際上,我們描述 man 使用 setuid 函式的方法不是特別正確,因為程式可能會 set-user-ID 為 root .這時候, setuid 會把所有三種uid都變成你設定的id,但是我們只需要設定 effective user ID。
【關於作者】
呂凱:深圳,工作經驗 9 年,冠捷科技公司資深主任工程師。關註軟體開發、系統運維、內容管理、行動管理等領域,喜歡計數寫作及分享。
《Linux雲端計算及運維架構師高薪實戰班》2018年08月27日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –
更多Linux好文請點選【閱讀原文】哦
↓↓↓