sudo и sudoers в Linux: как выдать минимум прав

0
13
Обложка статьи: sudo и sudoers в Linux: как выдать минимум прав

Если каждому администратору выдан полный sudo без пароля, то взлом одной учётной записи равен взлому root. Ниже порядок, как выдавать права по необходимости, не ломая sudo и не теряя журнала.

Шаг 1. Правьте только через visudo

Ошибка в /etc/sudoers блокирует sudo для всех. visudo проверяет синтаксис перед сохранением. Не редактируйте файл обычным редактором.

sudo visudo
sudo visudo -f /etc/sudoers.d/webadmins     # отдельный файл для группы

Файлы в /etc/sudoers.d/ удобнее основного файла: их можно разложить по ролям и удалить одним действием. Права на такой файл должны быть 0440.

Шаг 2. Выдавайте права группам

Добавление пользователя в группу описано в статье про usermod -aG. В sudoers задайте правило для группы:

# /etc/sudoers.d/webadmins
%webadmins ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, /usr/bin/journalctl -u nginx *

Пользователи группы webadmins смогут перезапускать nginx и читать его журнал, но не получат оболочку root. Указывайте полный путь к команде.

Шаг 3. Ограничения, о которых надо знать

  • Не выдавайте sudo на редакторы и интерпретаторы (vim, less, python, find, awk). Из них запускается оболочка, и ограничение обходится. Проверяйте нужные команды на странице GTFOBins.
  • Звёздочка в аргументах разрешает больше, чем кажется. Для journalctl -u nginx * пользователь может добавить свои флаги. Если команда опасна с произвольными аргументами, перечисляйте их точно или оберните в скрипт.
  • NOPASSWD оставляйте для узких команд автоматизации, а не для ALL.

Шаг 4. Журнал и ограничения оболочки

Defaults use_pty
Defaults logfile="/var/log/sudo.log"
Defaults timestamp_timeout=5

Журнал sudo по умолчанию пишется в /var/log/auth.log (Debian/Ubuntu) или /var/log/secure (RHEL), а также в journald. Важно отправлять его на отдельный сервер: сбор логов Linux.

Шаг 5. Отзовите лишнее

getent group sudo wheel
sudo gpasswd -d USER sudo
grep -rn NOPASSWD /etc/sudoers /etc/sudoers.d/

Как проверить

sudo -l -U USER          # что разрешено пользователю
sudo visudo -c           # синтаксис всех файлов
sudo -u USER sudo -n true; echo $?    # 0 - без пароля, 1 - нужен пароль

Войдите под тестовым пользователем и убедитесь, что разрешённая команда работает, а запрещённая отвечает Sorry, user ... is not allowed to execute. Общий порядок: hardening Linux.

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