1. 程式人生 > >Linux系統程式設計手冊第9章-程序憑證

Linux系統程式設計手冊第9章-程序憑證

1.各個程序的各種ID,稱為程序憑證。如UID,GID等。具體有實際使用者ID(real user ID), 實際組ID(real group ID),有效使用者ID(effective user ID),有效組ID(effective group ID),儲存的set-user-ID和set-group-ID,檔案系統使用者ID和檔案系統組ID,輔助組ID。
2.實際使用者id和實際組id:
這兩個ID確定了程序所屬的使用者和組。當用戶登入時,會從/etc/passwd檔案中讀取UID和GID作為實際使用者ID和組ID,後續建立的程序都從父程序處繼承real UID和real GID。
3.有效使用者ID和有效組ID:
程序嘗試訪問各種資源時,系統會依據有效使用者ID和有效組ID來確定授予該程序的許可權。一般有效ID等實際ID,但會有一些操作導致這兩種不一樣。後面主要介紹這些操作。
4.set-user-id 和 set-group-id程式
set-user-id程式可以將程序的有效id修改為檔案屬主的ID,從而獲得常規情況下並不具有的許可權。set-group-id實現同樣的功能。比如sudo就可以暫時獲得root的許可權。
可以使用chmod命令來設定許可權位,

$ chmod u+s prog
$ chmod g+s prog
$ ls -l prog
-rwsr-sr-x

可以發現設定set-user-id後,x標誌位別替換為s,當執行set-user-id程序時,核心會將該程序的UID設定為該檔案屬主的UID,則該程序擁有了對該檔案的所有許可權。同樣推理可知,如果一個檔案的屬主為root,並且該檔案可以設定set-user-id,則某個程序呼叫set-user-id時,核心就會將該程序的有效ID設定為0(root),則該程序暫時取得了root許可權。注意修改的是程序的ID,不是檔案的ID。這個功能非常強大,也帶來了很大的風險,38章總結了一套良好的程式設計習慣,可以參考。
5.儲存set-user-id 和儲存set-group-id.
當set-user-id時,會發生如下步驟:
1.若可執行檔案的set-user-id許可權位已開,則將程序的有效使用者ID設定為檔案的屬主ID,若沒開啟,則程序的有效ID保持不變。
2.儲存set-user-id和儲存set-group-id的值由對應的有效ID複製而來,無論正在執行的檔案是否設定了set-user-id,複製都會進行。
舉例說明:
假設某程序的實際id,有效id,儲存的set-user-id都為1000,當其執行了root使用者的擁有set-user-id的程式後,程序的ID會發生如下變化:
real=1000 effective=0 saved=0
有不少系統呼叫,允許將set-user-id程式的有效使用者id和實際使用者id來回切換,則saved就是為了儲存effective的副本。
6.檔案系統使用者id和組id
在linux系統中,要進行諸如開啟檔案,改變檔案屬主,修改檔案許可權之類的檔案系統操作,決定其操作許可權的是檔案系統使用者id和組id。一般檔案系統id和有效id是一致的。只有當使用linux的兩個系統呼叫setfsuid()和setfsgid()時才會不一樣。
7.獲取和修改各種id的函式可以參考P140