在實際工作中,Unix系統工程師可能需要將一些本來應該是root用戶才能夠運行的一些命令程序下放給普通的用戶進行執行。如 passwd命令,默認情況下只有root管理員才能夠修改用戶帳戶的密碼。不過系統工程師更喜歡用戶自己來修改密碼。如此的話,用戶自己的密碼只有自己知道,可能更加的安全。當用戶忘記了自己的密碼之後,系統工程再利用root帳戶的權限去初始化用戶的密碼。在Windows系統中,這個功能可以輕而易舉的實現。不過在Unix系統中,實現起來就沒有這麼容易了。在這篇文章中,筆者就跟大家討論一下這個話題。
一、有效的UID與真實的UID。
當系統管理員在shell環境中運行passwd命令時,shell首先會創建另一個shell進程。新創建的shell進程映像將載入 passwd可執行映像並覆蓋自己的映像,passwd進程就開始運行。當一個進程被創建之後,passwd進程會從shell父進程中繼承大部分的屬性。跟今天這個話題有關的屬性主要有兩個。一是進程真實的UID。這個屬性與程序文件有關。這個參數代表了運行這個進程的用戶(而非程序文件)的UID,通常情況下這個參數保存在/etc/passwd中與用戶有關的記錄中。二是進程有效的UID。這個參數其實就表示程序文件的所有者,即誰能夠執行這個命令。通常情況下,進程的有效UID與真實UID是相同的。但是當非root用戶運行passwd命令時,他們就會不同。
二、PASSWD文件的特殊性。
在講解如何實現將root帳戶的權限下放給其他用戶之前,筆者要先給大家介紹一下passwd這個命令文件跟其他文件的不同。如下圖所示,系統管理員可以運行圖中所示的命令,來查看passwd程序文件與其它程序文件(如vi)的不同。
對比以上兩個文件的屬性,大家會發現在passwd文件裡的一個權限位上標有s這個特殊的字符。這個參數就被稱為屬主身份設置位,英文簡稱為 SUID,它可以用來改變一般用戶的權限模式。當非root用戶執行passwd更改自己帳戶的名字時,真實的UID就是這個用戶自己的UID,即運行這個程序的用戶。但是有效的UID則不是。有效的UID是root用戶,即這個程序文件的所有者。通常情況下,進程或者命令的存取、運行權限不是由真是 UID而是有有效UID決定的,故如果沒有這個s這個特殊屬主身份設置時,其他用戶將無法使用這個命令。而現在其他用戶也可以利用passwd命令來更改自己的命令,可見這個屬主身份設置位可以改變一般用戶的權限模式,可以將本來只有root帳戶才能夠運行的進程下放給其他用戶運行。
三、臨時權限SUID。
將本來只有root帳戶才能夠運行的進程下放給其他用戶運行,有專家就把這種權限的轉移叫做臨時權限SUID。大部分的Unix系統都有這麼一個特殊的權限設置模式,允許用戶更新一些敏感的系統文件。往往在這些文件的用戶權限組裡面有一個特殊的字母s,就代表一種特殊的模式,即屬主身份設置位。利用這種模式系統工程師可以讓進程暫時擁有文件所有者的特權。因此當一個非特權用戶執行passwd命令時,進城有效的UID並不是用戶真實的UID。 Passwd命令真是利用這個特性讓其他非特權用戶可以執行這個passwd命令。Passwd命令默認情況下系統就允許其他非特權用戶運行。但是其他一些系統維護命令,如網絡配置文件則不是。如果系統工程師要把網絡維護的工作分配給他人,就需要借鑒passwd的配置,將網絡配置文件的修改權限下放給其他用戶。
四、臨時權限的設置。
正如上面所說的,默認情況下只有少數的只有root用戶才能夠執行的命令其他用戶也可以執行。如果在日常工作中,系統工程師希望其他用戶也能夠執行root權限才能夠執行的命令,則系統管理員需要進行額外的配置。這個配置也比較簡單,就是跟passwd命令文件一樣,也在需要配置的文件權限組中加入s屬主設置位即可。
通常情況下,Unix操作系統可以利用兩種方式來添加這個S屬主設置位,即相對模式與絕對模式。不過需要注意的是,無論是采取哪種模式,都必須以root帳戶來執行。如果是采用相對模式,則特權用戶可以利用chmod命令修改文件的屬主設置位,即添加s來設置這個權限。如果系統工程師通過全隊方式來設置臨時權限,則只需要在權限的八進制數前面加入一個4即可。如原來用戶的權限八進制數為775(所有者具有讀修改執行權限、同組其他用戶具有讀修改執行權限、其他用戶具有讀與修改權限),則要實現臨時權限SUID的話,只需要在775前面加入4變為4775即可。不過筆者建議,還是采用相對模式為好。因為相對模式設置起來相對簡單,而且還不容易出錯。
五、臨時權限的安全隱患。
臨時權限SUID機制雖然可以滿足一些日常工作的需要,但是這個機制存在著一定的安全風險。如特權用戶將shutdown這個關機命令權限賦予給其他用戶的話,則就存在著一定的安全隱患。因為Unix操作系統是一個多用戶的操作系統,在同一個時刻允許多個用戶登錄到操作系統中。如果每個用戶都可以使用shutdown命令進行關機的話,而此時其他用戶可能正在編輯一個文件或者進行其他操作,則此時就會影響其他用戶的正常作業。故對於這些具有臨時權限的SUID程序文件系統工程師需要給與特殊的關注。臨時權限SUID讓用戶通過運行一個root用戶的文件來擁有本來不具有的權限。作為一個合格的系統工程師,必須跟中所有屬於root用戶的SUID程序,這些程序有可能被普通用戶用來創建文件或者復制文件。
為了保證這個臨時權限SUID措施在給系統維護帶來方便的同時,不影響Unix系統的安全,筆者有如下兩個建議。
一是不要隨便通過設置SUID(屬主設置位)的方式讓普通用戶通過運行一個root用戶的文件來擁有本來不具有的權限。特別是一些對所有用戶都具有影響的命令文件,更加要謹慎。如對於shutdown這中對系統當前登錄帳戶都會造成不利影響的命令文件,還是掌握在特權用戶一個人手中為好。不然的話,因為一個普通用戶的不恰當操作,而給其他用戶造成不利的影響,那系統工程師就是得不償失了。故筆者建議,系統工程師這個權限的關口還是要把握住的,不要因為貪圖方便而隨便把權限下放給其他用戶。這是一個很危險的操作。
二是在日常工作中要時常跟蹤一下這些文件。如可以利用find命令來查找系統中到底有多少這些文件。利用find命令如果發現顯示的權限屬性裡多了一位八進制數4則表示這文件設置了臨時權限suid,unix系統會將4前面的-符號當作其他的任意權限。筆者在這裡跟大家分享一個很好的工作技巧。系統工程師可以利用cron等任務調度命令,每隔一段時間運行一次find命令。並把這個命令的結果通過電子郵件發送給系統工程師。如此的話,系統工程師就可以省去每次手工運行這個命令的麻煩事,又可以實時的追蹤這些特殊的文件。一舉兩得,即可以偷懶,又不會誤事。
總之,通過設置臨時權限SUID,系統工程師確實可以減少很多系統維護的工作量。如用戶需要更改密碼等等類似的簡單工作,就不需要找系統工程師來完成了。但是,系統工程師對於這個臨時權限SUID可能帶來的安全隱患仍然要深記與心。