# Docker — Безопасность и аудит

Эта страница объясняет базовые практики безопасности при работе с Docker. Здесь разобраны команды для проверки уязвимостей образов, анализа конфигурации Docker Compose и рекомендации по безопасной эксплуатации контейнеров. Материал рассчитан на начинающих и помогает понять, **как обнаруживать потенциальные проблемы безопасности и минимизировать риски при работе с Docker-проектами**.

---

# Почему безопасность Docker важна

Контейнеры упрощают развертывание приложений, но сами по себе **не гарантируют безопасность**.
Основные риски могут возникать из-за:

* использования устаревших образов
* уязвимостей в зависимостях
* неправильных настроек сети
* небезопасных прав доступа
* запуска контейнеров с избыточными привилегиями

Поэтому рекомендуется регулярно:

* проверять образы на уязвимости
* анализировать конфигурацию контейнеров
* обновлять используемые образы
* минимизировать доступ контейнеров к системе

---

# Проверка образов на уязвимости

Docker предоставляет инструменты для анализа безопасности образов.

---

# Сканирование образа

```bash
docker scan <image_name>
```

Пример:

```bash
docker scan nginx:latest
```

Команда анализирует образ и ищет известные уязвимости (CVE) в:

* системных пакетах
* библиотеках
* зависимостях

Пример результата:

```
✗ High severity vulnerability found in openssl
✗ Medium severity vulnerability found in libssl
```

---

# Анализ образов через Docker Scout

Docker Scout — более современный инструмент анализа образов.

```bash
docker scout quickview <image_name>
```

Пример:

```bash
docker scout quickview node:18
```

Инструмент покажет:

* количество найденных уязвимостей
* уровень риска
* рекомендации по обновлению образа

---

# Когда использовать сканирование

Рекомендуется проверять образы:

* перед использованием нового образа
* перед деплоем на production
* после обновления зависимостей

---

# Проверка конфигурации Docker Compose

Иногда проблемы безопасности возникают из-за неправильной конфигурации сервисов.

---

# Просмотр сервисов проекта

```bash
docker compose config --services
```

Команда выводит список сервисов, описанных в `docker-compose.yml`.

Пример:

```
nginx
php
mysql
redis
```

Это помогает убедиться, что Compose видит именно те сервисы, которые ожидаются.

---

# Проверка volumes

```bash
docker compose config --volumes
```

Команда показывает volumes, используемые проектом.

Пример:

```
mysql_data
redis_cache
```

### Почему это важно

Volumes могут содержать:

* базы данных
* пользовательские файлы
* конфиденциальную информацию

Важно понимать, где именно хранятся данные.

---

# Проверка сетей проекта

```bash
docker compose config --networks
```

Команда показывает сети, которые использует проект.

Пример:

```
default
internal_network
```

Это помогает проверить, какие сервисы могут взаимодействовать между собой.

---

# Обновление Docker-образов

Одной из главных причин уязвимостей является использование старых образов.

Обновить образы можно так:

```bash
docker compose pull
```

После загрузки новых образов нужно перезапустить сервисы:

```bash
docker compose up -d
```

---

# Минимизация прав контейнеров

По умолчанию контейнеры могут иметь довольно широкий доступ к системе.

Рекомендуется:

* запускать контейнеры от обычного пользователя
* избегать режима `privileged`
* ограничивать доступ к файловой системе

Пример безопасной настройки в `docker-compose.yml`:

```yaml
services:
  app:
    user: "1000:1000"
```

Это означает, что контейнер будет работать от обычного пользователя.

---

# Ограничение ресурсов контейнеров

Чтобы контейнер не мог использовать все ресурсы сервера, можно задать лимиты.

Пример:

```yaml
services:
  app:
    deploy:
      resources:
        limits:
          memory: 512M
```

Это защищает сервер от ситуаций, когда приложение начинает потреблять слишком много памяти.

---

# Ограничение доступа к портам

Не стоит открывать порты контейнеров без необходимости.

Пример безопасной конфигурации:

```yaml
ports:
  - "127.0.0.1:8080:80"
```

Это означает:

* порт доступен только локально
* извне сервера он не будет открыт

---

# Использование .env файлов

Часто конфиденциальные данные хранятся в `.env`.

Пример:

```
DB_PASSWORD=secret_password
API_KEY=xxxxxxxx
```

Важно:

* не добавлять `.env` в публичные репозитории
* использовать `.gitignore`

---

# Проверка привилегированных контейнеров

Контейнеры, запущенные в режиме `privileged`, имеют почти полный доступ к системе.

Проверить можно так:

```bash
docker inspect <container>
```

В выводе нужно обратить внимание на поле:

```
Privileged: true
```

Если оно включено — контейнер имеет расширенные права.

---

# Проверка запущенных контейнеров

Полезно периодически проверять список контейнеров:

```bash
docker ps
```

Это помогает обнаружить:

* неизвестные контейнеры
* забытые сервисы
* тестовые окружения

---

# Проверка используемых образов

Можно посмотреть, какие образы используются:

```bash
docker images
```

Пример вывода:

```
nginx        latest
mysql        8
redis        7
```

Если используются очень старые версии — рекомендуется обновить их.

---

# Типичные ошибки безопасности

## Использование latest в production

Тег `latest` может неожиданно измениться.

Лучше указывать конкретную версию:

```yaml
nginx:1.25
```

---

## Открытые порты без необходимости

Если порт не нужен извне — не стоит его публиковать.

---

## Запуск контейнера с root-доступом

Лучше запускать контейнеры от обычного пользователя.

---

## Хранение секретов в репозитории

Пароли и ключи лучше хранить:

* в `.env`
* в системных переменных

---

# Типичный сценарий проверки безопасности

### 1 Проверить контейнеры

```bash
docker ps
```

---

### 2 Проверить образы

```bash
docker images
```

---

### 3 Проверить уязвимости

```bash
docker scout quickview nginx
```

---

### 4 Проверить конфигурацию compose

```bash
docker compose config
```

---

### 5 Обновить образы

```bash
docker compose pull
```

---

# Краткая памятка

```bash
docker scan <image>                     # сканирование уязвимостей
docker scout quickview <image>          # анализ безопасности образа

docker compose config --services        # список сервисов
docker compose config --volumes         # volumes проекта
docker compose config --networks        # сети проекта

docker compose pull                     # обновить образы

docker ps                               # список контейнеров
docker images                           # список образов
docker inspect <container>              # информация о контейнере
```