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