1. 程式人生 > >Linux賦予普通使用者特殊許可權(SUDO)

Linux賦予普通使用者特殊許可權(SUDO)

在Linux系統中,管理員往往不止一人,若每位管理員都用root身份進行管理工作,根本無法弄清楚誰該做什麼。所以最好的方式是:管理員建立一些普通使用者,分配一部分系統管理工作給他們。

我們不可以使用su讓他們直接變成root,因為這些使用者都必須知道root的密碼,這種方法很不安全,而且也不符合我們的分工需求。一般的做法是利用許可權的設定,依工作性質分類,讓特殊身份的使用者成為同一個工作組,並設定工作組許可權。例如:要wwwadm這位使用者負責管理網站資料,一般Apache Web Server的程序httpd的所有者是www,您可以設定使用者wwwadm與www為同一工作組,並設定Apache預設存放網頁目錄 /usr/local/httpd/htdocs的工作組許可權為可讀、可寫、可執行,這樣屬於此工作組的每位使用者就可以進行網頁的管理了。

但這並不是最好的解決辦法,例如管理員想授予一個普通使用者關機的許可權,這時使用上述的辦法就不是很理想。這時您也許會想,我只讓這個使用者可以以 root身份執行shutdown命令就行了。完全沒錯,可惜在通常的Linux系統中無法實現這一功能,不過已經有了工具可以實現這樣的功能—— sudo。

sudo通過維護一個特權到使用者名稱對映的資料庫將特權分配給不同的使用者,這些特權可由資料庫中所列的一些不同的命令來識別。為了獲得某一特權項,有資格的使用者只需簡單地在命令列輸入sudo與命令名之後,按照提示再次輸入口令(使用者自己的口令,不是root使用者口令)。例如,sudo允許普通使用者格式化磁碟,但是卻沒有賦予其他的root使用者特權。

[b]1、sudo工具[/b]由檔案/etc/sudoers進行配置,該檔案包含所有可以訪問sudo工具的使用者列表並定義了他們的特權。一個典型的/etc/sudoers條目如下:

程式碼:

liming ALL=(ALL) ALL

這個條目使得使用者liming作為超級使用者訪問所有應用程式,如使用者liming需要作為超級使用者執行命令,他只需簡單地在命令前加上字首sudo。因此,要以root使用者的身份執行命令format,liming可以輸入如下命令:

程式碼:

# sudo /usr/sbin/useradd sam

注意:命令要寫絕對路徑,/usr/sbin預設不在普通使用者的搜尋路徑中,或者加入此路徑:PATH=$PATH:/usr/sbin;export PATH。另外,不同系統命令的路徑不盡相同,可以使用命令“whereis 命令名”來查詢其路徑。

這時會顯示下面的輸出結果:

程式碼:

We trust you have received the usual lecture from the local System

Administrator. It usually boils down to these two things:

#1) Respect the privacy of others.

#2) Think before you type.

Password:

如果liming正確地輸入了口令,命令useradd將會以root使用者身份執行。

注意:配置檔案/etc/sudoers必須使用命令 Visudo來編輯。

只要把相應的使用者名稱、主機名和許可的命令列表以標準的格式加入到檔案/etc/sudoers,並儲存就可以生效,再看一個例子。

[b]2、例子:[/b]管理員需要允許gem使用者在主機sun上執行reboot和shutdown命令,在/etc/sudoers中加入:

程式碼:

gem sun=/usr/sbin/reboot,/usr/sbin/shutdown  

注意:命令一定要使用絕對路徑,以避免其他目錄的同名命令被執行,從而造成安全隱患。

然後儲存退出,gem使用者想執行reboot命令時,只要在提示符下執行下列命令:

程式碼:

$ sudo /usr/sbin/reboot

輸入正確的密碼,就可以重啟伺服器了。

如果您想對一組使用者進行定義,可以在組名前加上%,對其進行設定,如:

程式碼:

%cuug ALL=(ALL) ALL

[b]3、另外[/b],還可以利用別名來簡化配置檔案。別名類似組的概念,有使用者別名、主機別名和命令別名。多個使用者可以首先用一個別名來定義,然後在規定他們可以執行什麼命令的時候使用別名就可以了,這個配置對所有使用者都生效。主機別名和命令別名也是如此。注意使用前先要在/etc/sudoers中定義: User_Alias, Host_Alias, Cmnd_Alias項,在其後面加入相應的名稱,也以逗號分隔開就可以了,舉例如下:

程式碼:

Host_Alias SERVER=no1

User_Alias ADMINS=liming,gem

Cmnd_Alias SHUTDOWN=/usr/sbin/halt,/usr/sbin/shutdown,/usr/sbin/reboot

ADMINS SERVER=SHUTDOWN

[b]4、再看這個例子[/b]:

程式碼:

ADMINS ALL=(ALL) NOPASSWD: ALL

表示允許ADMINS不用口令執行一切操作,其中“NOPASSWD:”項定義了使用者執行操作時不需要輸入口令。

[b]5、sudo命令[/b]還可以加上一些引數,完成一些輔助的功能,如

程式碼:

$ sudo –l

會顯示出類似這樣的資訊:

程式碼:

User liming may run the following commands on this host:

(root) /usr/sbin/reboot

說明root允許使用者liming執行/usr/sbin/reboot命令。這個引數可以使使用者檢視自己目前可以在sudo中執行哪些命令。

[b]6、在命令[/b]提示符下鍵入sudo命令會列出所有引數,其他一些引數如下:

程式碼:

-V 顯示版本編號。

-h 顯示sudo命令的使用引數。

-v 因為sudo在第一次執行時或是在N分鐘內沒有執行(N預設為5)會詢問密碼。這個引數是重新做一次確認,如果超過N分鐘,也會問密碼。

-k 將會強迫使用者在下一次執行sudo時詢問密碼(不論有沒有超過N分鐘)。

-b 將要執行的命令放在背景執行。

-p prompt 可以更改問密碼的提示語,其中%u會替換為使用者的賬號名稱,%h會顯示主機名稱。

-u username/#uid 不加此引數,代表要以root的身份執行命令,而加了此引數,可以以username的身份執行命令(#uid為該username的UID)。

-s 執行環境變數中的 SHELL 所指定的 Shell ,或是 /etc/passwd 裡所指定的 Shell。

-H 將環境變數中的HOME(宿主目錄)指定為要變更身份的使用者的宿主目錄。(如不加-u引數就是系統管理者root。)

要以系統管理者身份(或以-u更改為其他人)執行的命令。