Как разрешить пользователю выполнять только одну команду через sudo

«Как разрешить пользователю выполнять только одну команду через sudo» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В инфраструктурных задачах часто требуется предоставить минимальные необходимые привилегии. Для ограничения пользователя одной командой через sudo я редактирую файл /etc/sudoers с помощью visudo (это обязательно для проверки синтаксиса).

Базовый синтаксис:

username ALL=(ALL:ALL) /usr/bin/systemctl restart nginx

Практические примеры из моего опыта:

  1. Для деплоя приложения (только перезапуск службы):

    deploy-user ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp-service
  2. Для мониторинга (только чтение логов):

    monitor-user ALL=(ALL) /usr/bin/tail -f /var/log/nginx/access.log
  3. Для резервного копирования (без пароля):

    backup-user ALL=(ALL) NOPASSWD: /usr/bin/rsync --server --sender *

Важные нюансы, которые я учитываю:

  • Полные пути: Всегда указываю абсолютные пути к командам для предотвращения PATH hijacking

  • Аргументы: Можно ограничивать конкретные аргументы:

    user ALL=(ALL) /usr/bin/apt-get update

    Но НЕ apt-get install *

  • Группы пользователей: Чаще использую группы для удобства управления:

    %docker-users ALL=(ALL) /usr/bin/docker *
  • Без пароля (NOPASSWD): Использую только для автоматизированных скриптов, где ввод пароля невозможен

  • Логирование: Для аудита добавляю тег LOG_INPUT и LOG_OUTPUT:

    user ALL=(ALL) LOG_INPUT: LOG_OUTPUT: /usr/bin/important-command

Проверка синтаксиса после редактирования:

visudo -c

В production средах я дополнительно настраиваю централизованный сбор логов sudo и регулярно ревьюю правила доступа.