43

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

5 ответов5

58

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

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

35

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

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

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

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

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

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

17

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

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

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

11

Другое преимущество использования 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.

1

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .