====== Runbook: доступ к secret-файлам, смонтированным в контейнер ======
Происхождение: OLV-3708 (май 2026) — ключ Firebase лежал ''600 root:root'', процесс в контейнере под ''www-data'' его не читал, push на мобильные не уходил неделю. Закреплено в OLV-3729.
Применяется к любому секрету (service-account JSON, ключи, сертификаты), который кладут на хост и монтируют в контейнер через bind mount (''-v /etc/<сервис>/...:/app/...:ro'').
===== 1. Кто читает файл =====
Файл читает **фактический пользователь процесса, который его использует** — не root-пользователь контейнера и не пользователь хоста, выполнившего деплой. uid/gid определяй в контейнере, не предполагай:
docker exec ps -eo user,uid,gid,args # кто реально запущен
docker exec id # uid/gid этого пользователя
Для bind mount права проверяются по **числовым** uid/gid: имя пользователя на хосте и в контейнере может не совпадать.
Пример back-auth: push отправляет консюмер шины и FPM-воркеры под ''www-data'' (uid 33, gid 33); файлы — ''/etc/firebase/back-auth/.json'' на хосте → ''/app/config/firebase/'' в контейнере.
===== 2. Как выдать доступ =====
Доступ ограничивается необходимыми субъектами средствами ОС. Чтение «для всех» стандартом не является.
Предпочтительно — группа с gid процесса:
chown root: /etc/<сервис>/ # например root:33
chmod 640 /etc/<сервис>/
chmod 750 /etc/<сервис> # каталог: root и та же группа
chown root: /etc/<сервис>
Если группу менять нельзя — ACL на конкретный uid:
setfacl -m u::r /etc/<сервис>/
setfacl -m u::x /etc/<сервис>
Не оставлять ''600''/''700 root:root'': процесс не под root файл не прочитает, а ошибка часто уходит только в лог.
===== 3. Проверка после деплоя (обязательна) =====
# процесс-потребитель читает — должно быть успешно (rc=0)
docker exec -u test -r <путь в контейнере> && echo OK
# посторонний пользователь хоста не читает — должен быть отказ (rc≠0)
sudo -u nobody test -r <путь на хосте> && echo "ПЛОХО: читается всеми" || echo OK
Пример back-auth (test, srv-app):
docker exec -u www-data tpark-it.back-auth.latest test -r /app/config/firebase/tpark-it.json && echo OK
sudo -u nobody test -r /etc/firebase/back-auth/tpark-it.json && echo "ПЛОХО" || echo OK
После смены прав перезапусти процессы сервиса: back-auth кеширует неудачу чтения ключа на время жизни процесса.
===== Известное состояние: Firebase back-auth =====
На 01.10.2026 на srv-app (test): каталог ''/etc/firebase/back-auth'' — ''711 root:root'', ''tpark-it.json'' — ''644 root:root''. Сервис ключ читает, но **известное ограничение**: любой локальный пользователь хоста, знающий путь к файлу, может прочитать ключ (проверка «посторонний — отказ» из п. 3 не проходит). Перевод на ''640'' с группой gid 33 или ACL — отдельное решение владельца; массово менять права на площадках этим runbook не предписывается.
Нечитаемый ключ Firebase в back-auth проявляется ERROR «Firebase credentials file is missing or unreadable»; контейнер и вход при этом продолжают работать.