Dev-база и загрузки попадают в Docker-образ: .dockerignore не исключает backend/data/ #71

Closed
opened 2026-09-14 19:55:12 +03:00 by Agent · 1 comment
Collaborator

Проблема

В .dockerignore данные дева исключаются правилами data/ и backend/*.db. В .dockerignore шаблоны отсчитываются от корня контекста сборки, и data/ без **/ совпадает только с корневой папкой ./data. backend/*.db покрывает только файлы прямо в backend/.

Dev-данные лежат в backend/data/dev/ (DEV_DATABASE_URL=sqlite:///./data/dev/forbidden_stars.db при запуске из backend/). Dockerfile делает COPY backend/ /app/, поэтому вся папка попадает в образ.

Подтверждение

Локальный образ forbidden-stars:temp-prod (собран 2026-06-26):

$ docker run --rm --entrypoint sh forbidden-stars:temp-prod -c "ls -la /app/data/dev"
-rwxr-xr-x 1 appuser appuser 241664 forbidden_stars.db
-rwxr-xr-x 1 appuser appuser  32768 forbidden_stars.db-shm
-rwxr-xr-x 1 appuser appuser 576832 forbidden_stars.db-wal
drwxr-xr-x 1 appuser appuser   4096 uploads

scripts/build-push.ps1 собирает прод-образы (docker buildx bake -f docker-compose.yml) с того же контекста, поэтому образ gitea.arseniev.info/notbigghost/forbidden-stars в реестре почти наверняка содержит ту же dev-БД на момент сборки. Это вывод из того же .dockerignore, сам образ из реестра не проверялся.

Прод эти файлы не использует (у него /data на томе), но они лежат в каждом слое образа: пользователи dev-базы, хеши паролей, аудит с IP, загруженные фото. Кто может сделать pull, тот может их достать. Попутно в образ уходит forbidden_stars_backend.egg-info от pip install -e.

Что сделать

  • В .dockerignore заменить/дополнить правила: backend/data/ (или **/data/), **/*.db, **/*.db-wal, **/*.db-shm, backend/*.egg-info/.
  • Пересобрать и перепушить образы (scripts/build-push.ps1) и проверить, что в /app/data пусто.
  • Удалить из реестра старые теги/манифесты с dev-данными (или хотя бы убедиться, что реестр приватный).
  • Если в dev-базе когда-либо были реальные данные (например, копия прода), считать их скомпрометированными в пределах доступа к реестру.

Найдено при сверке документации с кодом: README утверждает, что «данные дева в образ не попадают (data/ в .dockerignore)».

## Проблема В `.dockerignore` данные дева исключаются правилами `data/` и `backend/*.db`. В `.dockerignore` шаблоны отсчитываются от корня контекста сборки, и `data/` без `**/` совпадает **только с корневой** папкой `./data`. `backend/*.db` покрывает только файлы прямо в `backend/`. Dev-данные лежат в `backend/data/dev/` (`DEV_DATABASE_URL=sqlite:///./data/dev/forbidden_stars.db` при запуске из `backend/`). `Dockerfile` делает `COPY backend/ /app/`, поэтому вся папка попадает в образ. ## Подтверждение Локальный образ `forbidden-stars:temp-prod` (собран 2026-06-26): ``` $ docker run --rm --entrypoint sh forbidden-stars:temp-prod -c "ls -la /app/data/dev" -rwxr-xr-x 1 appuser appuser 241664 forbidden_stars.db -rwxr-xr-x 1 appuser appuser 32768 forbidden_stars.db-shm -rwxr-xr-x 1 appuser appuser 576832 forbidden_stars.db-wal drwxr-xr-x 1 appuser appuser 4096 uploads ``` `scripts/build-push.ps1` собирает прод-образы (`docker buildx bake -f docker-compose.yml`) с того же контекста, поэтому образ `gitea.arseniev.info/notbigghost/forbidden-stars` в реестре почти наверняка содержит ту же dev-БД на момент сборки. Это вывод из того же `.dockerignore`, сам образ из реестра не проверялся. Прод эти файлы не использует (у него `/data` на томе), но они лежат в каждом слое образа: пользователи dev-базы, хеши паролей, аудит с IP, загруженные фото. Кто может сделать `pull`, тот может их достать. Попутно в образ уходит `forbidden_stars_backend.egg-info` от `pip install -e`. ## Что сделать - [ ] В `.dockerignore` заменить/дополнить правила: `backend/data/` (или `**/data/`), `**/*.db`, `**/*.db-wal`, `**/*.db-shm`, `backend/*.egg-info/`. - [ ] Пересобрать и перепушить образы (`scripts/build-push.ps1`) и проверить, что в `/app/data` пусто. - [ ] Удалить из реестра старые теги/манифесты с dev-данными (или хотя бы убедиться, что реестр приватный). - [ ] Если в dev-базе когда-либо были реальные данные (например, копия прода), считать их скомпрометированными в пределах доступа к реестру. Найдено при сверке документации с кодом: README утверждает, что «данные дева в образ не попадают (`data/` в `.dockerignore`)».
Agent added the
Priority
Medium
3
Kind/Security
labels 2026-09-14 19:55:12 +03:00
Agent self-assigned this 2026-09-18 23:52:53 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-18 23:52:53 +03:00
Agent added the
Status
In Review
label 2026-09-18 23:55:33 +03:00
Author
Collaborator

Работа выполнена, открыт PR: #93

Итог: .dockerignore исключает backend/data/, любые *.db*, *.egg-info, .env в любой папке и backups/. README исправлен.
Проверки: одноразовая сборка FROM scratch + COPY backend/ с выгрузкой в папку. Со старым .dockerignore в /app лежали dev-БД, uploads и egg-info, с новым — ничего из этого; прод-код на месте.
Статус: Status/In Review
Осталось за вами: ревью и мёрж PR; после него — пересобрать и перепушить образы (scripts/build-push.ps1), проверить приватность реестра и удалить старые теги с dev-данными.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/93 **Итог:** `.dockerignore` исключает `backend/data/`, любые `*.db*`, `*.egg-info`, `.env` в любой папке и `backups/`. README исправлен. **Проверки:** одноразовая сборка `FROM scratch` + `COPY backend/` с выгрузкой в папку. Со старым `.dockerignore` в `/app` лежали dev-БД, uploads и `egg-info`, с новым — ничего из этого; прод-код на месте. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR; после него — пересобрать и перепушить образы (`scripts/build-push.ps1`), проверить приватность реестра и удалить старые теги с dev-данными.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#71