Linux

如何根據部署到的環境在 puppet 中生成自定義的 sudoers 文件?

  • April 21, 2020

系統管理員存在於所有環境的 sudoers 文件中,但其他 sudoers 不存在。不同的環境都有稍微不同的 sudoers。大多數時候,90% 的使用者是相同的,而 10% 的使用者是不同的,所以我們不能只用一個 sudoers 文件來處理所有事情。

現在,我們正在使用具有 10 個不同文件的 puppet,其名稱包括 sudoers.production1、sudoers.production2、sudoers.production3、sudoers.testing1、sudoers.staging1 等等。

Puppet 然後根據伺服器的選擇選擇要部署的文件 $ domain (ex: dbserver.staging1.acme.com) or $ 硬體模型。它工作正常,但維護這麼多文件是一場噩夢。

我想根據伺服器的域自動生成 sudoers 文件,並且只有一個大文件具有所有使用者和所有環境的所有 sudoers 權限。看起來像:

User_Alias ADMINS = abe, bob, carol, dave

case $domain {
"staging1.acme.com" {
   #add dev1,dev2,tester1,tester2 to sudoers file 
 }
"testing2.acme.com" {
   #add tester1, tester3, tester4 to sudoers file
 }    

解決這個問題的最佳方法是什麼?歡迎提出替代方案的建議。我會很感激任何提示。

更新1:

出於安全原因,我們寧願不要從位於 puppet 客戶端的文件夾中連接一堆文件,以防有人將文件放入其中(無論是否惡意)並破壞組合文件或在其中插入某些內容。

最重要的是,為了可用性,我們希望將 puppet 伺服器上與 sudoers 相關的文件(片段或完整)的數量保持在 3 個(產品/階段/測試)或最好是 1 個文件。該文件將(以某種方式)在 puppet 伺服器上生成 sudoers 文件,並向每個 puppet 客戶端發送一個自定義文件。

這樣做的目的是僅在單個文件中搜尋使用者名,並比在 11 個文件中更快地刪除它。將使用者添加到一堆環境中時,它不會那麼快,但只需要打開並查看一個文件,大大減少了遺漏的機會。

我們的 Sudo 版本是 1.6.9p8,所以我們不能使用 /sudoers.d 文件夾,只能使用 sudoers 文件。

更新2:

我一直在Google上搜尋一些,我剛剛發現了這個,我花了一個小時在看:

https://github.com/saz/puppet-sudo#readme

我不確定,但看起來它可能會奏效。有人用過或聽說過嗎?

什麼版本的sudo?您的 sudo 版本是否支持使用#includedir選項將內容分解為片段目錄/etc/sudoers.d/

如果是這樣,那麼我建議您使用該功能來建構您的配置。

將您的主配置文件傳送到/etc/sudoers該文件,其中包含您控制的每個主機共有的所有設置。然後將角色特定的配置放入/etc/sudoers.d/.

每個類或 puppet 部分負責更新與該類直接相關的 sudo 配置的一小部分。

引用自:https://serverfault.com/questions/455008