訪問限制

訪問限制
許多操做系統都遵循基於一個列表給用戶分配權限。稱爲訪問控制列表(Access Control List),其主要基裏就是定義作什麼。拿Unix,來講,一個用戶列在了/etc/passwd/etc/group中的一個用戶羣組裏,這個組被授予了執行某一程序、寫一些文件、刪除一些目錄的權限。在Windows系統中,也存在相同的訪問控制。用戶分到預先設定的組裏,相應的具備某些特定的權限(AdministratorsPower UsersBackup OperatorsGuests等等)。其中一些組如Administrators(管理員)組及Power Users組能夠在系統上安裝軟件,關閉或重啓計算機等權限。人其餘的一些組諸如Guests(來賓)組,就只有很是有限的權限,只能運行特定的程序。這都很是好,但有時,由於一些難以拒絕的理由,用戶須要臨時使用較日常更高的權限。典型的如,一個用戶能夠經過su命令或run as回到管理員登陸狀態(分別對應Unix/LinuxWindows),可是這些方法缺乏應該有的安全特性。
在現實生活中也有相似的狀況,例如,在安裝某些電線的時候,施工的工程師們須要進入配電間。合理的程序應該是這樣的:把進入者的相關信息記錄下來,名字、單位等等,頗有可能,還會被要求出示某種證件或徽章,只有被承認了,才能夠進入配電間。而且在認證後通過一段時間,必需要交回證件,否則的話就會過時。
sudo命令的工做原理幾乎和這個過程同樣。開始先把用戶加入權限列表,這就說明該用戶具備了一些附加權限(用戶被加入/etc/sudoers文件中,認證用戶),給該用戶一個憑證(輸入用戶本身的口令,不要輸入root口令),不樣該用戶就被賦予了一個臨時令牌,但在通過一段時間後(默認爲5分鐘)就會過時。該用戶的任何行爲會被記入日誌(經過syslog或其餘類型的日誌),這樣就能夠進入只有管理員才能進入的房間了(程序)。
sudo
sudo在幾乎全部類Unix系統上都獲得支持,大部分管理員至少都比較熟悉該命令。在sudo的時候,用戶並非真正使用root帳戶的UID來運行某個程序,而只是經過sudo進程以root身份運行程序。這與典型的su命令不一樣,該命令直接改變了用戶的UID。這聽起來差異不大,可是對於本篇文字來講卻頗有用。第一是日誌,默認狀況下,sudosyslog中記錄了全部usage和命令行。第二是訪問控制,能夠經過配置sudo,而只讓用戶在提高權限後使用一部分命令。第三是生效時間,su將用戶改變成爲root以後,運行因此一切程序都是rootUID;而sudo只是在運行sudo命令以後的程序時是root的身份。
遺憾的是,大多數管理員沒有時間來學習如何把sudo命令配置好。理想狀況下,應該嚴格限制不但願運行的程序,達到即便運行了sudo提高了權限,也不能運行。例如,管理員須要添加、編輯、刪除用戶、修改用戶權限、啓動和中止重要進程甚至殺掉進程。即便用戶僅僅管理本身的桌面,通常只須要以普通帳戶的身份登陸,只有在須要的時候,才提高本身的權限。AppleMac OS X系統在默認狀況下就是這樣,真正作到了不能以root帳戶直接登陸到系統,除非對netinfo數據庫進行了修改。是有可管理的功能均可以經過更爲平滑的sudo接口實現(惋惜是專有的)。固然Ubuntu也是這樣。
即便已經使用過了sudo,我相信對於大多數系統的/etc/sudoers文件看起來以下所示:
User privilege specification
root       ALL=(ALL)  ALL
gibson     ALL=(ALL)  ALL
# Uncomment to allow people in group wheel to run all commands
%wheel     ALL=(ALL)     ALL
%admins    ALL=(ALL)     ALL
上例中,最好不要簡單地把root權限交給gibson,但這是出於安全考慮。這裏的明顯的意圖是賦予gibson運行命令的權限,可是這樣作卻留下了巨大的安全隱患。例如,gibson只要運行sudo passwd root命令就能夠隨意改變root口令。或者,gibson可使用sudo啓動一個shell,並使用sudo /bin/bash命令繞開sudo的日誌記錄。因此合理的狀況是gibson須要提高權限才能運行某些程序,而且嚴格限定這些程序的範圍。
下面是一個/etc/sudoers文件的範例,它解決了上述問題。把管理員改變一個別名,而且經過讓用戶以!字符開頭運行命令,從而使sudosu不能提高系統shell的權限。而後,配置sudo,以使管理員能夠修改用戶數據庫,而且在的狀況下殺掉進程。
User privilege specification
root        ALL=(ALL)   ALL
 
Cmnd_Alias  SHELL=/bin/bash,/bin/csh,/bin/sh,/usr/bin/bash
Cmnd_Alias  PROGRAMS=/usr/sbin/useradd,/usr/sbin/userdel,/usr/sbin/usermod
User_Alias  ADMINS=gibson,eric,Stephen
ADMINS      ALL=!/user/bin/su,!SHELL,PROGRAMS,/bin/kill
下面還有一個例子,增長了一些限制,但賦予了用戶 gibson /bin,/sbin/user/bin /usr/sbin 目錄下提高權限的能力,腳本一般的寫法以下所示:
User privilege specification
root        ALL=(ALL)   ALL
 
Cmnd_Alias  SHELL=/bin/bash,/bin/csh,/bin/sh,/usr/bin/bash
Cmnd_Alias  PATH=/bin/,/sbin/,/usr/bin/,/usr/sbin/
 
# Custom admin program, does remote shutdown, backups, restores,etc.
Cmnd_Alias  ADMINCMDS=/usr/local/sbin/administration.pl
Cmnd_Alias  DANGEROUS=/usr/bin/passwd,/bin/su
 
gibson      ALL=PATHS,ADMINCMDS,!SHELL,!DANGEROUS
特別注意一下對於gibson可以運行哪些程序的限定,這條配置很重要,由於這裏的規則是按照從左到右的順序的。假如配置是這樣的:!SHELL,!DANGEROUS,PATH;那麼sudo會容許gibson運行passwd命令,這就達不到原先的目的了。根據配置sudo規則的複雜程度,一般把容許作的放在前面,把不容許作的寫在後面,這樣產生的結果會比較好。
相關文章
相關標籤/搜索