系统管理员存在于所有环境的 sudoers 文件中,但其他 sudoers 不存在。不同的环境都有略微不同的 sudoers。大多数时候,90% 的用户是相同的,10% 是不同的,所以我们不能只有一个 sudoers 文件来处理所有的事情。
现在,我们使用带有 10 个不同文件的 puppet,这些文件的名称如 sudoers.production1、sudoers.production2、sudoers.production3、sudoers.testing1、sudoers.staging1 等等。
Puppet 然后根据服务器的 $domain(例如:dbserver.staging1.acme.com)或 $hardwaremodel 选择要部署的文件。它工作正常,但维护这么多文件是一场噩梦。
我想根据服务器的域自动生成 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(prod/stage/test)或最好是 1 个文件。该文件会(以某种方式)在 Puppet 服务器上生成 sudoers 文件,并向每个 Puppet 客户端发送一个自定义文件。
这样做的目的只是在单个文件中搜索用户名并比在 11 个文件中搜索更快地删除它。将用户添加到一堆环境中时,速度不会那么快,但只需要打开一个文件并查看,大大减少了遗漏的机会。
我们的 Sudo 版本是 1.6.9p8 所以我们不能使用 /sudoers.d 文件夹,只有一个 sudoers 文件。
更新2:
我一直在谷歌上搜索一些,我刚刚发现了这个,我在过去的一个小时里一直在看:
https://github.com/saz/puppet-sudo#readme
我不确定,但看起来它可能会成功。有人用过或听说过吗?
什么版本的须藤?您的 sudo 版本是否支持使用
#includedir
选项将内容分解到片段目录中/etc/sudoers.d/
?如果是这样,那么我建议您使用该功能来构建您的配置。
将您的主配置文件传送到
/etc/sudoers
其中,其中包括您控制的每个主机共有的所有设置。然后将特定于角色的配置放入/etc/sudoers.d/
.每个类或木偶部分负责更新与该类直接相关的 sudo 配置的一小部分。
您可以查看虚拟资源并了解:https ://puppet.com/docs/puppet/latest/lang_virtual.html 。
这正是这样做的:在某些系统上,您“意识到”资源,而在某些系统上则没有。
您可以使用 Puppet 模板来完成...特定于站点的配置,为您需要的用户提供一个小的 ruby 代码段/变量。(我稍后会发布一个例子)
处理此问题的传统方法是在您的
/etc/sudoers
. 管理起来可能不那么麻烦。