Skip to content

Repository files navigation

Лабораторная работа №5: Docker & AppSec

Запуск безопасного веб-приложения с использованием Docker и Flask.

О проекте

Этот проект представляет собой выполнение лабораторной работы по теме "Контейнеризация и безопасность приложений (AppSec)". Основная цель — освоить принципы создания безопасных Docker-образов с помощью многоэтапной сборки, изоляции зависимостей и минимизации attack surface.

Ключевые технологии: Docker, Docker Compose, Python, Flask, Requests.

Основные принципы AppSec:

  • Многоэтапная сборка для уменьшения размера образа.
  • Установка зависимостей из локальных wheel-пакетов (без доступа к интернету).
  • Использование минимального базового образа.
  • Очистка временных файлов на каждом этапе сборки.

🚀 Быстрый старт

Предварительные требования

  • Установленный Docker и Docker Compose.
  • Права доступа для запуска Docker-демона.

Запуск через Docker (рекомендуется)

  1. Сборка образа:
    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 является гибридным и работает в двух режимах:

  1. Консольный режим (по умолчанию) После запуска контейнера вы увидите интерактивное меню:

text HELLO APPSEC WORLD - DOCKER LAB #5

МЕНЮ:

  1. Добавить данные
  2. Показать данные
  3. Проверить сеть
  4. Запустить веб-сервер
  5. Информация о системе
  6. Выйти
  7. Веб-режим (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

Этап 1: Сборщик зависимостей

FROM python:3.11-slim AS builder ... RUN pip install --upgrade pip && pip wheel --wheel-dir=/wheels -r requirements.txt

Этап 2: Финальный образ

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 (удаление неиспользуемых данных)

docker system prune -a Команды Docker Compose bash

Запуск в фоновом режиме

docker-compose up -d

Просмотр статуса сервисов

docker-compose ps

Просмотр логов

docker-compose logs -f

Остановка и удаление контейнеров, сетей

docker-compose down

Остановка и удаление контейнеров, сетей и volumes

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>.

About

Лабораторная работа 5

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages