С помощью утилиты sudo совершенно не обязательно выдавать пользователю абсолютно все права, на выполнение всех команд в системе, от имени root. И для этого не обязательно добавлять юзера в группу sudo.
Возможно также разграничение прав на определенные команды для пользователя или групп пользователей.
Но прежде чем начать настраивать sudoers правила, важно запомнить:
- файл /etc/sudoers редактируется при помощи команды visudo
- остальные файлы правил создаются и редактируются командой visudo -f /etc/sudoers.d/you_file_name
- выбор удобного редактора командой update-alternatives —config editor
visudo похожа на crontab тем, что во время сохранения файла проверяет его синтаксис и не даст сохранить файл с неверным синтаксисом(что может привести к уязвимости системы).
Как частично разрешить выполнение systemctl команд определённым юзерам?
Предположим, есть пользователь username, которому необходимо разрешить управление(старт, рестарт и т.д) каким либо сервисом, без ввода пароля. Создадим файл /etc/sudoers.d/username и пропишем в нем ряд команд через запятую, или одну команду:
username ALL=NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service
или так:
username ALL=(root) NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service
Прописав команду sudo перед указанными командами, юзер сможет выполнить их без пароля. А разрешение для группы пользователей будет выглядеть так:
%usergroup ALL=(root) NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service
После внесенных изменений необходим рестарт сервиса sudo, естественно от рута:
systemctl restart sudo
Следует обратить внимание — то что прописано в каталоге /etc/sudoers.d/ должно подтягиваться из основного конфига /etc/sudoers поэтому в этом файле должно быть прописано внизу:
#includedir /etc/sudoers.d
именно так, с решеткой в начале, хоть это и выглядит как комментарий, это не простой комментарий.
Конечно, мы можем прописывать разрешения и в основном конфиг файле, но делать этого не рекомендуется.
А чтобы разрешить пользователю выполнение абсолютно всех команд без ввода пароля:
username ALL=(ALL) NOPASSWD: ALL
Базовый синтаксис sudoers
Для лучшего понимания базового синтаксиса sudo заглянем в /etc/sudoers и посмотрим на эти строки:
[...] # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL [...]
- Первое поле задаёт имя пользователя или группу, к которым нужно применить данное правило (в данном случае это root и группа sudo).
- Первое ALL значит, что правило будет применяться ко всем хостам.
- Второе ALL значит, что указанный пользователь может запускать команды в сессии любого пользователя.
- Третье ALL значит, что указанный пользователь может запускать команды в любой группе.
- Последнее ALL указывает, что эти правила нужно применять ко всем командам.
Однако в данном случае ввод первой sudo команды в группе sudo будет сопровождаться просьбой ввода пароля текущего(не root) пользователя.
[sudo] пароль для username:
В самом деле, синтаксис sudo прост как мычание! Некоторая путаница, для вникающего впервые, возникает по той причине, что параметры по умолчанию опускаются, но разбираться как именно они отрабатывают важно.
Например, команда NOPASSWD значит, что система не будет запрашивать пароль. Но также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию. Эти записи идентичны:
%sudo ALL=(ALL:ALL) ALL %sudo ALL=(ALL:ALL) PASSWD: ALL
Если в правиле не указан пользователь и группа, по умолчанию sudo использует root, именно поэтому данные записи тоже идентичны:
username ALL=NOPASSWD: command username ALL=(root) NOPASSWD: command
Для структурирования sudo прав применяются алиасы. Например в алиас sudo можно объединить несколько пользователей и затем применять к ним те или иные правила. Создадим 3 алиаса, в которых 9 пользователей:
User_Alias GROUPONE = abby, brent, carl User_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant
Имена групп должны начинаться с большой буквы. После этого можно дать пользователям GROUPTWO право на изменение БД apt-get:
GROUPTWO ALL = /usr/bin/apt-get update
В правиле не указан пользователь и группа, тут по умолчанию sudo использует root.
Затем можно разрешить пользователям группы GROUPTHREE выключать и перезапускать машину; для этого нужно создать алиас команды:
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER
Алиас команды POWER содержит команды для отключения и перезапуска машины.
Также можно создать алиас Run as, который заменяет часть правила, указывающую пользователя, в сессии которого нужно выполнить команду.
Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL
Теперь любой пользователь группы GROUPONE может выполнять команды в сессиях пользователей www-data или apache.
Примечание: Помните, что созданные ранее правила имеют более высокий приоритет в случае конфликта правил.
Блокировка правил
Существует ряд способов контроля поведения и реакции sudo на вызов.
К примеру, команда updatedb в сочетании с пакетом mlocate относительно безвредна. Чтобы обычный пользователь мог выполнять её с привилегиями суперпользователя, не вводя пароль, можно создать такое правило:
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
Команда NOPASSWD значит, что система не будет запрашивать пароль. Также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию.
NOPASSWD распространяется на всё правило, если команда PASSWD не отменяет его. Например, строка может выглядеть так:
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
Ещё одна удобная команда – NOEXEC, которая используется для предотвращения опасного поведения определенных программ. К примеру, некоторые команды, такие как less, могут вызывать другие команды:
!command_to_run
Эта команда выполняет любую команду с привилегиями пользователя, запускающего less, а это может быть очень опасно.
Чтобы запретить такое поведение, можно использовать следующую строку:
username ALL = NOEXEC: /usr/bin/less
Частично данный материал взят из источника: https://www.8host.com/blog/redaktirovanie-fajla-sudoers-v-ubuntu-i-centos/ — не впервые обнаруживаю в их блоге очень годные статьи по системному администрированию unix.
Добавление юзера sudo на сервер с авторизацией по SSH ключам