Sudoers правила. Выборочно разрешить выполнение команд пользователям без root.

С помощью утилиты sudo совершенно не обязательно выдавать пользователю абсолютно все права, на выполнение всех команд в системе, от имени root. И для этого не обязательно добавлять юзера в группу sudo.

Возможно также разграничение прав на определенные команды для пользователя или групп пользователей.

Но прежде чем начать настраивать sudoers правила, важно запомнить:

  1. файл /etc/sudoers редактируется при помощи команды visudo
  2. остальные файлы правил создаются и редактируются командой visudo -f /etc/sudoers.d/you_file_name
  3. выбор удобного редактора командой 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 ключам

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *