Почему в системе есть /etc/sudoers.d? Как его редактировать?

Почему в системе есть /etc/sudoers.d? Как его редактировать?

В прошлый раз я спрашивал о риске (в /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поддержания безопасности. Текущая версия sudo в Ubuntu разрешает чтение для группы или других лиц. (Эта возможность позволяет проводить аудит доступа 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 будет считываться из стандартного ввода.

В итоге:

  1. Синтаксис:Оба visudoиvisudo -f выполнить ту же проверку синтаксиса.

  2. Разрешения/Право собственности: Как добавленная функциядля оказания помощи в администрировании крупных системфайлы, отредактированные в , visudo -fне проверяются на предмет принадлежности или разрешений: это позволяет выполнять проверку синтаксиса файла в автономном режиме или в рамках системы контроля версий.

Зачем использовать/etc/sudoers.d/

Обычно /etc/sudoersнаходится под контролем менеджера пакетов вашего дистрибутива. Если вы внесли изменения в этот файл, и менеджер пакетов хочет обновить его, вам придется вручную проверить изменения и одобрить, как они будут объединены в новую версию. Помещая локальные изменения в файл в каталоге /etc/sudoers.d/, вы избегаете этого ручного шага, и обновления могут выполняться автоматически.

Когда следует sudoигнорировать файл в /etc/sudoers?

Если ваш /etc/sudoersфайл содержит строку:

#includedir /etc/sudoers.d

затем sudoбудет читать файлы в каталоге /etc/sudoers.d.

Исключениями являются:

  1. Файлы, имена которых заканчиваются на~
  2. Файлы, имена которых содержат .символ

Это сделано (а) для удобства менеджеров пакетов, а также (б) для того, чтобы файлы резервных копий из редакторов игнорировались.

Важный: Обратите внимание, что исключение 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

А 2-й не имел никакого эффекта, потому что первый уже совпал. NOPASSWD — это не условие, а некий способ изменить действие.

И это было неочевидно, потому что файл находился не в одном файле, а в каталоге sudoers.d.

Связанный контент