Linux 用戶的七個 sudo 技巧和改進(jìn)

用這些技巧釋放 sudo 的力量 ??
你應(yīng)該熟悉 sudo 吧?肯定有過使用的經(jīng)驗。
對多數(shù) Linux 用戶來說,sudo 就像一個神器,賦予了他們作為 root 用戶執(zhí)行任意命令或切換到 root 用戶身份的能力。
其實這只掌握了一半的真相。sudo 絕非僅僅只是一條命令,sudo 是一款你可以根據(jù)需求和偏好去定制的工具。
Ubuntu、Debian 以及其他的發(fā)行版在默認(rèn)的配置下,賦予了 sudo 以 root 用戶的身份執(zhí)行任意命令的權(quán)限。這讓很多用戶誤以為 sudo 就像一個魔法開關(guān),瞬間可以獲取到 root 權(quán)限。
比如說,系統(tǒng)管理員可以設(shè)置成只有屬于特定的 dev 組的部分用戶才能用 sudo 來執(zhí)行 nginx 命令。這些用戶將無法用 sudo 執(zhí)行任何其他命令或切換到 root 用戶。
如果你對此感到驚訝,那很可能是你一直在使用 sudo,但對其底層的工作原理并沒有太多了解。
在這個教程中,我并不會解釋 sudo 是如何運(yùn)作的,這個主題我會在另一天講解。
在這篇文章中,你將看到 sudo 的不同特性可以如何被調(diào)試和改進(jìn)。有些可能真的很有用,有些可能完全沒什么幫助,但是挺有趣。
?? 請不要隨意去嘗試所有提到的改進(jìn)。如果處理不慎,你可能會遭遇無法運(yùn)行
sudo的混亂狀態(tài)。在大多數(shù)情況下,平靜閱讀并知道這些就好。如果你決定嘗試一些改進(jìn)步驟,請先備份你的系統(tǒng)設(shè)置,這樣在需要的時候能把事情恢復(fù)到正常。
1、編輯 sudo 配置時,請始終使用 visudo
sudo 命令是通過 /etc/sudoers 文件進(jìn)行配置的。
雖然你可以用你最喜歡的 終端文本編輯器 編輯這個文件,比如 Micro、NeoVim 等,但你千萬不要這么做。
為什么這么說呢?因為該文件中的任何語法錯誤都會讓你的系統(tǒng)出問題,導(dǎo)致 sudo 無法工作。這可能會使得你的 Linux 系統(tǒng)無法正常使用。
你只需要這樣使用即可:
sudo visudo傳統(tǒng)上,visudo 命令會在 Vi 編輯器中打開 /etc/sudoers 文件。如果你用的是 Ubuntu,那么會在 Nano 中打開。

這么做的好處在于,visudo 會在你試圖保存更改時執(zhí)行語法檢查。這能確保你不會因為語法錯誤而誤改 sudo 配置。
visudo 在保存到 sudoers 文件的變更前檢查語法
好了!現(xiàn)在你可以看看 sudo 配置的一些改變。
?? 我建議你備份
/etc/sudoers文件(sudo cp /etc/sudoers /etc/sudoers.bak)。這樣,如果你不確定你做了哪些更改,或者你想恢復(fù)到默認(rèn)的 sudo 配置,那你可以從備份文件中復(fù)制。
2、輸入 sudo 密碼時顯示星號
我們的這種輸入行為是從 UNIX 系統(tǒng)中繼承下來的。當(dāng)你在終端輸入 sudo 密碼時,屏幕上不會有任何顯示。這種缺乏反饋的現(xiàn)象,往往讓新的 Linux 用戶懷疑自己的系統(tǒng)已經(jīng)卡住了。
人們常說,這是一項安全功能。或許在上個世紀(jì)是這樣,但我個人覺得我們沒有必要繼續(xù)這樣下去。
不過,一些發(fā)行版,如 Linux Mint,已經(jīng)對 sudo 進(jìn)行了優(yōu)化,當(dāng)你輸入密碼時會顯示星號。
這樣的方式更符合我們的日常經(jīng)驗。
如果想讓 sudo 輸入密碼時顯示星號,運(yùn)行 sudo visudo 并找到以下行:
Defaults env_reset然后將其更改為:
Defaults env_reset,pwfeedback
?? 在某些發(fā)行版中,比如 Arch,你可能找不到
Defaults env_reset這一行。如果這樣的話,只需新增一行Defaults env_reset, pwfeedback就可以了。
現(xiàn)在,當(dāng) sudo 需要你輸入密碼時,你會看到輸入的密碼變成了星號。

