當您管理一部家用電腦時,使用者必須以 root 使用者或者是透過一種 setuid 程式 (如 sudo 或 su)來獲取有效的 root 權限才能執行一些系統的管理 工作。 setuid 程式可以使您以該程式擁有者的使用者 ID (UID)來執行該程式,而不是 以執行此程式的使用者。 如此的程式以一個小寫的 s 標示在長格式列表 中的擁有者部份,如以下的例子所示:
-rwsr-xr-x 1 root root 47324 May 1 08:09 /bin/su |
然而對於一間公司的系統管理員,他必須決定公司內部的使用者對他們的機器能夠有多少的管理存取權限。 藉由稱為 pam_console.so 的一個 PAM 模組,某些行為通常只保留給 root 使用者, 例如重新開機以及掛載移除式的媒體等工作僅允許在實體主控台第一個登入的使用者(請參考 Red Hat Enterprise Linux 參考手冊 一書中的 Pluggable Authentication Modules (PAM) 章節以取得關於 pam_console.so 模組的更多資訊)。 然而,例如修改網路設定、配置一個新加入的滑鼠或 掛載網路裝置等的其他重要系統管理工作,在缺少管理權限的情況下,將無法存取操作。 最終,系統管理員還是 得決定網路內部的使用者可以擁有多少管理性的存取。
假如公司內部的某些使用者是可信賴的,且屬於電腦理解能力極佳的一群,您或許可以允許他們擁有 root 的 存取權限,允許使用者的 root 存取表示例如新增裝置或設定網路介面等小事情可以由個別使用者來處理,以讓 系統管理員來處理網路安全性以及其他重要的問題。
在另一方面,給予個別使用者 root 存取也可能會導致下列的問題發生:
錯誤地配置機器設定 — 擁有 root 存取權的使用者可能會錯誤地設定他們的機器, 或者是造成更糟的情況,因此開啟了安全性的漏洞而不知情。
執行非安全的服務 — 擁有 root 存取權的使用者也許會在他們的機器上執行非安 全的服務,如 FTP 或 Telnet,當使用者名稱與密碼在網路中以明文傳輸時,將造成極大的風險。
以 root 執行電子郵件附件 — 雖然這種情況很少發生,可是還是有影響 Linux 的電子郵件病毒。 然而僅在它們是由 root 使用者執行時才會造成威脅。
假如系統管理員由於這些或其他原因,不想允許使用者登入為 root,root 密碼必須保持機密,而且必須透過 開機管理程式的密碼保護來禁止進入執行等級一或者是單一使用者模式(請參考 第 4.2.2 節 以取得關於這個主題的更多資訊)。
表格 4-1 顯示出一個系統管理員可以進一步確定 root 登入已停用的方法:
| 方法 | 說明 | 效應 | 沒有影響 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 更改 root shell。 | 編輯 /etc/passwd 檔案,並且更改 shell 從 /bin/bash 為 /sbin/nologin。 |
|
| |||||||||||||||
| 透過任何主控台裝置 (tty) 停用 root 存取。 | 一個空白的 /etc/securetty 檔案將可防止 root 登入到任何連接到電腦的裝置。 |
|
| |||||||||||||||
| 停用 root SSH 登入。 | 編輯 /etc/ssh/sshd_config 檔案,並且設定 PermitRootLogin 參數為 no。 |
|
| |||||||||||||||
| 使用 PAM 來限制 root 存取服務。 | 請編輯 /etc/pam.d/ 目錄中目標服務的檔案,請確定 pam_listfile.so 是需要用於認證的。 請參考 第 4.4.2.4 節 以取得詳細資訊。 |
|
|
表格 4-1. 停用 root 帳號的方法
如要防止使用者直接登入為 root,系統管理員可以在 /etc/passwd 檔案設定 root 帳號的 shell 為 /sbin/nologin,這將可避免透過需要 shell 之指令來存取 root 帳號,例如 su 與 ssh 指令。
![]() | 重要 |
|---|---|
不需使用 shell 的程式(如電子郵件用戶端或 sudo 指令),仍然可以存取 root 帳號。 |
如要進一步地限制存取 root 帳號,系統管理員可以編輯 /etc/securetty 檔案來停用 在主控台的 root 登入。 這個檔案列出 root 使用者允許登入的所有裝置,假如此檔案根本不存在的話,root 使用者可以透過任何系統上的通訊裝置進行登入,不管是透過主控台或是一個原生的網路介面。 這樣做是很危 險的,因為使用者可以以 root 身份 Telnet 到他的機器,再將他的密碼以明文經由網路傳送。 預設情況下, Red Hat Enterprise Linux /etc/securetty 檔案只允許 root 使用者在實體連接到機器的主控台登入,如要 防止 root 登入,請輸入下列指令來移除此檔案的內容:
echo > /etc/securetty |
![]() | 警告 |
|---|---|
一個空白的 /etc/securetty 檔案無法避免 root 使用者使用 OpenSSH 套裝工具遠端登入,因為在認證成功後,主控台才會開啟。 |
如要防止透過 SSH 協定的 root 登入,請編輯 SSH 系統程式的設定檔案 (/etc/ssh/sshd_config), 更改如下的這一行:
# PermitRootLogin yes |
為如下所示:
PermitRootLogin no |
透過 /lib/security/pam_listfile.so 模組,PAM 允許相當大的彈性用來拒絕特定的帳號。 這使得系統管理員可以指定這個模組給不允許登入的使用者清單。 以下為在 /etc/pam.d/vsftpd PAM 設定檔案中如何使用這個模組在 vsftpd FTP 伺服器的例子(假如這個指令只 有一行的話,下列例子第一行最後的 \ 符號是不 需要的):
auth required /lib/security/pam_listfile.so item=user \ sense=deny file=/etc/vsftpd.ftpusers onerr=succeed |
這將告知 PAM 模組來查詢 /etc/vsftpd.ftpusers 檔案,並且拒絕任何列出的使用者 存取這個服務,系統管理員可以;變更這個檔案的名稱,而且也可以為每一個服務保存一個不同的清單,或者是 使用一個中央的清單來拒絕存取多個服務。
假如系統管理員想要拒絕對多個服務的存取,可以增加類似的一行到 PAM 設定服務中,如用於電子郵件用戶端 的 /etc/pam.d/pop 與 /etc/pam.d/imap 檔案,或用於 SSH 用戶端的 /etc/pam.d/ssh 檔案。
如需關於 PAM 的更多資訊,請參考 Red Hat Enterprise Linux 參考手冊 一書中的 Pluggable Authentication Modules (PAM) 章節。
除了完全地限制 root 使用者的存取外,系統管理員也可以只允許透過 setuid 程式的存取,如 su 或 sudo。
在輸入 su 指令後,使用者將會被提示輸入 root 的密碼,然後在認證成功後,將可以取得 一個 root 的 shell 提示符號。
一旦透過 su 指令登入後,使用者便成為 root 使用者,並且擁有 完全的系統管理存取權限。 除此之外,一旦使用者取得 root 登入後,他們還可以使用 su 指令轉換成系統上任何的使用者,而且不需要輸入任何的密碼。
因為這個程式的功能如此強大,公司中的系統管理員也許想要限制誰可以存取使用這個指令。
最簡單的方法便是將使用者加入到稱為 wheel 的特殊管理者群組,如要如此做,請以 root 身份輸入下列指令:
usermod -G wheel <username> |
在上一個指令中,請以剛剛增加到 wheel 群組的使用者名稱取代 <username>。
如要使用 使用者管理員,請選擇面板上的 『主選單按鈕』 => 『系統設定』 => 『使用者與群組』,或者是在 shell 提示符號下輸入 redhat-config-users 指令。 選取 『使用者』 標簽頁,再從使用者清單中選取使用者,然後從按鈕選單中點選 內容(或者是從下拉式 選單中選擇 『檔案』 => 『內容』)。
然後選擇 『群組』 標簽頁,再點選 whell 群組,如 圖形 4-2.所示。
再來,請在文字編輯器中開啟 su 的 PAM 設定檔案 (/etc/pam.d/su), 然後從下列這一行中移除
auth required /lib/security/pam_wheel.so use_uid |
如此做的話,將只會允許管理者群組 wheel 的成員使用這個程式。
![]() | 請注意 |
|---|---|
預設情況下,root 使用者已經是 wheel 群組的成員之一。 |
sudo 指令提供給予使用者管理權存取的另一種方法,當一個可信賴的使用者在 sudo 指令之後加上一個管理的指令,該使用者將會被提示輸入他自己的密碼,認證成功後,而且也允許使用該指令, 這個管理的指令將會被執行,如同是由 root 使用者所執行的一樣。
sudo 指令的基本格式如下:
sudo <command> |
在以上的例子中,<command> 可以由通常只保留給 root 使用者的一個指令 取代,如 mount。
![]() | 重要 |
|---|---|
sudo 指令的使用者在離開他們的機器前,一定要記得先登出,因為使用 sudo 使用者在 五分鐘內可以再度使用該指令,而不需要輸入任何的密碼。 您可以透過 /etc/sudoers 設定檔案來修改這個設定。 |
sudo 指令允許相當高的靈活度,例如,只有於 /etc/sudoers 設定 檔案中列出的使用者才可以使用 sudo 指令,而且指令是在該使用者的 shell 下執行,而不是 root 的 shell。 這表示可以完全地停用 root shell,如 第 4.4.2.1 節 所示。
sudo 指令也提供一個廣泛的稽核存底,每一次成功的登入都會紀錄到 /var/log/messages 檔案,而且所執行的檔案與該使用者名稱也都會被紀錄到 /var/log/secure 檔案中。
sudo 指令的另一個優點是系統管理員可以依據他們的需求來允許不同的使用者使用特定 的指令。
想要編輯 sudo 設定檔案 /etc/sudoers 的系統管理員應該要使用 visudo 指令。
如要給予某人完整的管理者權限,請輸入 visudo,再增加類似以下的這一行在 # User privilege specification 部份:
juan ALL=(ALL) ALL |
這個範例表示使用者 juan 可以從任何的主機使用 sudo 來執行任何的指令。
下列的範例顯示出設定 sudo 時所能配置的設定:
%users localhost=/sbin/shutdown -h now |
這個範例表示任何使用者可以執行 /sbin/shutdown -h now 指令,只要該指令是從主控台中執行的話。
sudoers 的 man page 含有這個檔案可以使用的一個詳細選項清單。