上次,我詢問了這些的風險(在/etc/sudoers
):
user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
%group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
當我思考這個問題的時候,我發現/etc/sudoers.d
目錄。目錄中的文件應該具有類似的功能/etc/sudoers
(這意味著即使在 中,上面的腳本仍然存在問題/etc/sudoers.d
),但是一篇文章說我們不應該使用該目錄,因為我們無法使用visudo
它來編輯其中的文件。也就是說,sudo
如果目錄出錯,我們就失去使用權了。
如果這是真的,為什麼我們有/etc/sudoers.d
?或者我們有什麼好的方法來編輯文件/etc/sudoers.d
?
答案1
如果升級系統,對檔案所做的變更將/etc/sudoers.d
保留。這可以防止系統升級時使用者被鎖定。 Ubuntu 往往喜歡這種行為。其他發行版也使用這種佈局。
根據我的經驗,該目錄中文件的規則比/etc/sudoers
.這包括:
- 文件中的錯誤並未導致
sudo
失敗。然而,該文件被忽略。 - 權限規則似乎不太嚴格。它允許適用的群組或其他人讀取該檔案。我不相信這是可能的
/etc/sudoers
。必須限制寫入權限以root
維護安全性。目前 Ubuntu 版本的 sudo 允許群組或其他群組的讀取權限。 (此功能允許使用 sudo 存取進行審核,而無需 root 存取權限。)
該visudo
命令僅預設為/etc/sudoers
.它將編輯並驗證您使用該-f
選項指定的任何文件。我使用此功能來編輯將自動安裝/etc/sudoers
為/etc/sudoders.d
.但是,可能找不到其他文件中的定義。最好使文件獨立。
擁有獨立檔案的能力使應用程式可以輕鬆啟用sudo
安裝功能並在卸載時刪除它們。自動配置工具也可以使用此功能。
我已使用此功能來隔離向特定係統上的特定使用者群組授予存取權限所需的變更。
答案2
是的,您可以用來visudo
編輯這些文件。您所要做的就是使用該選項指定要編輯的檔案的名稱-f
。例如:
visudo -f /etc/sudoers.d/somefilename
或者,如果需要的話:
sudo visudo -f /etc/sudoers.d/somefilename
文件
從man visudo
:
-f sudoers
指定和備用 sudoers 文件位置。使用此選項 visudo 將編輯(或檢查)您選擇的 sudoers 文件,而不是預設的 /etc/sudoers。使用的鎖定檔案是指定的 sudoers 文件,並附加“.tmp”。僅在僅檢查模式下,-f 的參數可以是“-”,表示將從標準輸入讀取 sudoers。
總之:
句法:兩者
visudo
和visudo -f
執行相同的語法檢查。權限/所有權: 作為添加的功能協助管理大型系統,在其下編輯的文件
visudo -f
不會檢查所有權或權限:這允許離線或作為修訂控制系統的一部分對文件進行語法檢查。
為什麼要使用/etc/sudoers.d/
通常/etc/sudoers
由您的發行版的套件管理器控制。如果您對該文件進行了更改並且套件管理器想要升級它,您將必須手動檢查更改並批准如何將它們合併到新版本中。透過將本機變更放入目錄中的檔案中/etc/sudoers.d/
,您可以避免此手動步驟,並且升級可以自動進行。
什麼時候sudo
忽略 中的文件/etc/sudoers
?
如果您的/etc/sudoers
文件包含以下行:
#includedir /etc/sudoers.d
然後sudo
將讀取目錄中的檔案/etc/sudoers.d
。
例外情況是:
- 名稱結尾為的文件
~
- 名稱包含
.
字元的文件
這樣做 (a) 是為了方便套件管理器,(b) 是為了忽略編輯器中的備份檔案。
重要的: 請注意,上面的例外 2 非常普遍,這意味著看似合理的檔案名稱(例如mysudo.conf
或 )mysudo.txt
將被忽略,因為.
名稱中包含 。
答案3
為什麼我們有/etc/sudoers.d?
因為自動化工具(例如 Chef 或 Puppet)更容易將單一檔案放入此目錄,而不是對 進行更改/etc/sudoers
,這可能很脆弱。
中的文件/etc/sudoers.d
(實際上)是串聯的。您將在 中看到此模式的其他幾個實例/etc
,例如/etc/cron.d
和/etc/logrotate.d
。
答案4
只是對任何一般答案的一個簡短的補充...其他答案都沒有解決我的問題,那就是順序很重要。
如果您的行在 sudoers 中有效,但在 sudoers.d 中無效,請嘗試移動 #include,或更改 sudoers.d 檔案的順序(透過新增數字前綴)。看來最具體的東西應該要放在文件的前面。
我有類似的東西:
somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand
第二個沒有效果,因為第一個已經配對了。 NOPASSWD 不是條件,而是修改作業的某種方式。
這並不明顯,因為由於 sudoers.d 目錄,它不在單一檔案中。