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.





















