Linux中國

Linux 中的 su 和 sudo 命令有什麼區別?

susudo 命令都允許用戶執行非特權用戶不允許做的系統管理任務,即只有 root 用戶能執行的命令。有些人更喜歡 sudo 命令:例如 Seth Kenlon 最近發布的一篇 《在 Linux 上使用 sudo 的 5 個理由》,他在其中詳細闡述了 sudo 命令的許多優點。

但是,相較於 sudo 命令,我更偏好於 su 命令 來做系統管理工作。在本文中,我比較了這兩個命令的區別,並解釋了為什麼我更喜歡 su 而不是 sudo,但我仍然同時使用這兩個命令的原因。

過去的系統管理員主要使用 su 命令

susudo 命令是為不同的世界設計的。早期的 Unix 計算機需要全職系統管理員,他們使用 root 用戶作為唯一的管理帳戶。在這個古老的世界裡,有管理員密碼的人會在電傳打字機或 CRT 終端(例如 DEC VT100)上以 root 用戶登錄,然後執行一些管理 Unix 計算機的工作。

管理員還會有一些非 root 帳戶,用於執行一些非 root 的任務,例如編寫文檔和管理電子郵件等。在這些 Unix 計算機上通常有許多非 root 帳戶,他們都不需要完全的 root 訪問許可權,只需要以 root 許可權運行很少的命令,大約 1 至 2 個就可以了。許多系統管理員以 root 用戶登錄,完成 root 工作,並在任務完成後,退出 root 會話。有時候,系統管理員需要整天以 root 用戶來登錄,因為 sudo 命令需要鍵入更多的內容才能運行必要的命令,因此大多數系統管理員很少使用 sudo 命令。

sudosu 這兩個命令都能夠提權為 root 用戶,但它們實現的方式大不相同。這種差異是由於它們最初打算用於不同的情況

sudo 命令

sudo 命令的初衷是讓 root 用戶能夠讓幾個非 root 用戶訪問他們經常需要的一兩個特權命令。sudo 命令允許非 root 用戶暫時地獲得更高許可權,來執行一些特權命令,例如添加和刪除用戶、刪除屬於其他用戶的文件、安裝新軟體以及管理現代 Linux 主機所需的任何命令。

sudo 命令允許非 root 用戶訪問一兩個 需要更高許可權 的常用命令,這樣可以幫助系統管理員節省來自用戶的許多請求,並減少等待時間。sudo 命令不會將用戶帳戶切換為 root 用戶,因為大多數非 root 用戶永遠不應該擁有完全的 root 訪問許可權。在大多數情況下,sudo 允許用戶執行一兩個命令,然後提權就會過期。在這個通常為 5 分鐘的短暫的提權時間內,用戶可以執行任何需要提權的管理命令。需要繼續使用提權的用戶可以運行 sudo -v 命令來重新驗證 root 訪問許可權,並將提權時間再延長 5 分鐘。

使用 sudo 命令還有一些副作用,例如生成非 root 用戶使用命令的日誌條目及其 ID。這些日誌可以在之後作為出現問題的檢驗,來給用戶更多的操作培訓。(你以為我會說「問責」用戶,對吧?)

su 命令

su 命令能夠將非 root 用戶提權到 root 許可權 —— 事實上,能讓非 root 用戶成為 root 用戶。唯一的要求是用戶知道 root 密碼。因為用戶已經以 root 許可權登錄,所以之後的操作就沒有限制了。

su 命令所提供的提權沒有時間限制。用戶可以作為 root 執行命令,不需要進行重新驗證是否有 root 許可權。完成任務後,用戶可以執行退出命令 exit,從 root 用戶恢復到自己原來的非 root 帳戶。

su 和 sudo 在使用上的爭議和變化

最近在 susudo 的使用上存在一些分歧。

真正的系統管理員不會使用 sudo。—— Paul Venezia

Venezia 在他的 InfoWorld 文章 中辯稱,對於許多擔任系統管理員的人來說,sudo 是一個不必要的工具。他沒有花太多時間為這個觀點進行解釋,他只是把它說成了一個事實。我同意他對於系統管理員的觀點,因為我們不需要 sudo 來完成我們的工作。事實上,sudo 使得事情變得更複雜了。

然而,

時代在「改變」。—— Bob Dylan

Bob Dylan 是對的,儘管他唱的歌不是指計算機(LCTT 譯註:Bob Dylan 是美國創作歌手、藝術家和作家,這裡指他不是針對於電腦而說的)。

自從人手一台的個人計算機時代到來,計算機的管理方式發生了重大變化。在許多環境中,計算機的使用者也是它的管理員,這使得為這些用戶提供一些對 root 許可權的訪問是有必要的。

一些現代發行版,例如 Ubuntu 及其衍生版本,只能使用 sudo 命令來執行特權命令。在這些發行版中,用戶無法直接以 root 用戶身份登錄,甚至無法通過 su 切換到 root,因此需要 sudo 命令來允許非 root 用戶獲得 root 許可權。在這一環境中,所有系統管理任務均使用 sudo 來執行。

通過鎖定 root 帳戶並將常規用戶帳戶添加到「輪子」組(wheel),可以實現此配置,但是這種配置很容易被繞過。接下來,讓我們在 Ubuntu 主機或虛擬機上嘗試一些小實驗吧。我在這裡說明一些我的設置,以便你可以根據需要來重現它。我安裝的是 Ubuntu 16.04 LTS1,並使用 VirtualBox 將其安裝在虛擬機中。在安裝過程中,我創建了一個非 root 用戶 student,為了簡便起見我給這個用戶設置了一個簡單的密碼。

student 用戶身份登錄 Ubuntu,並打開終端。查看 /etc/shadow 文件中的 root 條目,其中存儲了經哈希的密碼。

student@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied

可以看到終端拒絕了我們對 /etc/shadow 的訪問,因此我們無法查看 /etc/shadow 文件。所有發行版都是如此,以防止非特權用戶看到和訪問加密的密碼,因為非特權用戶可能會使用常見的黑客工具來破解這些密碼。

現在,讓我們使用 su - 命令來成為 root 用戶。

student@ubuntu1:~$ su -
Password: <Enter root password – but there isn&apos;t one>
su: Authentication failure

認證失敗的原因是因為 root 帳戶沒有密碼、並且被鎖定了。接下來,使用 sudo 命令查看 /etc/shadow 文件。

student@ubuntu1:~$ sudo cat /etc/shadow
[sudo] password for student: <enter the student password>
root:!:17595:0:99999:7:::
<截取>
student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
<截取>

在這裡,我僅截取了部分結果,只顯示 root 和 student 用戶的條目。我還縮短了加密密碼,以便該條目能顯示在一行中。各個欄位以冒號(:)分隔,第二個欄位是密碼。請注意,root 的密碼欄位是一個感嘆號(!),這表明 root 帳戶已被鎖定,且無法使用。

現在,要將 root 帳戶變成一個合適的系統管理員,你只需為 root 帳戶設置密碼。

student@ubuntu1:~$ sudo su -
[sudo] password for student: <Enter password for student>
root@ubuntu1:~# passwd root
Enter new UNIX password: <Enter new root password>
Retype new UNIX password: <Re-enter new root password>
passwd: password updated successfully
root@ubuntu1:~#

現在,你可以直接以 root 身份登錄到控制台,或者直接使用 su 登錄到 root,而不是在每個命令前都加一個 sudo。當然,你也可以在每次想以 root 身份登錄時,使用 sudo su -,但這又是何必呢?

請不要誤解我的意思。像 Ubuntu 這樣的發行版及其上下游衍生版非常好,多年來我已經使用了其中的幾個。在使用 Ubuntu 和相關發行版時,我做的第一件事就是設置一個 root 密碼,這樣我就可以直接以 root 身份登錄。其他發行版,如 Fedora 及其相關發行版,現在在安裝過程中提供了一些有趣的選擇。我注意到的第一個 Fedora 版本是 Fedora 34,我在寫我的一本即將出版的書時安裝了很多次。

在安裝頁面上,可以找到其中一個安裝選項,來設置 root 密碼。這個新選項允許用戶選擇「 鎖定 root 帳戶 Lock root account 」,就像 Ubuntu 鎖定 root 帳戶的方式一樣。此頁面上還有一個選項,允許使用密碼以 root 身份遠程 SSH 登錄到此主機,但這僅在 root 帳戶解鎖時有效。第二個選項位於允許創建非 root 帳戶的頁面上。此頁面上的選項之一是「 讓此用戶成為管理員 Make this user administrator 」。選中此選項後,用戶 ID 將添加到一個名為 wheel 組的特殊組中,該組授權該組的成員使用 sudo 命令。Fedora 36 甚至在該複選框的描述中提到了 wheel 組。

可以將多個非 root 用戶設置為管理員。使用此方法指定為管理員的任何人都可以使用 sudo 命令在 Linux 計算機上執行所有管理任務。Linux 在安裝時只允許創建一個非 root 用戶,所以其他新用戶可以在創建時添加到 wheel 組中。root 用戶或其他管理員可以使用文本編輯器或 usermod 命令直接將現有用戶添加到 wheel 組。

在大多數情況下,今天的管理員只需要執行一些基本任務,例如添加新的印表機、安裝更新或新軟體,或者刪除不再需要的軟體。這些 GUI 工具需要 root 或管理密碼,並將接受來自管理員用戶的密碼。

在 Linux 上,我是怎麼使用 su 和 sudo 的呢

同時使用 susudo。它們都是我所使用的很重要的系統管理員工具。

我不鎖定 root 帳戶,因為我需要用 root 帳戶來運行我的 Ansible 腳本和我編寫的 rsbu Bash 程序,來執行備份。這兩個程序都需要以 root 身份運行,我編寫的其他幾個管理 Bash 的腳本也是如此。我使用 su 命令切換到 root 用戶,這樣我就可以執行這些腳本和許多其他常見的命令。當我需要確定問題和解決問題時,使用 su 命令將我的許可權提升到 root 十分有用,因為我不希望 sudo 帶來的提權會話超時。

當非 root 用戶需要執行這些任務時,我使用 sudo 命令,來執行需要 root 許可權的任務。我在 sudoers 文件中設置了非 root 帳戶,只允許訪問完成任務所需的一兩個命令。當我只需要運行一兩個需要提權的快速命令時,我自己也會使用 sudo 命令。

結論

實際上只要你把工作完成好了,你使用什麼工具都無大礙。你使用的是 Vim 還是 Emacs,是 systemd 還是 SystemV,是 RPM 亦或是 DEB,是 sudo 亦或是 su,在結果上會有什麼區別呢?這裡的關鍵在於你應該使用最適合你的工具。Linux 和開源軟體的最大優勢之一是通常有許多選項可用於我們需要完成的任務。

susudo 都各有長處,如果正確使用的話,兩者都是非常安全的。我選擇同時使用 susudo 命令,基於它們的歷史功能,因為這對我來說十分有用。對於我自己的大部分工作,我更喜歡 su 命令,因為它與我的工作流程最適配。

在評論區分享你喜歡的工作方式吧!

本文摘自於我的書《 系統管理員的 Linux 哲學 The Linux Philosophy for Sysadmins (Apress,2018 年)》一書的第 19 章,並經許可後重新發布。

via: https://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin

作者:David Both 選題:lkxed 譯者:chai001125 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國