Linux檔案特殊許可權(SUID、SGID和SBIT)設定詳解

2020-07-16 10:04:46
前面已經學習 SUID、SGID、SBIT 特殊許可權,以及各自的含義和功能,那麼,如何給檔案或目錄手動設定這些特殊許可權呢?

還是要依賴 chmod 命令。我們知道,使用 chmod 命令給檔案或目錄設定許可權,有 2 種方式,分別是使用數位形式和字母形式。例如:

#數位形式
[[email protected] ~]# chmod 755 ftest
#字母形式
[[email protected] ~]# chmod u=rwx,go=rx ftest

給檔案或目錄設定 SUID、SGID 和 SBIT 特殊許可權,也可以使用這 2 種形式。

有關 chmod 命令的用法,可以閱讀《Linux chmod命令》一節。

我們知道,給 chmod 命令傳遞 3 個數位,即可實現給檔案或目錄設定普通許可權。比如說,"755" 表示所有者擁有 rwx 許可權,所屬組擁有 rx 許可權,其他人擁有 tx 許可權。

給檔案或目錄設定特殊許可權,只需在這 3 個數位之前增加一個數位位,用來放置給檔案或目錄設定的特殊許可權,就這麼簡單。

因此,我們有必要知道 SUID、SGID、SBIT 分別對應的數位,如下所示:

4 --> SUID
2 --> SGID
1 --> SBIT

舉個例子,如果要將一個檔案許可權設定為 -rwsr-xr-x,怎麼辦呢?此檔案的普通許可權為 755,另外,此檔案還有 SUID 許可權,因此只需在 755 的前面,加上 SUID 對應的數位 4 即可。也就是說,只需執行chmod 4755 檔名命令,就完成了-rwsr-xr-x 許可權的設定。

關於 -rwsr-xr-x 的普通許可權是 755,你可以這樣理解,標記有 s 和 t 的許可權位,隱藏有 x 許可權,對此,本節後續會給出更詳細的解釋。

同樣的道理,如果某檔案擁有 SUID 和 SGID 許可權,則只需要給 chmod 命令傳遞 6---(- 表示數位)即可;如果某目錄擁有 SGID 和 SBIT,只需要給 chmod 命令傳遞 3--- 即可。

注意,不同的特殊許可權,作用的物件是不同的,SUID 只對可執行檔案有效;SGID 對可執行檔案和目錄都有效;SBIT 只對目錄有效。當然,你也可以給檔案設定 7---,也就是將 SUID、SGID、SBIT賦予一個檔案或目錄,例如:

[[email protected] ~]# chmod 7777 ftest
#一次賦予SetUID、SetGID和SBIT許可權
[[email protected] ~]# ll ftest
-rwsrwsrwt. 1 root root Apr 19 23:54 ftest

執行過程雖然沒有報錯,但這樣做,沒有任何實際意義。

除了賦予 chmod 命令 4 個數位設定特殊許可權,還可以使用字母的形式。例如,可以通過 "u+s" 給檔案賦予 SUID 許可權;通過 "g+s" 給檔案或目錄賦予 SGID 許可權;通過 "o+t" 給目錄賦予 SBIT 許可權。

舉一個例子:

[[email protected] ~]#chmod u+s, g+s, o+t ftest
#設定特殊許可權
[[email protected] ~]# ll ftest
-rwsr-sr-t. 1 root root Apr 19 23:54 ftest
[[email protected] ~]# chmod u-s, g-s, o-t ftest
#取消特殊許可權
[[email protected] ~]# ll ftest
-rwxr-xr-x. 1 root root Apr 19 23:54 ftest

例子中,通過字母的形式成功給 ftest 檔案賦予了 3 種特殊許可權,此做法僅為驗證字母形式的可行性,對 ftest 檔案來說,並無實際意義。

細心的讀者可能發現這樣一個問題,使用 chmod 命令給檔案或目錄賦予特殊許可權時,原檔案或目錄中存在的 x 許可權會被替換成 s 或 t,而當我們使用 chmod 命令消除檔案或目錄的特殊許可權時,原本消失的 x 許可權又會顯現出來。

這是因為,無論是 SUID、SGID 還是 SBIT,它們只針對具有 x 許可權的檔案或目錄有效。沒有 x 許可權的檔案或目錄,即便賦予特殊許可權,也無法發揮它們的功能,沒有任何意義。

例如,我們就是要給不具有 x 許可權的檔案或目錄賦予特殊許可權,看看有什麼效果:

[[email protected] ~]# chmod 7666 ftest
[[email protected] ~]# ll ftest
-rwSrwSrwT. 1 root root Apr 23:54 ftest

可以看到,相應的許可權位會被標記為 S(大寫)和 T(大寫),指的就是設定的 SUID、SGID 和 SBIT 許可權沒有意義。