Запуск сервиса с нужным пользователем

LinuxBeginner
Практиковаться сейчас

Введение

Конфигурация приложения отчётов уже доступна только для чтения, но само приложение работает как root. Вы обслуживаете его и выбираете подготовленного пользователя, сохраняя реальное создание документов.

В этой независимой среде есть собственный контейнер отчётов и данные. Вы изучите UID и владельца выходного каталога, измените уже знакомое описание запуска, затем пересоздадите и проверите сервис. Сначала завершите «Защита подключённой конфигурации».

Знакомство с пользователем приложения

На этом шаге установите нормальное поведение сервиса и различите пользователя обслуживания и пользователя процесса контейнера. В новой среде конфигурация уже смонтирована только для чтения, но генератор работает как root.

Используйте Maintenance, открывающийся в /home/labex/project/report-desk. Терминал управляет только подготовленным report-renderer. При необходимости вернитесь через cd /home/labex/project/report-desk. sudo docker exec просит Docker выполнить команду внутри цели. id показывает числовой идентификатор пользователя (UID) и группы (GID):

sudo docker exec report-renderer id
uid=0(root) gid=0(root) groups=0(root)

UID 0 — root внутри контейнера, имеющий больше прав на доступные файлы, чем нужно приложению. Root контейнера не администрирует отдельную VM: контейнеры используют общее ядро хоста. Упражнение сокращает файловый доступ, а не все возможные риски контейнеров.

Подготовленный пользователь имеет UID/GID 1200:1200. Числовые ID работают без добавления именованной учётной записи в образ. Владелец каталога хоста должен разрешать этому пользователю запись. ls -ldn показывает сам каталог (-d), подробные права (-l) и числовые ID (-n):

ls -ldn output

Найдите drwxr-xr-x и владельца/группу 1200 1200. Владелец имеет rwx: чтение, запись и проход по каталогу. Остальные имеют r-x: чтение и проход, без записи. Среда подготовила каталог для нужного пользователя.

Создайте исходный документ знакомым POST-запросом. curl -fsS сообщает об HTTP-ошибках, а -X POST запрашивает бизнес-действие:

curl -fsS -X POST http://localhost:8090/render/baseline
{"saved": "/output/baseline.json", "total": 37, "uid": 0}

Отчёт работает, но создан UID 0. Откройте Document Desk, чтобы увидеть сохранённый документ; страница перечисляет реальные выходные файлы.

Выбор подготовленного пользователя

На этом шаге измените пользователя в описании запуска, сохраняя необходимый доступ к файловой системе. cat показывает скрипт:

cat launch.sh

sudo разрешает управление хостом. Отдельно --user определяет пользователя и группу приложения контейнера. 0:0 означает UID 0 и GID 0, а 1200:1200 выбирает подготовленного пользователя. Сохраните порт 8090, образ и оба пути монтирования. Строка конфигурации уже содержит dst=/config,readonly; выходное монтирование должно оставаться записываемым.

Откройте терминальный редактор:

nano launch.sh

Стрелками замените только --user 0:0 на --user 1200:1200. Сохраните через Ctrl+O, Enter, выйдите через Ctrl+X. Снова покажите файл:

cat launch.sh

Строка пользователя должна выглядеть так:

  --user 1200:1200 \

Изменение описания не обновляет работающий процесс. Перед пересозданием явно задайте нужного владельца выходного каталога. chown задаёт числового владельца и группу; нужен sudo, поскольку эти ID отличаются от пользователя обслуживания хоста. Изменяется только каталог, а не все существующие файлы в нём:

sudo chown 1200:1200 output

Не делайте всё доступным только для чтения: создание документа требует записи в выходной каталог. Не выдавайте всем запись для обхода проблемы владельца; подготовленный владелец может писать с существующими правами каталога 755.

Пересоздание с сохранением бизнес-результата

На этом шаге примените нового пользователя и проверьте нормальную запись документов и защиту входных данных. Как раньше, удалите только целевой контейнер и запустите замену:

sudo docker rm -f report-renderer
bash launch.sh

При ошибке запуска исправьте launch.sh через nano, удалите неудачный контейнер той же командой и снова выполните скрипт. Данные хоста сохраняются. Проверьте работающего пользователя:

sudo docker exec report-renderer id
uid=1200 gid=1200 groups=1200

Подождите немного после запуска и создайте итоговый документ:

curl -fsS -X POST http://localhost:8090/render/final
{"saved": "/output/final.json", "total": 37, "uid": 1200}

Permission denied обычно означает неверного владельца выходного каталога или final.json, ранее созданный root. Исправьте каталог знакомой командой sudo chown 1200:1200 output. Если существует старый итоговый файл, sudo rm output/final.json удаляет только этот документ; запросите его снова. Read-only file system для /output означает, что выходное монтирование ограничено по ошибке: исправьте описание и пересоздайте контейнер.

Изучите созданный файл. ls -ln показывает числового владельца, cat — содержимое:

ls -ln output/final.json
cat output/final.json

Найдите владельца 1200, "uid": 1200, сумму 37 и Report for Harbor Books: 37 orders. Обновите Document Desk, чтобы увидеть файл. В конце подтвердите сохранение защиты конфигурации:

sudo docker exec report-renderer touch /config/probe.txt
touch: /config/probe.txt: Read-only file system

Этот отказ ожидаем. Пользователь без root-прав и монтирование только для чтения решают разные задачи: выбор UID сокращает права процесса, а режим монтирования запрещает запись конфигурации даже root внутри контейнера. Генератор продолжает выполнять настоящую задачу.

Резюме

Вы отделили обслуживание хоста от пользователя приложения, выбрали UID/GID 1200 и сохранили выходной каталог. Работающий процесс и новый документ теперь используют UID 1200, а запись в конфигурацию по-прежнему запрещена.