? 如果你注意到即使密碼正確也無法通過一些圖形化應(yīng)用,如軟件中心,那就該撤銷這項更改。一些較舊的論壇帖子曾提到過此類問題,雖然我自己還未遇到過。
3、增加 sudo 密碼超時時限
當(dāng)你首次使用 sudo 時,它會要求輸入密碼。但在隨后相當(dāng)一段時間里,你使用 sudo 執(zhí)行命令就無需再次輸入密碼。
我們將這個時間間隔稱為 sudo 密碼超時 (暫且稱為 SPT,這是我剛剛編的說法,請不要真的這樣稱呼 ??)。
不同的發(fā)行版有不同的超時時間??赡苁?5 分鐘,也可能是 15 分鐘。
你可以根據(jù)自己的喜好來改變這個設(shè)置,設(shè)定一個新的 sudo 密碼超時時限。
像你之前看到的,編輯 sudoers 文件,找到含有 Defaults env_reset 的行,并在此行添加 timestamp_timeout=XX,使其變成如下形式:
Defaults env_reset, timestamp_timeout=XX其中 XX 是以分鐘為單位的超時時長。
如果你還有其他參數(shù),例如你在上一節(jié)中看到的星號反饋,它們都可以在一行中組合起來:
Defaults env_reset, timestamp_timeout=XX, pwfeedback?? 同樣地,你還可以控制密碼重試的次數(shù)上限。使用
passwd_tries=N來修改用戶可以輸入錯誤密碼的次數(shù)。
4、在不輸入密碼的情況下使用 sudo
行!你已經(jīng)增加了 sudo 密碼超時時限(或者稱之為 SPT。哇塞!你還在堅持這個叫法 ??)。
這樣很好。我的意思是,畢竟沒人愿意每幾分鐘就輸入一次密碼。
擴(kuò)大超時時限是一方面,另一方面則是盡可能不去使用它。
是的,你沒聽錯。你就是可以在無需輸入密碼的情況下使用 sudo。
從安全角度來看,這聽起來似乎很冒險,對吧?的確如此,但在某些實際情況下,你確實會更青睞無密碼的 sudo。
例如,如果你需要遠(yuǎn)程管理多臺 Linux 服務(wù)器,并為了避免總是使用 root,你在這些服務(wù)器上創(chuàng)建了一些 sudo 用戶。辛酸的是,你會有太多的密碼。而你又不想對所有的服務(wù)器使用同一的 sudo 密碼。
在這種情況下,你可以僅設(shè)置基于密鑰的 SSH 訪問方式,并允許使用無需密碼的 sudo。這樣,只有獲得授權(quán)的用戶才能訪問遠(yuǎn)程服務(wù)器,也不用再記住 sudo 密碼。
我在 DigitalOcean 上部署的測試服務(wù)器上就采用了這種方法,用來測試開源工具和服務(wù)。
好處是這可以按用戶進(jìn)行設(shè)置。使用以下命令打開 /etc/sudoers 文件進(jìn)行編輯:
sudo visudo然后添加如下行:
user_name ALL=(ALL) NOPASSWD:ALL當(dāng)然,你需要將上面行中的 user_name 替換為實際的用戶名。
保存文件后,你就可以享受無密碼的 sudo 生活了。
5、配置獨立的 sudo 日志文件
查閱 syslog 或 journal 日志,我們可以找到關(guān)于 sudo 的所有條目,但若需要單獨針對 sudo 的記錄,可以專門創(chuàng)建一個自定義的日志文件。例如,選擇 /var/sudo.log 文件來存儲日志。這個新的日志文件無需手動創(chuàng)建,如果不存在,系統(tǒng)會自動生成。
編輯 /etc/sudoers 文件,采用 visudo 命令,并在其中添加以下內(nèi)容:
Defaults logfile="/var/log/sudo.log"保存該文件后,便可以在其中查看哪些命令在何時、由哪位用戶通過 sudo 運(yùn)行了。

