labctl
войти регистрация

Разблокировать сервис на трёх слоях прав

имя
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

Где копать (три независимых слоя)

  1. Sudoers (/etc/sudoers.d/app-report): правило либо отсутствует,
    либо требует пароль (authenticate), либо ограничено аргументом, которого
    нет в вызове. Нужно разрешить именно appuser запускать именно
    /usr/local/bin/make-report как пользователь report без пароля.
  2. Скрипт (/usr/local/bin/make-report): executable-bit, владелец,
    посторонний аргумент. Должен быть запускаемым всеми (0755).
  3. Каталог/файл (/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

Порядок расследования — снизу вверх, от того что не работает, к корню:

  1. Что вообще нужно сделать? Запустить sudo -n /usr/local/bin/make-report
    от appuser так, чтобы в /var/run/app/report.txt оказалось report was here.
    Это требует, чтобы:
  2. sudoers разрешал appuser выполнить именно эту команду без пароля,
  3. скрипт отработал от имени report (через setuid),
  4. и report имел права писать в /var/run/app/report.txt.

  5. Слой 1 — sudoers. Запустите sudo -l -U appuser. Что в списке?
    Прочитайте /etc/sudoers.d/app-report. NOPASSWD: должен разрешать именно
    /usr/local/bin/make-report (без лишних аргументов в правиле, которые
    ломают match). После правки — visudo -cf для проверки синтаксиса.

  6. Слой 2 — сам скрипт. ls -ln /usr/local/bin/make-report. Должен быть
    исполняемым всеми (-rwxr-xr-x). Менять содержимое скрипта не нужно — он
    корректен.

  7. Слой 3 — каталог и файл. ls -ld /var/run/app и
    ls -ln /var/run/app/report.txt. Если каталог 0750 root:root — никто,
    кроме root, туда не зайдёт. Если файл 0600 root:root — только root
    прочтёт/перезапишет. Дайте report права писать (каталог и файл).

  8. Проверка. 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; без предварительной подготовки состояния проверка завершится с ошибкой.