本文前一部分介紹了用戶管理基本操作的內容,下面我們一起來繼續探討有關用戶管理的高級內容。
◆超級用戶權限與授權
●建立多個超級用戶
不少新系統管理員認為root用戶是唯一的超級用戶,其實root只是系統默認的超級用戶的名稱,root並非因為它叫root而成為超級用戶的。隨便打開一個/etc/passwd文件的例子,你就會發現如下幾行:
root:asiewhgYfaoO/J:0:0:root:/root:/bin/tcsh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
lanf:Yuao56Ioyefg:0:0:bluewind:/home/bluewind:/bin/bash
jake:gUyfaiIodashfj:501:501:jake cheng:/home/jake:/bin/tcsh
apache:!!:502:502::/usr/local/apache:/bin/false
可以看到,root的UID和GID都被設置為0了。實際上,超級用戶的充要條件就是UID和GID都等於0。也就是說,任何用戶,只要它的UID和GID都為0,就與常被稱為root超級用戶沒有什麼兩樣了。比如上面那個例子裡面的lanf,也是一個超級用戶。
所以,可以將任何普通用戶變成超級用戶。但是,這樣做並沒有好處,很多時候這都會增加系統的隱患。除非在組織中需要多個系統管理員管理同一個系統,這就需要有多個超級用戶帳號。這有利於各個管理員明確責任,通過日志知道不同的人分別做過什麼事。
還有一種情況,也可能出現多個超級用戶帳號,那就是黑客入侵後設置一個看起來象普通帳號的用戶,卻修改了UID和GID使之為0。這樣根本就不需要知道 root用戶密碼,就可以執行超級用戶權限了。而從我們的系統管理員的一方來說,我們不可能時刻注意passwd文件的變化的,沒有那個時間也沒有那個精力。這時只好編寫一個腳本來幫助監視,例如:
/bin/grep ‘0:0’ /etc/passwd awk ‘BEGIN{FS=”:”}{print $1}’mail –s “`date +”%D%T”`”root
這是一個很小的腳本程序,使用了一些常規的命令來查看/etc/passwd文件,把UID和GID為0的行寄給root用戶。把這個腳本放在/etc/cron.daily文件中讓cron運行,root將每天收到一封信,報告當前的超級用戶。
實際上,由於PAM(可插入驗證模塊)的限制,在telnet上是不允許超級用戶登入的,也就是說,黑客修改了自己的UID和GID後,想再次登陸從而獲得超級用戶的權限的話,不修改/etc/seuretty文件是不可能的——除非你傻到自己添加了偽TTY設備ROOT用戶登陸權限。一般可以讓超級用戶先用普通用戶帳號登陸,再su(su命令相關內容請參考本站命令查詢部分)。
●為普通用戶分配特權
使用sudo 命令可以允許普通用戶執行超級用戶才能執行的命令。無論是基於信任的建立需要時間,還是基於是否存在這種必要,我們都不會把超級用戶的所有權限輕易許人的。這是網管工作的原則。所以,當一些用戶必須訪問某些內容時,我們可以配置sudo以允許單獨的普通用戶運行特權命令。
sudo命令允許已經在/etc/sudoers文件中指定的用戶運行超級用戶命令。例如,一個已經獲得許可的普通用戶可以運行:
sudo vi /etc/passwd
實際上,sudo的配置完全可以讓我們指定某個列入/etc/sudoers文件的普通用戶可以做什麼、不可以做什麼。/etc/sudoers的配置行如下:
> 空行或注釋行(以#字符打頭):無用行。
> 可選的主機別名行:用來創建主機列表的簡稱。必須以Host_Alias關鍵詞開頭,列表中的主機必須用逗號隔開。例如:
Host_Alias REDHAT=binbu,qd
其中binbu和qd是倆主機名,你可以用REDHAT(別名)統稱它們。
>可選的用戶別名行:用來創建用戶列表的簡稱。用戶別名行必須以User_Alias關鍵詞開頭,列表中的用戶名必須以逗號隔開。其格式同主機別名行。
>可選的命令別名行:用來創建命令列表的簡稱。必須以Cmnd_alias開頭,列表中的命令必須用逗號隔開。
>可選的運行方式別名行:也是用來創建用戶列表的簡稱。不同的是,使用這樣的別名可以告訴sudo程序以列表中某一用戶的身份來運行程序。
>必要的用戶訪問說明行:用戶訪問的說明語法如下:
user host= [run as user ] command list
在user處指定一個真正的用戶名或定義過的別名,同樣的,host也可以是一個真正的主機名或者定義過的主機別名。默認情況下,sudo執行的所有命令都是以root身份執行。如果你想使用其他身份可以指定。至於command list可以是以逗號分隔的命令列表,也可以是一個已經定義過的別名。例如:
lanf binbu=/sbin/shutdown
這一句說明lanf可以在binbu主機上運行關機命令。
注意:
1、可以在一行定義多個別名,中間用:隔開。
2、可以在命令或命令別名之前加上!號,使該命令或命令別名無效。
3、有兩個關鍵詞:ALL 和NOPASSWD。ALL意味著“所有文件”(所有主機或所有命令),NOPASSWD意味著不用密碼。
下面是一個sudoers文件的例子:
#sudoers files
#User alias specification
User_Alias ADMIN=yourid:POWERUSER=hisid,herid
#user privilege specification
ADMIN ALL=ALL
POWERUSER ALL=ALL,!/bin/su
第三行定義了兩個別名ADMIN和POWERUSER,第五行說明在所有主機上ADMIN都可以以root身份執行所有命令。第六行給POWERUSER除了運行su命令外同等ADMIN的權限。