системные администраторы присутствуют в файлах sudoers всех сред, но другие sudoers нет. В разных средах есть немного разные sudoers. В большинстве случаев 90% пользователей одинаковы, а 10% различаются, поэтому у нас не может быть только один файл sudoers для всех.
Сейчас мы используем марионетку с 10 различными файлами с такими именами, как 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:
По соображениям безопасности мы бы предпочли не объединять кучу файлов из папки, расположенной на марионеточном клиенте, на случай, если кто-то поместит туда файл (злонамеренно или нет) и либо сломает объединенный файл, либо что-то вставит в него.
Что наиболее важно, для удобства использования мы хотели бы, чтобы количество связанных с sudoers файлов (фрагментных или полных) на марионеточном сервере составляло либо 3 (prod / stage / test), либо предпочтительно 1 файл. этот файл (каким-то образом) будет генерировать файлы sudoers на марионеточном сервере и отправлять по одному настроенному файлу каждому марионеточному клиенту.
Целью этого будет только поиск имени пользователя в одном файле и его удаление быстрее, чем это делается для 11 файлов. При добавлении пользователя к группе сред это будет не так быстро, но нужно будет открыть и просмотреть только один файл, что значительно снижает вероятность упущения.
наша версия Sudo - 1.6.9p8, поэтому мы не можем использовать папку /sudoers.d, только файл sudoers.
Обновление2:
Я немного погуглил, и я только что нашел это, на что я потратил последний час, глядя на:
https://github.com/saz/puppet-sudo#readme
Я не уверен, но похоже, что это может помочь. Кто-нибудь им пользовался или слышал об этом?
Какая версия sudo? Ваша версия sudo поддерживает использование #includedir
возможность разбить вещи на каталог фрагментов /etc/sudoers.d/
?
Если да, то я предлагаю вам использовать эту функциональность для создания вашей конфигурации.
Ваш основной файл конфигурации доставлен в /etc/sudoers
который включает в себя все настройки, общие для каждого хоста, которым вы управляете. Затем поместите конфигурацию для конкретной роли в файл внутри /etc/sudoers.d/
.
Каждый класс или секция марионетки отвечает за обновление небольшой части конфигурации sudo, непосредственно связанной с этим классом.
Вы можете взглянуть на виртуальные ресурсы и понять: https://puppet.com/docs/puppet/latest/lang_virtual.html.
Это именно так: в некоторых системах вы «осознаете» ресурс, а в некоторых - нет.
Вы можете использовать шаблоны Puppet ... Конфигурация для конкретного сайта с небольшим фрагментом / переменной ruby для нужного вам пользователя. (Пример я выложу позже)
Традиционный способ справиться с этим - использовать определения групп вместо именованных пользователей в вашем /etc/sudoers
. Управлять этим, возможно, будет проще.