Лабораторная работа №5: Docker & AppSec
Запуск безопасного веб-приложения с использованием Docker и Flask.
Этот проект представляет собой выполнение лабораторной работы по теме "Контейнеризация и безопасность приложений (AppSec)". Основная цель — освоить принципы создания безопасных Docker-образов с помощью многоэтапной сборки, изоляции зависимостей и минимизации attack surface.
Ключевые технологии: Docker, Docker Compose, Python, Flask, Requests.
Основные принципы AppSec:
- Многоэтапная сборка для уменьшения размера образа.
- Установка зависимостей из локальных wheel-пакетов (без доступа к интернету).
- Использование минимального базового образа.
- Очистка временных файлов на каждом этапе сборки.
- Установленный Docker и Docker Compose.
- Права доступа для запуска Docker-демона.
- Сборка образа:
docker build -t hello-appsec-world ./source
Запуск контейнера:
bash docker run -p 5000:5000 --name appsec-app hello-appsec-world Приложение будет доступно по адресу: http://localhost:5000
Запуск через Docker Compose (для оркестрации) Запуск стека из корня проекта:
bash docker-compose up --build Приложение будет доступно по адресу: http://localhost:8000
Примечание: Docker Compose перенаправляет порт 8000 хоста на порт 5000 контейнера.
🌐 Функционал приложения Приложение hello.py является гибридным и работает в двух режимах:
- Консольный режим (по умолчанию) После запуска контейнера вы увидите интерактивное меню:
МЕНЮ:
- Добавить данные
- Показать данные
- Проверить сеть
- Запустить веб-сервер
- Информация о системе
- Выйти
- Веб-режим (Flask API) При выборе пункта 4 или при прямом запуске через Docker Compose запускается веб-сервер с REST API:
Endpoint Метод Описание Пример ответа / GET Информация о приложении и доступные endpoints {"app": "Hello AppSec World", "endpoints": [...]} /health GET Проверка состояния сервиса (health check) {"status": "healthy", "timestamp": "..."} /data GET Получение всех данных, добавленных через консоль {"count": 2, "data": [...]} /network GET Проверка доступности внешней сети {"network": "available", "status_code": 200} /info GET Информация о системе и версиях {"python_version": "3.11.4", "flask_version": "2.2.3"} Принципы безопасности (AppSec) в Dockerfile Анализ Dockerfile (source/Dockerfile) dockerfile
FROM python:3.11-slim AS builder ... RUN pip install --upgrade pip && pip wheel --wheel-dir=/wheels -r requirements.txt
FROM python:3.11-slim ... COPY --from=builder /wheels /wheels RUN pip install --no-index --find-links=/wheels -r requirements.txt ... Реализованные меры безопасности:
Многоэтапная сборка (Multi-stage build):
Этап builder: Используется только для компиляции зависимостей в wheel-пакеты. Финальный этап: Содержит только необходимые для запуска файлы. Инструменты сборки, исходный код зависимостей и промежуточные артефакты в него не попадают. Результат: Значительное уменьшение размера финального образа и сокращение поверхности для атак. Изоляция зависимостей: Зависимости устанавливаются из локальных wheel-пакетов (флаг --no-index --find-links=/wheels). Ключевое преимущество: Финальный контейнер не требует и не имеет доступа к интернету для установки пакетов, что устраняет целый класс уязвимостей, связанных с сетевыми атаками при сборке.
Минимальный базовый образ:
Используется python:3.11-slim вместо полноценного python:3.11.
Результат: Меньшее количество предустановленных пакетов, меньшая площадь атаки и меньший размер образа.
Очистка временных файлов:
После установки зависимостей директория /wheels удаляется.
Результат: Удаление ненужных данных, которые потенциально могут содержать уязвимости или служебную информацию.
Зависимости Все зависимости жестко зафиксированы в source/requirements.txt для обеспечения воспроизводимости сборки:
txt flask==2.2.3 requests==2.28.1 🛠 Управление и обслуживание Полезные команды Docker bash
docker ps
docker logs appsec-app
docker stop appsec-app
docker rm appsec-app
docker rmi hello-appsec-world
docker system prune -a Команды Docker Compose bash
docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down
docker-compose down -v Решение возможных проблем Проблема Вероятная причина Решение docker: permission denied Недостаточно прав у пользователя. Выполните sudo usermod -aG docker $USER, выйдите и зайдите в систему заново. Port is already allocated Порт 5000 или 8000 занят другим приложением. Остановите conflicting-сервис или измените порт в команде docker run или docker-compose.yml. Cannot connect to the Docker daemon Docker-демон не запущен. Запустите демон: sudo systemctl start docker. Приложение не отвечает Контейнер мог завершиться с ошибкой. Проверьте логи: docker logs <container_name>.