FreeBSD程式的許可權(轉)

gugu99發表於2007-08-11
FreeBSD程式的許可權(轉)[@more@]

  由於FreeBSD是多使用者系統,因此程式必須要受到許可權的控制和保護。出於安全性的考慮,一個使用者不可能殺死其他使用者啟動的程式,一個程式也不能非法存取其他使用者的檔案資料。只有超級使用者和超級使用者啟動的程式才有最大的許可權,普通程式就只與程式的執行者相關,只具有這個使用者的許可權。

  一些情況下(特別是執行系統維護任務時),要求普通使用者也能完成特殊許可權的任務,那麼就必須在程式執行過程中改變程式的身份。改變程式的身份則必須同時具備兩個要求:程式檔案本身具有SetUID或SetGID屬性,同時程式中需要相應呼叫setuid()或setgid()系統呼叫,這兩個系統呼叫能夠檢查檔案的屬性,並完成更改程式許可權的操作。

  通常只有系統程式才需要利用這兩個屬性,例如系統程式su允許普通使用者成為root使用者,就使用的是這個能力。

$ ls -l a*

-rwxr-xr-x  1 user wheel 3212 Dec 4 12:36 a1

-rwxr-xr-x  1 user wheel 3212 Dec 4 12:36 a2

$ chmod u+s a1

$ ls -l a*

-rwsr-xr-x  1 user wheel 3212 Dec 4 12:36 a1

-rwxr-xr-x  1 user wheel 3212 Dec 4 12:36 a2

$ chmod g+s a2

$ ls -l a*

-rwsr-xr-x  1 user wheel 3212 Dec 4 12:36 a1

-rwxr-sr-x  1 user wheel 3212 Dec 4 12:36 a2

  上面第一個chmod(chmod u+s a.out)為a.out增加設定屬主身份許可權,然後列表中對應屬主的執行許可權位的 “x” 標誌將改變為 “s” (檔案屬性顯示為rwsr-xr-x)。第二個c hmod (chmod g+s a.out)為a.out增加設定組身份許可權,則列表中對應組的執行許可權位的 “x ” 標誌將改變為 “s” (檔案屬性顯示為rwxr-sr-x)。同樣,SetUID和SetGID 屬性也都有相應的八進位制表示方式,SetUID為04000,後面的三個八進位制位屬於檔案的讀寫訪問屬性設定,相應S etGID為02000,它們兩個屬性位處於讀寫屬性位之前。下面是一個更改屬性設定的例子:

# ls -l /bin/ps

-r-xr-sr-x 1 bin kmem 163840 May 6 06:02 /bin/ps

# chmod a=r /bin/ps

# su user

$ ps

bash: ps: Permission denied

$ ^D

# chmod a+x /bin/ps

# su user

$ ps

ps: /dev/mem: Permission denied

$ ^D

# chmod g+s /bin/ps

# su user

$ ps

 PID TT STAT   TIME COMMAND

 226 p2 S   0:00.56 bash

 239 p2 R+   0:00.02 ps

$

  第一次以user身份執行ps時,ps的檔案屬性被改為對所有使用者只有讀許可權,因此不能執行,shell報告 Permission denied;第二次以user身份執行ps時,ps報告不能開啟/dev/mem檔案,這是因為普通使用者無權存取記憶體映象檔案。而第三次執行ps時,由於設定了setgid位,和kmem同組的程式就能夠開啟 /dev/mem檔案,從而正確執行了ps程式。

  具有SetUID或SetGID屬性的程式,能夠在程式執行中呼叫系統呼叫setuid()或setgid() ,呼叫成功後這個程式就具有了程式檔案屬主和組的許可權,就可以完成以前改變身份之前不能完成的任務。因為透過它們程式可以改變程式的使用者標識,繞過系統的許可權設定,因此這兩個屬性對於系統安全非常重要。尤其是屬於root的檔案,並設定了SetUID屬性的程式,更是系統安全中值得注意的地方。為了保證系統安全,必須保證沒有非法的SetUID或 SetGID程式的存在,通常管理員可以使用find命令來完成這個任務,例如查詢具有SetUID的程式,則執行:

# find / -perm 4000 -print

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944755/,如需轉載,請註明出處,否則將追究法律責任。

相關文章