sudoers (правила sudo)
sudoers это файл политики, /etc/sudoers и файлы в /etc/sudoers.d, который сообщает sudo, какие пользователи могут запускать какие команды от имени каких других пользователей, на каких хостах и нужен ли пароль. Его правят через visudo, которая проверяет синтаксис перед сохранением, потому что сломанный файл может оставить всех без sudo.
Устройство правила sudoers
В руководстве по sudoers правило описано схемой «who where = (as_whom) what». Например:
alan ALL = (root, bin : operator, system) ALL
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
Пользователь задаётся именем, #uid для числового идентификатора или %group для группы. ALL это зарезервированное слово, которое подходит всегда. Команды записываются полными именами файлов, а теги NOPASSWD и PASSWD задают поведение по умолчанию для следующих за ними команд.
Алиасы делают правила читаемыми. Их четыре типа: User_Alias, Runas_Alias, Host_Alias и Cmnd_Alias. Имена состоят из заглавных букв, цифр и подчёркиваний и должны начинаться с заглавной буквы, а повторное определение алиаса считается синтаксической ошибкой.
User_Alias WEBTEAM = alice, bob
Cmnd_Alias NGINXCTL = /usr/bin/systemctl reload nginx, /usr/bin/systemctl restart nginx
WEBTEAM ALL = (root) NGINXCTL
Порядок важен: sudo применяет записи по очереди, и побеждает последнее совпадение, которое, как подчёркивает руководство, не обязательно самое точное. Общие правила ставьте раньше, исключения позже.
/etc/sudoers.d и ловушка с именами файлов
Во многих дистрибутивах основной файл подключает каталог строкой @includedir /etc/sudoers.d. Это правильное место для своих правил, по одному файлу на задачу, чтобы обновления пакетов их не затирали. Для каталога руководство называет два правила:
- Файлы, имена которых заканчиваются на
~или содержат., пропускаются. Файл90-deploy.confбудет молча проигнорирован, поэтому называйте файлы вроде90-deploy. - Файлы читаются в отсортированном лексикографическом порядке, а не в порядке версий, поэтому
1_whoopsзагрузится после10_second. Используйте единообразные ведущие нули: более поздний файл может переопределить более ранний.
Создавайте и проверяйте файлы через visudo: она блокирует файл, разбирает его и отказывается сохранять при синтаксической ошибке:
sudo visudo -f /etc/sudoers.d/90-deploy
sudo visudo -c
sudo visudo -cf /etc/sudoers.d/90-deploy
Согласно руководству visudo, -c проверяет файл и его включения, а без указания пути ещё и владельца с правами. Код возврата 0 при успехе и 1 при ошибке. Если в запросе есть вариант Q (выйти и сохранить), не выбирайте его: sudo такой файл тоже отвергнет.
Узкое правило и его проверка
Безопасное правило называет одну учётную запись, одного целевого пользователя и одну точную команду. Это правило позволяет учётной записи деплоя перезапускать один сервис без пароля и больше ничего:
deploy ALL = (root) NOPASSWD: /usr/bin/systemctl restart myapp
Проверьте его с обеих сторон. От администратора выведите список разрешённого. От имени самой учётной записи сбросьте кэшированные учётные данные ключом -k и выполните команду неинтерактивно с -n: если потребовался бы пароль, sudo завершится с ошибкой вместо запроса:
sudo -l -U deploy
sudo -k; sudo -n systemctl restart myapp
sudo -n systemctl status myapp
Последняя команда должна быть отклонена: так видно, что правило не шире задуманного. По руководству sudo, -U выводит привилегии другого пользователя и доступен root и пользователям с подходящим разрешением.
Избегайте приёмов, о которых предупреждает руководство. «Вычитать» команды из ALL оператором !, по его словам, как правило неэффективно, а пользователь с ALL может создать собственную программу. Шаблоны в аргументах могут совпасть с пробелами и слэшами. Из редакторов и постраничных просмотрщиков можно выйти в оболочку, если не добавить NOEXEC или, лучше, не использовать sudoedit.
Defaults и место sudoers в укреплении сервера
Строки Defaults меняют поведение sudo глобально или для пользователя, хоста либо команды. Руководство называет такие встроенные значения:
env_resetвключён по умолчанию и запускает команды в минимальном окружении.timestamp_timeoutпо умолчанию 5 минут, а 0 означает всегда спрашивать пароль.use_ptyвключён по умолчанию в sudo 1.9.14 и новее.secure_pathпо умолчанию отключён, хотя дистрибутив может его задавать.
sudoers управляет привилегиями только тех, у кого уже есть учётная запись. Он отделён от UID 0, ведь учётная запись с UID 0 и так обладает всеми правами независимо от настроек sudo. Сочетайте его с отключённым входом под root, SSH по ключам из руководства по защите SSH и аудитом учётных записей из руководства по пользователям, sudo и минимальным привилегиям, где также сказано об обновлении самого sudo.
Пересматривайте /etc/sudoers.d по расписанию. Каждый файл там это постоянная выдача привилегий, а упомянутые в нём записи из /etc/passwd должны по-прежнему существовать и быть нужными.
Связанные термины: Минимальные привилегии, UID 0, /etc/passwd, Вход под root, Двухфакторная аутентификация, sudo (выполнение команд с правами root).
Часто задаваемые вопросы
Для чего нужен файл sudoers?
Он определяет, какие пользователи и группы могут запускать какие команды от имени каких других пользователей через sudo, на каких хостах и с паролем или без. Он лежит в /etc/sudoers, а дополнительные правила в /etc/sudoers.d.
Почему нужно использовать visudo, а не обычный редактор?
visudo блокирует файл и проверяет синтаксис перед сохранением, а файл с ошибками сохранять отказывается. Синтаксическая ошибка, сохранённая вручную, может сломать sudo для всех, что опасно при отключённом входе под root.
Почему файл в /etc/sudoers.d игнорируется?
Файлы, имена которых заканчиваются на ~ или содержат точку, пропускаются. Переименуйте файл вида deploy.conf в deploy и проверьте командой visudo -c.
Что делает NOPASSWD?
Этот тег позволяет подходящим командам выполняться через sudo без запроса пароля. Применяйте его только в узких правилах, например для одной точной команды одной служебной учётной записи.
Какое правило выигрывает, если подходит несколько?
Используется последняя подходящая запись, и она не обязательно самая точная. Упорядочивайте правила и имена файлов в sudoers.d с учётом этого.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab