Разблокировать сервис на трёх слоях прав
- имя
perms-layered- образ
python:3.12-slim- таймаут
- 30с
Задание
Разблокировать сервис на трёх слоях прав
Пользователь appuser должен уметь выполнить команду
sudo -n -u report /usr/local/bin/make-report без пароля и чтобы она
отработала от имени пользователя report (то есть скрипт, пишущий в
/var/run/app/report.txt, должен это делать от report, а не от appuser).
Скрипт make-report сам по себе корректен — его трогать не нужно. Поломка
раскидана по трём слоям конфигурации.
$ su -s /bin/sh appuser -c 'sudo -n -u report /usr/local/bin/make-report'
$ cat /var/run/app/report.txt
report was here
Где копать (три независимых слоя)
- Sudoers (
/etc/sudoers.d/app-report): правило либо отсутствует,
либо требует пароль (authenticate), либо ограничено аргументом, которого
нет в вызове. Нужно разрешить именноappuserзапускать именно
/usr/local/bin/make-reportкак пользовательreportбез пароля. - Скрипт (
/usr/local/bin/make-report): executable-bit, владелец,
посторонний аргумент. Должен быть запускаемым всеми (0755). - Каталог/файл (
/var/run/app/,report.txt): права не даютreport
писать туда, либо файл принадлежит root с режимом 0600.
Каждый слой сам по себе блокирует успех. Чините все три.
Почему это hard
Реальный production-инцидент: «почему у пользователя нет прав?». Причин может
быть 5 (sudoers, ACL, файловые права, права каталога, umask), и угадывание не
работает — нужно последовательно проверить каждый слой инструментами
(sudo -l, ls -ln, stat, namei -l, getfacl). Лаба учит именно этому
порядку расследования.
Подсказки по инструментам
sudo -l -U appuser— что appuser может через sudo?ls -ln /usr/local/bin/make-report /var/run/app /var/run/app/report.txt—
цифровые uid/gid + режим.stat -c '%A %U:%G %n' ...— то же, человечнее.visudo -cf /etc/sudoers.d/app-report— проверка синтаксиса sudoers.
Подсказки
Hints: perms-layered
Порядок расследования — снизу вверх, от того что не работает, к корню:
- Что вообще нужно сделать? Запустить
sudo -n /usr/local/bin/make-report
отappuserтак, чтобы в/var/run/app/report.txtоказалосьreport was here.
Это требует, чтобы: - sudoers разрешал appuser выполнить именно эту команду без пароля,
- скрипт отработал от имени
report(через setuid), -
и
reportимел права писать в/var/run/app/report.txt. -
Слой 1 — sudoers. Запустите
sudo -l -U appuser. Что в списке?
Прочитайте/etc/sudoers.d/app-report.NOPASSWD:должен разрешать именно
/usr/local/bin/make-report(без лишних аргументов в правиле, которые
ломают match). После правки —visudo -cfдля проверки синтаксиса. -
Слой 2 — сам скрипт.
ls -ln /usr/local/bin/make-report. Должен быть
исполняемым всеми (-rwxr-xr-x). Менять содержимое скрипта не нужно — он
корректен. -
Слой 3 — каталог и файл.
ls -ld /var/run/appи
ls -ln /var/run/app/report.txt. Если каталог0750 root:root— никто,
кроме root, туда не зайдёт. Если файл0600 root:root— только root
прочтёт/перезапишет. Дайтеreportправа писать (каталог и файл). -
Проверка.
su -s /bin/sh appuser -c 'sudo -n -u report /usr/local/bin/make-report'
затемcat /var/run/app/report.txtдолжно показатьreport was here.
Замечание про setuid: на современных ядрах setuid на shell-скриптах
игнорируется (из-за IFS-атаки). Поэтому в этой лабе правильный путь —
через Runas в sudoers ((report) NOPASSWD:), а не через setuid-бит на
скрипте. Цель — научить студента разнице между этими двумя механизмами
получения чужих прав.
Терминал
Закрывается при остановке сессии.
Последние попытки
- Загрузка…
Разовый запуск (smoke-тест)
Атомарный цикл up → check → down. Полезно для CI; без предварительной подготовки состояния проверка завершится с ошибкой.