天天看點

UNIX環境程式設計筆記——儲存的設定使用者ID可執行檔案的設定使用者ID位儲存的設定使用者ID

可執行檔案的設定使用者ID位

我們知道,如果設定了可執行檔案的設定使用者ID位,那麼在執行此檔案的時候,程序的有效使用者ID将會設定成該檔案的所有者使用者ID,這使得我們可以以該檔案的所有者的使用者權限對該檔案進行操作。比較典型的一個例子就是 passwd 指令。passwd指令允許我們更改目前登陸使用者的密碼而不需要具有root使用者權限。由于該指令需要寫/etc/passwd檔案,但我們通過ll指令檢視該檔案的相關權限可以看到:

[email protected]:~$ ll /etc/passwd
-rw-r--r-- 1 root root 2496 11月 29 10:55 /etc/passwd
           

隻有root使用者才具備寫passwd檔案的權限。可見passwd指令是設定了設定使用者ID位的。

通過再次對/usr/bin/passwd 檔案使用ll指令我們可以證明這一結論:

[email protected]:~$ ll /usr/bin/passwd 
-rwsr-xr-x 1 root root 59640 1月  25  2018 /usr/bin/passwd*
           

如果需要對可執行檔案的這一特殊位進行設定,可以使用chmod *+s [filename]

儲存的設定使用者ID

與可執行檔案的設定使用者ID位相關的是與之對應的程序的儲存的設定使用者ID位。

回顧一下,如果設定了可執行檔案的設定使用者ID位,那麼當作業系統将該檔案加載進記憶體進行運作的時候,這一程序的有效使用者ID便設定成該檔案的所有者使用者ID。

現在,讓我們看一下與一個程序相關聯的ID都有哪些:

ID名 含義
實際使用者ID,實際組ID 我們實際上是誰
有效使用者ID,有效組ID, 附屬組ID 用于檔案通路權限檢查
儲存的設定使用者ID, 儲存的設定組ID 由exec函數儲存

(摘自UNIX環境進階程式設計第三版)

我們還要注意到,儲存的設定使用者/組ID是由exec函數複制有效使用者ID位而得到的。

對于沒有設定設定使用者/組ID位的檔案

對應的程序的有效使用者ID一般就是其實際使用者ID,是以儲存的設定使用者ID也就是實際使用者ID,進而可以看到這三者是相等的。

對于設定了設定使用者/組ID位的檔案

對應的程序的有效使用者ID等于檔案所有者使用者ID,是以儲存的設定使用者ID便是檔案的所有者使用者ID,此時程序的有效使用者ID和儲存的設定使用者ID相等,與程序的實際使用者ID不等。

當程序儲存了設定使用者ID後,就可以在其生命周期中的合适的場景下,進行有效使用者和儲存的設定使用者權限之間的切換,這有助于保證程序不會因在全部時間内都保持額外的權限而造成的可能的安全問題。