6、限制特定用戶組使用 sudo 執(zhí)行特定命令
這是一種高級解決方案,系統(tǒng)管理員在需要跨部門共享服務(wù)器的多用戶環(huán)境中會使用。
開發(fā)者可能會需要以 root 權(quán)限運(yùn)行 Web 服務(wù)器或其他程序,但全權(quán)給予他們 sudo 權(quán)限會帶來安全風(fēng)險。我建議在群組級別進(jìn)行此項操作。例如,創(chuàng)建命名為 coders 的群組,并允許它們運(yùn)行在 /var/www 和 /opt/bin/coders 目錄下的命令(或可執(zhí)行文件),以及 inxi 命令(路徑是 /usr/bin/inxi 的二進(jìn)制文件)。這是一個假想情景,實際操作請謹(jǐn)慎對待。
接下來,用 sudo visudo 編輯 sudoer 文件,再添加以下行:
%coders ALL=(ALL:ALL) /var/www,/opt/bin/coders,/usr/bin/inxi如有需要,可以添加 NOPASSWD 參數(shù),這樣允許使用 sudo 運(yùn)行的命令就不再需要密碼了。
關(guān)于 ALL=(ALL:ALL) 的詳細(xì)解讀,我們將會在其他文章中進(jìn)行講解,畢竟這篇文章已經(jīng)解釋的內(nèi)容足夠多了。
7、檢查用戶的 sudo 權(quán)限
好吧,這是個小提示,而不是系統(tǒng)調(diào)優(yōu)技巧。
如何確認(rèn)一個用戶是否具有 sudo 權(quán)限呢?可能有人會說,查看他們是否是 sudo 組的成員。但這并不一定準(zhǔn)確,因為有些發(fā)行版用的是 wheel 代替 sudo 分組。
更佳的方法是利用 sudo 內(nèi)建的功能,看看用戶具有哪種 sudo 權(quán)限:
sudo -l -U user_name這將顯示出用戶具有執(zhí)行部分命令或所有命令的 sudo 權(quán)限。

如你所見,我擁有自定義日志文件、密碼反饋以及執(zhí)行所有命令的 sudo 權(quán)限。
如果一個用戶完全沒有 sudo 權(quán)限,你將看到如下提示:
User prakash is not allowed to run sudo on this-that-server.?? 附加內(nèi)容:輸錯 sudo 密碼時,讓系統(tǒng)“侮辱”你
這是個我在文章開頭提到的“無用”小調(diào)整。
我想你在使用 sudo 時肯定曾誤輸過密碼,對吧?
這個小技巧就是,在你每次輸錯密碼時,讓 sudo 拋出隨機(jī)的“侮辱”。
用 sudo visudo 修改 sudo 配置文件,然后添加以下行:
Defaults insults修改后,你可以故意輸錯密碼,測試新的設(shè)置。

你可能在想,誰會喜歡被侮辱呢?只有粉絲可以以直白的方式告訴你 ??
你是如何運(yùn)用 sudo 的?

我知道定制化的可能性無窮無盡,但其實,一般的 Linux 用戶并不會去自定義 sudo。
盡管如此,我還是熱衷于與你分享這些因為你可能會發(fā)現(xiàn)一些新奇且實用的東西。
?? 那么,你有發(fā)現(xiàn)什么新的東西嗎?請在評論區(qū)告訴我。你有一些秘密的 sudo 技巧歡迎和大家分享!


























