Вопрос или проблема
Операционная система: Arch Linux
Версия Linux: 4.16.11
Версия Sudo: 1.8.23
Что мне нужно:
- будет возможность выполнить
любой исполняемый файл
сsudo
с запросом пароля - будет возможность выполнить один исполняемый файл,
/home/username/script.sh
, без запроса пароля.
Когда я настраиваю так
username ALL=(ALL) NOPASSWD: /home/username/script.sh
У меня есть желаемый эффект на script.sh
, но я не могу выполнить любой другой исполнимый файл
с sudo
.
Пример
$ sudo ./script.sh # работает отлично!
Попробуйте что-то другое
$ sudo nano /etc/sudoers
[sudo] пароль для username:
Извините, пользователю username не разрешено выполнять '/usr/bin/nano
/etc/sudoers' как root на hostname.
Кажется, это результат замены ALL
на NOPASSWD
, и, кажется, мне нужны оба.
Если файл sudoers
имеет ALL
для пользователя, я могу выполнить что угодно с запросом пароля
username ALL=(ALL) ALL
Я пытался комбинировать ALL и NOPASSWD, но без результатов
username ALL=(ALL) ALL, NOPASSWD: /home/username/script.sh
Таким образом, он запрашивает пароль для script.sh
.
Могу ли я иметь оба?
man 5 sudoers
говорит:
Когда несколько записей соответствуют пользователю, они применяются по порядку. Если есть несколько совпадений, используется последнее совпадение (которое не обязательно самое конкретное совпадение).
Поэтому у вас должны быть эти строки именно в таком порядке:
username ALL=(ALL) ALL
username ALL=(ALL) NOPASSWD: /home/username/script.sh
и любая строка, которая также соответствует (например, %sudo ALL=(ALL:ALL) ALL
) должна быть перед строкой NOPASSWD
.
Общая заметка: #include
и #includedir
позволяет sudoers
включать другие файлы. Начиная с версии 1.9.1, рекомендуемые директивы — это @include
и @includedir
соответственно, но #include
и #includedir
все еще принимаются. Не позволяйте #
вводить вас в заблуждение, это не комментарии. При поиске записей, которые могут мешать, не следует упускать из виду то, на что указывают #include
и #includedir
. Полезная опция: sudo -l
.
Вы часто найдете такую строку в /etc/sudoers
:
# Разрешить членам группы sudo выполнять любые команды
%wheel ALL=(ALL:ALL) ALL
Это позволит любому пользователю, который находится в группе “wheel“, использовать sudo
с соответствующим подтверждением личности (например: их пароль). Названная группа также может быть “sudo“, “admin“, или другими… (например: строка начинается с %sudo
)
Если это присутствует в файле, тогда выполните id
, чтобы увидеть, в каких группах вы находитесь:
$ id
uid=1000(attie) gid=1000(attie) группы=1000(attie),27(sudo),117(docker)
Если ваш пользователь не находится в соответствующей группе, тогда вы должны добавить своего пользователя в эту группу.
Альтернативой будет перечислить оба ваших правила одно за другим, при этом последнее соответствующее правило вступает в силу (т.е. порядок важен):
username ALL=(ALL) ALL
username ALL=(ALL) NOPASSWD: /home/username/script.sh
См. страницу ArchWiki на sudo: https://wiki.archlinux.org/index.php/sudo#Example_entries
.
Ответ или решение
Настройка sudoers в Linux является важной задачей для управления разрешениями пользователей при выполнении команд с административными правами. Рассмотрим проблему, описанную вами, и как её решить, учитывая особенности работы sudoers.
Теория
Файл конфигурации sudoers определяет, какие пользователи могут выполнять какие команды от имени других пользователей, включая суперпользователя root. Этот файл использует формат с определёнными правилами синтаксиса и предоставляет возможность гибкого управления доступом на выполнение команд. Обычно, записи в файле sudoers записываются в формате:
<пользователь> <хост>=<(пользователь назначения)> <список команд>
Одним из полезных флагов в конфигурации является NOPASSWD
, который позволяет выполнять указанные команды без запроса пароля. Однако, соблюдение порядка записи является ключевым, так как если несколько правил попадают под одну и ту же команду, применяется только последнее.
Пример
Для вашей ситуации вы хотите, чтобы пользователь мог:
- Выполнять любые команды с использованием
sudo
с запросом пароля. - Выполнять определённый скрипт, а именно
/home/username/script.sh
, без запроса пароля.
Вы столкнулись с проблемой, что после добавления условия с NOPASSWD
, выполнение других команд средней sudo стало невозможным. Ваша запись:
username ALL=(ALL) NOPASSWD: /home/username/script.sh
решает задачу выполнения script.sh
без запроса пароля, но остальные команды sudo с паролем становятся недоступными. Причина в том, что запись NOPASSWD
перезаписывает общий доступ на выполнение всех команд.
Приложение
Чтобы решить вашу задачу, необходимо скорректировать файл sudoers так, чтобы учитывать как общее разрешение на команды с запросом пароля, так и специфическое разрешение для выполнения скрипта без пароля. Используя знания о применении последнего правила, вы можете записать конфигурацию следующим образом:
username ALL=(ALL) ALL
username ALL=(ALL) NOPASSWD: /home/username/script.sh
Важный аспект — порядок размещения записей. Первая строка обеспечивает доступ на выполнение любых команд с запросом пароля, а вторая строка обеспечивает исключение для конкретного скрипта без запроса пароля, благодаря её размещению после первой.
Дополнительные моменты
-
Проверьте включение в группы. Убедитесь, что ваша учётная запись включена в нужную группу, если это требуется для выполнения команд. Это можно сделать командой
id
, чтобы проверить директории и группы. -
Рассмотрите файлы и директории, загружаемые при помощи включений. Использование директив
#include
и#includedir
в файле sudoers приводит к дополнительным файлам конфигурации, которые могут повлиять на окончательный результат. Проверьте все загружаемые файлы для исключения конфликта. -
Проверка конфигурации. Используйте команду
sudo -l
, чтобы проверить актуальные разрешения на выполнение команд. Это поможет увидеть, какое правило применяется в текущий момент. -
Аргенинская вики. Рекомендуется посмотреть также руководство на ArchWiki, где можно найти дополнительные примеры использования sudo и советы по конфигурированию.
Применяя данные рекомендации, вы сможете корректно настроить файл sudoers для достижения необходимого функционала. Это позволит вам поддерживать безопасность системы и в то же время обеспечить удобство использования через возможность выполнения определённых задач без постоянного ввода пароля.