在 Linux 上使用 sudo 命令的五個(gè)理由
以下是切換到 Linux sudo 命令的五個(gè)安全原因。
在傳統(tǒng)的 Unix 和類 Unix 系統(tǒng)上,新系統(tǒng)中存在的第一個(gè)同時(shí)也是唯一的用戶是 root。使用 root 賬戶登錄并創(chuàng)建“普通”用戶。在初始化之后,你應(yīng)該以普通用戶身份登錄。
以普通用戶身份使用系統(tǒng)是一種自我施加的限制,可以防止愚蠢的錯(cuò)誤。例如,作為普通用戶,你不能刪除定義網(wǎng)絡(luò)接口的配置文件或意外覆蓋用戶和組列表。作為普通用戶,你無(wú)權(quán)訪問(wèn)這些重要文件,所以你無(wú)法犯這些錯(cuò)誤。作為系統(tǒng)的實(shí)際所有者,你始終可以通過(guò) su 命令切換為超級(jí)用戶(root)并做你想做的任何事情,但對(duì)于日常工作,你應(yīng)該使用普通賬戶。
幾十年來(lái),su 運(yùn)行良好,但隨后出現(xiàn)了 sudo 命令。
對(duì)于日常使用超級(jí)用戶的人來(lái)說(shuō),sudo 命令乍一看似乎是多余的。在某些方面,它感覺(jué)很像 su 命令。例如:
$ su root
<輸入密碼>
# dnf install -y cowsay
sudo 做同樣的事情:
$ sudo dnf install -y cowsay
<輸入密碼>
它們的作用幾乎完全相同。但是大多數(shù)發(fā)行版推薦使用 sudo 而不是 su,甚至大多數(shù)發(fā)行版已經(jīng)完全取消了 root 賬戶(LCTT 譯注:不是取消,而是默認(rèn)禁止使用 root 用戶進(jìn)行登錄、運(yùn)行命令等操作。root 依然是 0 號(hào)用戶,依然擁有大部分系統(tǒng)文件和在后臺(tái)運(yùn)行大多數(shù)服務(wù))。讓 Linux 變得愚蠢是一個(gè)陰謀嗎?
事實(shí)并非如此。sudo 使 Linux 更加靈活和可配置,并且沒(méi)有損失功能,此外還有 幾個(gè)顯著的優(yōu)點(diǎn)。
為什么在 Linux 上 sudo 比 root 更好?
以下是你應(yīng)該使用 sudo 替換 su 的五個(gè)原因。
1. root 是被攻擊確認(rèn)的對(duì)象
我使用 防火墻、fail2ban 和 SSH 密鑰 的常用組合來(lái)防止一些針對(duì)服務(wù)器的不必要訪問(wèn)。在我理解 sudo 的價(jià)值之前,我對(duì)日志中的暴力破解感到恐懼。自動(dòng)嘗試以 root 身份登錄是最常見(jiàn)的情況,自然這是有充分理由的。
有一定入侵常識(shí)的攻擊者應(yīng)該知道,在廣泛使用 sudo 之前,基本上每個(gè) Unix 和 Linux 都有一個(gè) root 賬戶。這樣攻擊者就會(huì)少一種猜測(cè)。因?yàn)榈卿浢偸钦_的,只要它是 root 就行,所以攻擊者只需要一個(gè)有效的密碼。
刪除 root 賬戶可提供大量保護(hù)。如果沒(méi)有 root,服務(wù)器就沒(méi)有確認(rèn)的登錄賬戶。攻擊者必須猜測(cè)登錄名以及密碼。這不是兩次猜測(cè),而是兩個(gè)必須同時(shí)正確的猜測(cè)。(LCTT 譯注:此處是誤導(dǎo),root 用戶不可刪除,否則系統(tǒng)將會(huì)出現(xiàn)問(wèn)題。另外,雖然 root 可以改名,但是也最好不要這樣做,因?yàn)楹芏喑绦騼?nèi)部硬編碼了 root 用戶名。可以禁用 root 用戶,給它一個(gè)不能登錄的密碼。)
2. root 是最終的攻擊媒介
在訪問(wèn)失敗日志中經(jīng)常可以見(jiàn)到 root 用戶,因?yàn)樗亲顝?qiáng)大的用戶。如果你要設(shè)置一個(gè)腳本強(qiáng)行進(jìn)入他人的服務(wù)器,為什么要浪費(fèi)時(shí)間嘗試以受限的普通用戶進(jìn)入呢?只有最強(qiáng)大的用戶才有意義。
root 既是唯一已知的用戶名,又是最強(qiáng)大的用戶賬戶。因此,root 基本上使嘗試暴力破解其他任何東西變得毫無(wú)意義。
3. 可選擇的權(quán)限
su 命令要么全有要么全沒(méi)有。如果你有 su root 的密碼,你就可以變成超級(jí)用戶。如果你沒(méi)有 su 的密碼,那么你就沒(méi)有任何管理員權(quán)限。這個(gè)模型的問(wèn)題在于,系統(tǒng)管理員必須在將 root 密鑰移交或保留密鑰和對(duì)系統(tǒng)的所有權(quán)之間做出選擇。這并不總是你想要的,有時(shí)候你只是想授權(quán)而已。
例如,假設(shè)你想授予用戶以 root 身份運(yùn)行特定應(yīng)用程序的權(quán)限,但你不想為用戶提供 root 密碼。通過(guò)編輯 sudo 配置,你可以允許指定用戶,或?qū)儆谥付?Unix 組的任何用戶運(yùn)行特定命令。sudo 命令需要用戶的現(xiàn)有密碼,而不是你的密碼,當(dāng)然也不是 root 密碼。
4.超時(shí)
使用 sudo 運(yùn)行命令后,通過(guò)身份驗(yàn)證的用戶的權(quán)限會(huì)提升 5 分鐘。在此期間,他們可以運(yùn)行任何管理員授權(quán)的命令。
5 分鐘后,認(rèn)證緩存被清空,下次使用 sudo 再次提示輸入密碼。超時(shí)可防止用戶意外執(zhí)行某些操作(例如,搜索 shell 歷史記錄時(shí)不小心或按多了向上箭頭)。如果一個(gè)用戶離開(kāi)辦公桌而沒(méi)有鎖定計(jì)算機(jī)屏幕,它還可以確保另一個(gè)用戶不能運(yùn)行這些命令。
5. 日志記錄
Shell 歷史功能可以作為一個(gè)用戶所做事情的日志。如果你需要了解系統(tǒng)發(fā)生了什么,你可以(理論上,取決于 shell 歷史記錄的配置方式)使用 su 切換到其他人的賬戶,查看他們的 shell 歷史記錄,也可以了解用戶執(zhí)行了哪些命令。
但是,如果你需要審計(jì) 10 或 100 名用戶的行為,你可能會(huì)注意到此方法無(wú)法擴(kuò)展。Shell 歷史記錄的輪轉(zhuǎn)速度很快,默認(rèn)為 1000 條,并且可以通過(guò)在任何命令前加上空格來(lái)輕松繞過(guò)它們。
當(dāng)你需要管理任務(wù)的日志時(shí),sudo 提供了一個(gè)完整的 日志記錄和警報(bào)子系統(tǒng),因此你可以在一個(gè)特定位置查看活動(dòng),甚至在發(fā)生重大事件時(shí)獲得警報(bào)。
學(xué)習(xí) sudo 其他功能
除了本文列舉的一些功能,sudo 命令還有很多已有的或正在開(kāi)發(fā)中的新功能。因?yàn)?sudo 通常是你配置一次然后就忘記的東西,或者只在新管理員加入團(tuán)隊(duì)時(shí)才配置的東西,所以很難記住它的細(xì)微差別。