setuid 和 setgid 分別是 set uid ID upon execution 和 set group ID upon execution 的縮寫。咱們通常會再次把它們縮寫爲 suid 和 sgid。它們是控制文件訪問的權限標誌(flag),它們分別容許用戶以可執行文件的 owner 或 owner group 的權限運行可執行文件。
說明:本文的演示環境爲 ubuntu 16.04。linux
在 Linux 中,全部帳號的密碼記錄在 /etc/shadow 這個文件中,而且只有 root 能夠讀寫入這個文件:數據庫
若是另外一個普通帳號 tester 須要修改本身的密碼,就要訪問 /etc/shadow 這個文件。可是明明只有 root 才能訪問 /etc/shadow 這個文件,這到底是如何作到的呢?事實上,tester 用戶是能夠修改 /etc/shadow 這個文件內的密碼的,就是經過 SUID 的功能。讓咱們看看 passwd 程序文件的權限信息:ubuntu
上圖紅框中的權限信息有些奇怪,owner 的信息爲 rws 而不是 rwx。當 s 出如今文件擁有者的 x 權限上時,就被稱爲 SETUID BITS 或 SETUID ,其特色以下:安全
下面咱們來看 tester 用戶是如何利用 SUID 權限完成密碼修改的:ui
可是若是由 tester 用戶執行 cat 命令去讀取 /etc/shadow 文件確是不行的:spa
緣由很清楚,tester 用戶沒有讀 /etc/shadow 文件的權限,同時 cat 程序也沒有被設置 SUID。咱們能夠經過下圖來理解這兩種狀況:.net
若是想讓任意用戶經過 cat 命令讀取 /etc/shadow 文件的內容也是很是容易的,給它設置 SUID 權限就能夠了:設計
$ sudo chmod 4755 /bin/cat
如今 cat 已經具備了 SUID 權限,試試看,是否是已經能夠 cat 到 /etc/shadow 的內容了。由於這樣作很是不安全,因此趕快經過下面的命令把 cat 的 SUID 權限移除掉:rest
$ sudo chmod 755 /bin/cat
當 s 標誌出如今用戶組的 x 權限時稱爲 SGID。SGID 的特色與 SUID 相同,咱們經過 /usr/bin/mlocate 程序來演示其用法。mlocate 程序經過查詢數據庫文件 /var/lib/mlocate/mlocate.db 實現快速的文件查找。 mlocate 程序的權限以下圖所示:code
很明顯,它被設置了 SGID 權限。下面是數據庫文件 /var/lib/mlocate/mlocate.db 的權限信息:很明顯,它被設置了 SGID 權限。下面是數據庫文件 /var/lib/mlocate/mlocate.db 的權限信息:
普通用戶 tester 執行 mlocate 命令時,tester 就會得到用戶組 mlocate 的執行權限,又因爲用戶組 mlocate 對 mlocate.db 具備讀權限,因此 tester 就能夠讀取 mlocate.db 了。程序的執行過程以下圖所示:
除二進制程序外,SGID 也能夠用在目錄上。當一個目錄設置了 SGID 權限後,它具備以下功能:
下面看個例子,建立 testdir 目錄,目錄的權限設置以下:
此時目錄 testdir 的 owner 是 nick,所屬的 group 爲 tester。
先建立一個名爲 nickfile 的文件:
這個文件的權限看起來沒有什麼特別的。而後給 testdir 目錄設置 SGID 權限:
$ sudo chmod 2775 testdir
而後再建立一個文件 nickfile2:
新建的文件所屬的組爲 tester!
總結一下,當 SGID 做用於普通文件時,和 SUID 相似,在執行該文件時,用戶將得到該文件所屬組的權限。當 SGID 做用於目錄時,意義就很是重大了。當用戶對某一目錄有寫和執行權限時,該用戶就能夠在該目錄下創建文件,若是該目錄用 SGID 修飾,則該用戶在這個目錄下創建的文件都是屬於這個目錄所屬的組。
其實 SBIT 與 SUID 和 SGID 的關係並不大。
SBIT 是 the restricted deletion flag or sticky bit 的簡稱。
SBIT 目前只對目錄有效,用來阻止非文件的全部者刪除文件。比較常見的例子就是 /tmp 目錄:
權限信息中最後一位 t 代表該目錄被設置了 SBIT 權限。SBIT 對目錄的做用是:當用戶在該目錄下建立新文件或目錄時,僅有本身和 root 纔有權力刪除。
以數字的方式設置權限
SUID、SGID、SBIT 權限對應的數字以下:
SUID->4 SGID->2 SBIT->1
因此若是要爲一個文件權限爲 "-rwxr-xr-x" 的文件設置 SUID 權限,須要在原先的 755 前面加上 4,也就是 4755:
$ chmod 4755 filename
一樣,能夠用 2 和 1 來設置 SGID 和 SBIT 權限。設置完成後分別會用 s, s, t 代替文件權限中的 x。
其實,還可能出現 S 和 T 的狀況。S 和 t 是替代 x 這個權限的,可是,若是它自己沒有 x 這個權限,添加 SUID、SGID、SBIT 權限後就會顯示爲大寫 S 或大寫 T。好比咱們爲一個權限爲 666 的文件添加 SUID、SGID、SBIT 權限:
執行 chmod 7666 nickfile,由於 666 表示 "-rw-rw-rw",均沒有 x 權限,因此最後變成了 "-rwSrwSrwT"。
經過符號類型改變權限
除了使用數字來修改權限,還可使用符號:
$ chmod u+s testfile # 爲 testfile 文件加上 SUID 權限。 $ chmod g+s testdir # 爲 testdir 目錄加上 SGID 權限。 $ chmod o+t testdir # 爲 testdir 目錄加上 SBIT 權限。
SUID、SGID、SBIT 權限都是爲了實現特殊功能而設計的,其目的是彌補 ugo 權限沒法實現的一些使用場景。
參考:
chmod man page
setuid-Wikipedia
linux中SUID,SGID和SBIT的奇妙用途
linux特殊權限SUID、SGID、SBIT