Почему в системе есть файл /etc/sudoers.d? Как мне это отредактировать?

48

В прошлый раз я спросил о риске этого (в / 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 ?

аоЬ
источник

Ответы:

45

Изменения, внесенные в файлы, /etc/sudoers.dостаются в силе при обновлении системы. Это может предотвратить блокировку пользователя при обновлении системы. Ubuntu любит это поведение. Другие дистрибутивы также используют этот макет.

По моему опыту, правила для файлов в этом каталоге более строгие, чем для /etc/sudoers. Это включает в себя:

  • Ошибки в файле не вызывают sudoсбой. Тем не менее, файл был проигнорирован.
  • Правила доступа кажутся менее строгими. Это позволяет соответствующей группе или другому читать файл. Я не верю, что это было возможно с /etc/sudoers. Разрешения на запись должны быть ограничены rootдля поддержания безопасности. Текущая версия sudo для Ubuntu предоставляет разрешения на чтение для группы или других пользователей. (Эта возможность позволяет проверять доступ sudo, не требуя root-доступа.)

Команда visudoтолько по умолчанию /etc/sudoers. Он отредактирует и проверит любой файл, который вы укажете с помощью -fопции. Я использую эту возможность для редактирования файлов, которые будут автоматически установлены как /etc/sudoersили в /etc/sudoders.d. Однако определения из других файлов могут быть не найдены. Лучше сделать файл независимым.

Возможность иметь автономные файлы упрощает для приложения sudoвозможность установки и удаления их, когда оно не установлено. Инструменты автоматической настройки также могут использовать эту возможность.

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

BillThor
источник
1
Две упомянутые вами особенности sudoers.d кажутся действительно важными и полезными. Спасибо!
аоЬ
Смотрите мой ответ и предупреждение о том, почему на самом деле это не черты sudoers.d.
dragon788
1
Категорически не согласен с утверждением «Ошибки в файле не приводили sudoк сбою». Я сломал sudo на RHEL с неверным синтаксисом в файле из /etc/sudoers.d. Это потребовало значительных усилий для исправления, и я думаю, что рекомендуется всегда использовать visudo -fдля редактирования этих файлов.
79E09796
@ 79E09796 Я сломал файлы в /etc/sudoers.d, не вызывая проблем с правилами в других файлах. YMMV. Если вы нарушите конфигурацию sudo, которая приведет вас в систему, у вас будут проблемы. Если у вас есть доступ для перезагрузки системы, сравнительно легко перезагрузиться в режиме восстановления и исправить файл. Я согласен с тем, что лучше всего использовать visodo для редактирования или, по крайней мере, проверки изменений в файлах конфигурации sudo.
BillThor
62

Да, вы можете использовать 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. Файлы, имена которых содержат .символ

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

John1024
источник
Спасибо, но у меня есть одно сомнение. Является ли visudo -fбезопасно?
аоЬ
5
Да, visudo -fредактируется безопасным способом, как обычно visudo. Вот почему у нас есть visudoи почему он предоставляет -fвозможность.
John1024
Замечание о том, как разрешения игнорируются при использовании, так -fкак это может сделать байт кому-то, кто затем скопирует его в /etc/sudoers.d/ без двойной проверки.
dragon788
1
СПАСИБО за раздел исключений. Я назвал свой файл как-то так /etc/sudoers.d/mysudorules.sudoи не смог понять, почему правила внутри не были применены, прежде чем читать твой ответ.
Zaroth
1
Спасибо за упоминание исключений. Мой файл под /sudoers.d/mysite.co.ukне работал и после переименования в mysiteнего работает! :)
J86
20

почему у нас /etc/sudoers.d?

Потому что автоматизированным инструментам (таким как Chef или Puppet) проще помещать отдельные файлы в этот каталог, а не вносить изменения /etc/sudoers, которые могут быть хрупкими.

Файлы в /etc/sudoers.d(по сути) объединены. Вы увидите несколько других экземпляров этого шаблона /etc, например, /etc/cron.dи /etc/logrotate.d.

Роджер Липскомб
источник
Я не знал, что есть другие подобные каталоги. Спасибо.
аоЬ
14

Другое преимущество использования, visudo -fкак упомянуто в некоторых ответах, заключается в наличии соответствующей опции -cили --checkпроверки того, что у вас нет неверной информации в файле sudoers.d или в любом другом файле, который вы, возможно, захотите поместить в sudoers.d. Это действительно удобно в случаях, упомянутых с помощью автоматизированных инструментов, так как вы можете запустить, например,

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

Это автоматически проверяет файл (нет вывода из-за -q) и только если это НЕ возвращает ошибку (выход 1 означает недопустимый файл sudoers), тогда он скопирует файл в sudoers.d, таким образом, вы можете создать файл и работать над этим без необходимости делать это правильно с первого раза (использование sudo visudo -f /etc/sudoers.d/myfileдолжно быть успешным или оно отбрасывает содержимое, если вы не исправите это).

Также, предостережение относительно этих утверждений из других ответов.

По моему опыту, правила для файлов в этом каталоге более строгие, чем для / etc / sudoers. Это включает в себя:

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

Файлы в /etc/sudoers.d должны придерживаться того же синтаксиса, что и / etc / sudoers, потому что под прикрытием система просто объединяет все файлы с последним в «победе», если есть несколько записей для одного и того же особая обстановка.

Если права доступа к файлам в /etc/sudoers.d/ ужасно неверны (доступны для записи), то они игнорируются, возможно, именно из-за этого пропущены неверные файлы, в противном случае вы можете серьезно нарушить sudoкоманду, имея недопустимые sudoers. D файл с правильными разрешениями.

Вы можете позволить файлам sudoers быть доступными для чтения всем, если вы случайно разрешите «другому» разрешение на запись, которое вам нужно sudo как другой пользователь или из корневого терминала, запустите эту команду. Это также может сломаться, если файл принадлежит кому-то, кроме root: root.

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

Я только что подтвердил, что если я бегу, chmod o+w /etc/sudoers.d/vagrantя больше не могу использовать sudo в качестве бродячего пользователя, он запрашивает у меня пароль и затем терпит неудачу.

Когда я запустил sudo -lпросмотр разрешений для примененной команды как другой действительный пользователь sudo, я также получил предупреждение о разрешениях для файлов. Это та же команда, которую я использовал, чтобы подтвердить, что «бродячий» пользователь потерял sudo, когда я применил o+wразрешения к файлу, предоставив этому пользователю разрешения sudo.

dragon788
источник
3

Просто краткое дополнение к любому общему ответу ... ни один из других ответов не устранил мою проблему, которая заключалась в том, что порядок имеет значение.

Если ваши строки работают в sudoers, но не в sudoers.d, попробуйте переместить #include или изменить порядок файлов sudoers.d (с помощью префикса с номером). Кажется, что наиболее конкретная вещь должна быть первой в файле.

У меня было что-то вроде:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

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

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

Питер
источник