如何使用特殊權限:setuid、setgid和sticky位?
目標
了解特殊權限的工作原理,以及如何識別和設置它們。
要求
難度
簡單
約定
#
- 要求直接以 root 用戶或使用sudo
命令執(zhí)行指定的命令$
- 用普通的非特權用戶來執(zhí)行指定的命令
介紹
通常,在類 Unix 操作系統(tǒng)上,文件和目錄的所有權是基于文件創(chuàng)建者的默認 uid
(user-id)和 gid
(group-id)的。啟動一個進程時也是同樣的情況:它以啟動它的用戶的 uid
和 gid
運行,并具有相應的權限。這種行為可以通過使用特殊的權限進行改變。
setuid 位
當使用 setuid (設置用戶 ID)位時,之前描述的行為會有所變化,所以當一個可執(zhí)行文件啟動時,它不會以啟動它的用戶的權限運行,而是以該文件所有者的權限運行。所以,如果在一個可執(zhí)行文件上設置了 setuid 位,并且該文件由 root 擁有,當一個普通用戶啟動它時,它將以 root 權限運行。顯然,如果 setuid 位使用不當?shù)脑?,會帶來潛在的安全風險。
使用 setuid 權限的可執(zhí)行文件的例子是 passwd
,我們可以使用該程序更改登錄密碼。我們可以通過使用 ls
命令來驗證:
ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Feb 11 2017 /bin/passwd
如何識別 setuid
位呢?相信您在上面命令的輸出已經(jīng)注意到,setuid
位是用 s
來表示的,代替了可執(zhí)行位的 x
。小寫的 s
意味著可執(zhí)行位已經(jīng)被設置,否則你會看到一個大寫的 S
。大寫的 S
發(fā)生于當設置了 setuid
或 setgid
位、但沒有設置可執(zhí)行位 x
時。它用于提醒用戶這個矛盾的設置:如果可執(zhí)行位未設置,則 setuid
和 setgid
位均不起作用。setuid 位對目錄沒有影響。
setgid 位
與 setuid
位不同,setgid
(設置組 ID)位對文件和目錄都有影響。在第一個例子中,具有 setgid
位設置的文件在執(zhí)行時,不是以啟動它的用戶所屬組的權限運行,而是以擁有該文件的組運行。換句話說,進程的 gid
與文件的 gid
相同。
當在一個目錄上使用時,setgid
位與一般的行為不同,它使得在所述目錄內創(chuàng)建的文件,不屬于創(chuàng)建者所屬的組,而是屬于父目錄所屬的組。這個功能通常用于文件共享(目錄所屬組中的所有用戶都可以修改文件)。就像 setuid 一樣,setgid 位很容易識別(我們用 test 目錄舉例):
ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov 1 17:25 test
這次 s
出現(xiàn)在組權限的可執(zhí)行位上。
sticky 位
sticky (粘連)位的工作方式有所不同:它對文件沒有影響,但當它在目錄上使用時,所述目錄中的所有文件只能由其所有者刪除或移動。一個典型的例子是 /tmp
目錄,通常系統(tǒng)中的所有用戶都對這個目錄有寫權限。所以,設置 sticky 位使用戶不能刪除其他用戶的文件:
$ ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov 1 16:48 /tmp
在上面的例子中,目錄所有者、組和其他用戶對該目錄具有完全的權限(讀、寫和執(zhí)行)。sticky 位在可執(zhí)行位上用 t
來標識。同樣,小寫的 t
表示可執(zhí)行權限 x
也被設置了,否則你會看到一個大寫字母 T
。
如何設置特殊權限位
就像普通的權限一樣,特殊權限位可以用 chmod
命令設置,使用數(shù)字或者 ugo/rwx
格式。在前一種情況下,setuid
、setgid
和 sticky
位分別由數(shù)值 4、2 和 1 表示。例如,如果我們要在目錄上設置 setgid
位,我們可以運行:
$ chmod 2775 test
通過這個命令,我們在目錄上設置了 setgid
位(由四個數(shù)字中的第一個數(shù)字標識),并給它的所有者和該目錄所屬組的所有用戶賦予全部權限,對其他用戶賦予讀和執(zhí)行的權限(目錄上的執(zhí)行位意味著用戶可以 cd
進入該目錄或使用 ls
列出其內容)。
另一種設置特殊權限位的方法是使用 ugo/rwx
語法:
$ chmod g+s test
要將 setuid
位應用于一個文件,我們可以運行:
$ chmod u+s file
要設置 sticky 位,可運行:
$ chmod o+t test
在某些情況下,使用特殊權限會非常有用。但如果使用不當,可能會引入嚴重的漏洞,因此使用之前請三思。