每個程序都擁有真實的使用者、組(uid、gid),有效的使用者、組(euid、egid),儲存的設定使用者、組(suid、sgid),還有linux中專門用於檔案儲存訪問的使用者、組id(fsuid、fsgid對於unix系統沒有這兩個fields)。現說明程序中每種型別使用者的功能:
(1)真實的使用者、組(uid、gid):程序的真正所有者。每當使用者在shell終端登入時,都會將登入使用者作為登入程序的真正所有者。通過getuid來獲得程序的真正使用者所有者,修改程序的真正使用者所有者可以通過setuid、seteuid、setresuid、setreuid。
(2)有效的使用者、組(euid、egid):程序的有效使用者、組。程序所執行各種操作所允許的許可權(process credentials)是依據程序的有效使用者來判斷的,(在linux系統中(核心2.4以上)又引入了乙個新的程序許可權管理模型process capabilities,通過process capabilities來確定程序所允許的各種操作[可參看《深入理解linux核心》table 20-3])。通過geteuid來獲得程序的有效使用者,修改程序的有效使用者可以通過setuid、seteuid、setresuid、setreuid、seteuid。
(3)檔案系統的使用者、組(fsuid、fsgid):用於進行檔案訪問的使用者、組,這是linux系統中新引入的一類使用者、組,對於unix系統檔案的訪問是通過euid來判斷,沒有函式獲得程序的fsuid,用於修改有效使用者的函式都會同時修改fsuid,如果要單獨修改fsuid,而不修改euid,可以呼叫setfsuid。
(4)儲存的設定使用者、組(suid、sgid):儲存的設定使用者、組。程序中該型別的使用者、組主要的用處是用於還原有效使用者,觀察到對於非超級使用者用於修改有效使用者的各個函式setuid、seteuid、setresuid、setreuid、seteuid普遍有乙個前提條件就是如果修改後的有效使用者是原先的suid則允許修改,利用這一點,程序可以修改有效使用者到乙個新使用者,然後還原到原來的值(原來的值儲存在儲存設定的使用者)。通過getresuid來獲得程序的真實使用者、有效使用者、儲存的設定使用者。
setuid(e)
setresuid(r,e,s)
setreuid(r,e)
setfsuid(f)
seteuid(e)
field
euid=0
euid!=0
euid=0
euid!=0
euid=0
euid!=0
euid=0
euid!=0
euid=0
euid!=0
uide不變r
r( r必須為原先的uid或euid或suid)
rr( r必須為原先的uid或euid)
不變不變
不變不變
euid
ee(e必須為原先的uid或euid或suid)
ee( e必須為原先的uid或euid或suid)
ee(e必須為原先的uid或euid或suid)
不變不變
ee(e必須為原先的uid或euid或suid)
fsuid
ee(e必須為原先的uid或euid或suid)
ee( e必須為原先的uid或euid或suid)
ee(e必須為原先的uid或euid或suid)
ff(f必須為原先的uid或euid或suid或fsuid)
ee(e必須為原先的uid或euid或suid)
suide不變
ss( s必須為原先的uid或euid或suid)
ee(e必須為原先的uid或euid或suid)
不變不變
不變不變
當s這個標誌出現在檔案擁有者的x 許可權上時,例如剛剛提到的/usr/bin/passwd這個檔案的許可權狀態:『-rwsr-xr-x』,此時就被稱為set uid,簡稱為suid的特殊許可權。 那麼suid的許可權對於乙個檔案的特殊功能是什麼呢?基本上suid有這樣的限制與功能:
講這麼硬的東西你可能對於 suid 還是沒有概念,沒關係,我們舉個例子來說明好了。 我們的 linux 系統中,所有賬號的密碼都記錄在 /etc/shadow 這個檔案裡面,這個檔案的許可權為:『-r-------- 1 root root』,意思是這個檔案僅有root可讀且僅有root可以強制寫入而已。既然這個檔案僅有 root 可以修改,那麼mine 這個一般賬號使用者能否自行修改自己的密碼呢?你可以使用你自己的賬號輸入『
passwd』這個指令來看看,嘿嘿!一般使用者當然可以修改自己的密碼了!
/etc/shadow
就不能讓 mine 這個一般賬戶去訪問的,為什麼 mine 還能夠修改這個檔案內的密碼呢?這就是suid的功能啦!藉由上述的功能說明,我們可以知道
mine
對於 /usr/bin/passwd 這個程式來說是具有 x 許可權的,表示 mine 能執行 passwd;
passwd
的擁有者是 root 這個賬號;
mine
執行 passwd 的過程中,會『暫時』獲得 root 的許可權;
/etc/shadow
就可以被 mine 所執行的 passwd 所修改。
但如果mine 使用cat去讀取/etc/shadow 時,他能夠讀取嗎?因為cat不具有suid 的許可權,所以 mine 執行 『cat /etc/shadow』 時,是不能讀取/etc/shadow的。我們用一張示意圖來說明如下:
圖4.4.1、suid程式執行的過程示意圖
當s標誌在檔案擁有者的x 專案為suid,那s在群組的x 時則稱為set gid, sgid囉!是這樣沒錯!舉例來說,你可以用底下的指令來觀察到具有sgid 許可權的檔案喔:
[root@www ~]# /usr/bin/locate
-rwx--s--x 1 root slocate 23856 mar 152008 /usr/bin/locate
與suid不同的是,sgid 可以針對檔案或目錄來設定!如果是對檔案來說,sgid有如下的功能:
舉例來說,上面的/usr/bin/locate這個程式可以去搜尋/var/lib/mlocate/mlocate.db 這個檔案的內容(詳細說明會在下節講述),mlocate.db的許可權如下:
[root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x 1 root slocate23856 mar 152008 /usr/bin/locate
-rw-r----- 1 root slocate 3175776 sep 28 04:02 /var/lib/mlocate/mlocate.db
linux中程序的狀態
1.使用命令 top c 來檢視程序狀態 redhat localhost top c r工作中的程序 s可中斷的睡眠狀態 i空閒狀態 idle o程序正在處理器執行 b程序正在等待更多的記憶體頁 d不可中斷的睡眠狀態 t暫停狀態或跟蹤狀態 x出狀態,程序即將被銷毀 z殭屍程序1 task runn...
linux系統中程序的建立
linux系統的程序建立時區別於其他的系統的,它並沒有提供spawn機制。而是把乙個程序的建立分成了兩步 fork和exec 先建立乙個程序,再讓子程序執行新的程式。首先系統呼叫fork 函式,若呼叫成功則產生乙個新的程序,值的一提的是該函式會產生兩個返回值。當父程序呼叫的時候返回0,子程序呼叫的時...
Linux中程序的通訊方式
linux下程序通訊的八種方法 管道 pipe 命名管道 fifo 訊息佇列 message queue 共享記憶體 shared memory 訊號量 semaphore 訊號 signal 套接字 socket 1 管道 pipe 管道允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊 2 命...