Linux 用戶的七個 sudo 技巧和改進
用這些技巧釋放 sudo 的力量 ??
你應該熟悉 sudo 吧?肯定有過使用的經驗。
對多數 Linux 用戶來說,sudo
就像一個神器,賦予了他們作為 root 用戶執行任意命令或切換到 root 用戶身份的能力。
其實這只掌握了一半的真相。sudo
絕非僅僅只是一條命令,sudo
是一款你可以根據需求和偏好去定制的工具。
Ubuntu、Debian 以及其他的發行版在默認的配置下,賦予了 sudo
以 root 用戶的身份執行任意命令的權限。這讓很多用戶誤以為 sudo
就像一個魔法開關,瞬間可以獲取到 root 權限。
比如說,系統管理員可以設置成只有屬于特定的 dev
組的部分用戶才能用 sudo
來執行 nginx
命令。這些用戶將無法用 sudo
執行任何其他命令或切換到 root 用戶。
如果你對此感到驚訝,那很可能是你一直在使用 sudo
,但對其底層的工作原理并沒有太多了解。
在這個教程中,我并不會解釋 sudo
是如何運作的,這個主題我會在另一天講解。
在這篇文章中,你將看到 sudo
的不同特性可以如何被調試和改進。有些可能真的很有用,有些可能完全沒什么幫助,但是挺有趣。
?? 請不要隨意去嘗試所有提到的改進。如果處理不慎,你可能會遭遇無法運行
sudo
的混亂狀態。在大多數情況下,平靜閱讀并知道這些就好。如果你決定嘗試一些改進步驟,請先備份你的系統設置,這樣在需要的時候能把事情恢復到正常。
1、編輯 sudo 配置時,請始終使用 visudo
sudo
命令是通過 /etc/sudoers
文件進行配置的。
雖然你可以用你最喜歡的 終端文本編輯器 編輯這個文件,比如 Micro、NeoVim 等,但你千萬不要這么做。
為什么這么說呢?因為該文件中的任何語法錯誤都會讓你的系統出問題,導致 sudo
無法工作。這可能會使得你的 Linux 系統無法正常使用。
你只需要這樣使用即可:
sudo visudo
傳統上,visudo
命令會在 Vi 編輯器中打開 /etc/sudoers
文件。如果你用的是 Ubuntu,那么會在 Nano 中打開。
這么做的好處在于,visudo 會在你試圖保存更改時執行語法檢查。這能確保你不會因為語法錯誤而誤改 sudo
配置。
visudo 在保存到 sudoers 文件的變更前檢查語法
好了!現在你可以看看 sudo
配置的一些改變。
?? 我建議你備份
/etc/sudoers
文件(sudo cp /etc/sudoers /etc/sudoers.bak
)。這樣,如果你不確定你做了哪些更改,或者你想恢復到默認的 sudo 配置,那你可以從備份文件中復制。
2、輸入 sudo 密碼時顯示星號
我們的這種輸入行為是從 UNIX 系統中繼承下來的。當你在終端輸入 sudo
密碼時,屏幕上不會有任何顯示。這種缺乏反饋的現象,往往讓新的 Linux 用戶懷疑自己的系統已經卡住了。
人們常說,這是一項安全功能。或許在上個世紀是這樣,但我個人覺得我們沒有必要繼續這樣下去。
不過,一些發行版,如 Linux Mint,已經對 sudo
進行了優化,當你輸入密碼時會顯示星號。
這樣的方式更符合我們的日常經驗。
如果想讓 sudo
輸入密碼時顯示星號,運行 sudo visudo
并找到以下行:
Defaults env_reset
然后將其更改為:
Defaults env_reset,pwfeedback
?? 在某些發行版中,比如 Arch,你可能找不到
Defaults env_reset
這一行。如果這樣的話,只需新增一行Defaults env_reset, pwfeedback
就可以了。
現在,當 sudo
需要你輸入密碼時,你會看到輸入的密碼變成了星號。
? 如果你注意到即使密碼正確也無法通過一些圖形化應用,如軟件中心,那就該撤銷這項更改。一些較舊的論壇帖子曾提到過此類問題,雖然我自己還未遇到過。
3、增加 sudo 密碼超時時限
當你首次使用 sudo
時,它會要求輸入密碼。但在隨后相當一段時間里,你使用 sudo
執行命令就無需再次輸入密碼。
我們將這個時間間隔稱為 sudo
密碼超時 (暫且稱為 SPT,這是我剛剛編的說法,請不要真的這樣稱呼 ??)。
不同的發行版有不同的超時時間。可能是 5 分鐘,也可能是 15 分鐘。
你可以根據自己的喜好來改變這個設置,設定一個新的 sudo
密碼超時時限。
像你之前看到的,編輯 sudoers
文件,找到含有 Defaults env_reset
的行,并在此行添加 timestamp_timeout=XX
,使其變成如下形式:
Defaults env_reset, timestamp_timeout=XX
其中 XX
是以分鐘為單位的超時時長。
如果你還有其他參數,例如你在上一節中看到的星號反饋,它們都可以在一行中組合起來:
Defaults env_reset, timestamp_timeout=XX, pwfeedback
?? 同樣地,你還可以控制密碼重試的次數上限。使用
passwd_tries=N
來修改用戶可以輸入錯誤密碼的次數。
4、在不輸入密碼的情況下使用 sudo
行!你已經增加了 sudo
密碼超時時限(或者稱之為 SPT。哇塞!你還在堅持這個叫法 ??)。
這樣很好。我的意思是,畢竟沒人愿意每幾分鐘就輸入一次密碼。
擴大超時時限是一方面,另一方面則是盡可能不去使用它。
是的,你沒聽錯。你就是可以在無需輸入密碼的情況下使用 sudo
。
從安全角度來看,這聽起來似乎很冒險,對吧?的確如此,但在某些實際情況下,你確實會更青睞無密碼的 sudo
。
例如,如果你需要遠程管理多臺 Linux 服務器,并為了避免總是使用 root,你在這些服務器上創建了一些 sudo
用戶。辛酸的是,你會有太多的密碼。而你又不想對所有的服務器使用同一的 sudo
密碼。
在這種情況下,你可以僅設置基于密鑰的 SSH 訪問方式,并允許使用無需密碼的 sudo
。這樣,只有獲得授權的用戶才能訪問遠程服務器,也不用再記住 sudo
密碼。
我在 DigitalOcean 上部署的測試服務器上就采用了這種方法,用來測試開源工具和服務。
好處是這可以按用戶進行設置。使用以下命令打開 /etc/sudoers
文件進行編輯:
sudo visudo
然后添加如下行:
user_name ALL=(ALL) NOPASSWD:ALL
當然,你需要將上面行中的 user_name
替換為實際的用戶名。
保存文件后,你就可以享受無密碼的 sudo
生活了。
5、配置獨立的 sudo 日志文件
查閱 syslog 或 journal 日志,我們可以找到關于 sudo
的所有條目,但若需要單獨針對 sudo
的記錄,可以專門創建一個自定義的日志文件。例如,選擇 /var/sudo.log
文件來存儲日志。這個新的日志文件無需手動創建,如果不存在,系統會自動生成。
編輯 /etc/sudoers
文件,采用 visudo
命令,并在其中添加以下內容:
Defaults logfile="/var/log/sudo.log"
保存該文件后,便可以在其中查看哪些命令在何時、由哪位用戶通過 sudo
運行了。
6、限制特定用戶組使用 sudo 執行特定命令
這是一種高級解決方案,系統管理員在需要跨部門共享服務器的多用戶環境中會使用。
開發者可能會需要以 root 權限運行 Web 服務器或其他程序,但全權給予他們 sudo
權限會帶來安全風險。我建議在群組級別進行此項操作。例如,創建命名為 coders
的群組,并允許它們運行在 /var/www
和 /opt/bin/coders
目錄下的命令(或可執行文件),以及 inxi 命令(路徑是 /usr/bin/inxi
的二進制文件)。這是一個假想情景,實際操作請謹慎對待。
接下來,用 sudo visudo
編輯 sudoer 文件,再添加以下行:
%coders ALL=(ALL:ALL) /var/www,/opt/bin/coders,/usr/bin/inxi
如有需要,可以添加 NOPASSWD
參數,這樣允許使用 sudo
運行的命令就不再需要密碼了。
關于 ALL=(ALL:ALL)
的詳細解讀,我們將會在其他文章中進行講解,畢竟這篇文章已經解釋的內容足夠多了。
7、檢查用戶的 sudo 權限
好吧,這是個小提示,而不是系統調優技巧。
如何確認一個用戶是否具有 sudo
權限呢?可能有人會說,查看他們是否是 sudo
組的成員。但這并不一定準確,因為有些發行版用的是 wheel
代替 sudo
分組。
更佳的方法是利用 sudo
內建的功能,看看用戶具有哪種 sudo
權限:
sudo -l -U user_name
這將顯示出用戶具有執行部分命令或所有命令的 sudo
權限。
如你所見,我擁有自定義日志文件、密碼反饋以及執行所有命令的 sudo
權限。
如果一個用戶完全沒有 sudo
權限,你將看到如下提示:
User prakash is not allowed to run sudo on this-that-server.
?? 附加內容:輸錯 sudo 密碼時,讓系統“侮辱”你
這是個我在文章開頭提到的“無用”小調整。
我想你在使用 sudo
時肯定曾誤輸過密碼,對吧?
這個小技巧就是,在你每次輸錯密碼時,讓 sudo 拋出隨機的“侮辱”。
用 sudo visudo
修改 sudo
配置文件,然后添加以下行:
Defaults insults
修改后,你可以故意輸錯密碼,測試新的設置。
你可能在想,誰會喜歡被侮辱呢?只有粉絲可以以直白的方式告訴你 ??
你是如何運用 sudo 的?
我知道定制化的可能性無窮無盡,但其實,一般的 Linux 用戶并不會去自定義 sudo
。
盡管如此,我還是熱衷于與你分享這些因為你可能會發現一些新奇且實用的東西。
?? 那么,你有發現什么新的東西嗎?請在評論區告訴我。你有一些秘密的 sudo
技巧歡迎和大家分享!