124 lines
12 KiB
Markdown
124 lines
12 KiB
Markdown
# 10. Безопасность
|
||
|
||
## Обзор
|
||
|
||
В этом разделе собраны текущие проблемы безопасности инфраструктуры и план их устранения. Документ основан на результатах аудита, проведённого в марте 2026 года.
|
||
|
||
## Текущее состояние
|
||
|
||
| Область | Статус | Комментарий |
|
||
|---------|--------|-------------|
|
||
| SSH (парольная аутентификация) | ✅ | Отключена на всех хостах |
|
||
| SSH (вход root) | 🔴 | Разрешён на всех хостах |
|
||
| SSH-ключи | 🟡 | Управляются через Ansible, но требуется проверка на наличие лишних ключей |
|
||
| Samba (шифрование) | 🟡 | На `media` – `desired`, на `games` – `required` |
|
||
| Samba (протокол) | 🔴 | На `media` используется `NT1` (SMB1), что небезопасно |
|
||
| UFW / фаервол | 🔴 | Отключён на всех LXC и ВМ |
|
||
| Хранение паролей в Ansible | 🔴 | Часть паролей в открытом виде в `all.yml` |
|
||
| Заголовки безопасности в NPM | 🔴 | Отсутствуют для большинства прокси |
|
||
| Docker-образы | 🟡 | Используется тег `latest`, неконтролируемые обновления |
|
||
| Обновления систем | 🟡 | Много пакетов требуют обновления (49 на `media`, аналогично на других) |
|
||
| Мониторинг | 🟢 | Настроен, но нет алертов на логи и некоторые метрики |
|
||
| Резервное копирование | 🔴 | Не настроено (будет описано в отдельном разделе) |
|
||
|
||
## Критические проблемы (🔴)
|
||
|
||
### 1. Вход root по SSH
|
||
- **Описание**: На всех хостах разрешён вход под пользователем `root` через SSH. При компрометации ключа злоумышленник получает полный контроль над системой.
|
||
- **Решение**: Создать обычного пользователя (например, `ansible`), добавить его в группу `sudo`, настроить ключи и запретить вход root в `/etc/ssh/sshd_config` (`PermitRootLogin no`). Перезапустить SSH.
|
||
|
||
### 2. Samba на media использует SMB1
|
||
- **Описание**: В конфигурации Samba на хосте `media` установлен `server min protocol = NT1`, что соответствует SMB1. Этот протокол уязвим (EternalBlue и другие атаки).
|
||
- **Решение**: Изменить на `server min protocol = SMB2` (или `SMB3`). После изменения проверить работу клиентов (Windows, Android, Docker). Если Android не поддерживает SMB2/3, использовать VPN для доступа к шарам.
|
||
|
||
### 3. Отсутствие фаервола на всех LXC
|
||
- **Описание**: UFW отключён на всех LXC-контейнерах. Сервисы доступны из всей локальной сети без ограничений.
|
||
- **Решение**: Включить UFW на каждом хосте, разрешив только необходимые порты:
|
||
- SSH (только из подсетей 192.168.1.0/24 и 192.168.45.0/24)
|
||
- Samba (139, 445) – только из локальной и VPN-подсетей
|
||
- Порты Docker-сервисов (например, 45131, 45132 и т.д.) – если они должны быть доступны только через NPM, то разрешить только для `gateway` или для всей локальной сети
|
||
- HTTP/HTTPS (80, 443) – если сервис слушает напрямую, а не через NPM
|
||
|
||
### 4. Пароли в открытом виде в Ansible
|
||
- **Описание**: В файле `group_vars/all.yml` присутствуют пароли в открытом виде (например, `grafana_admin_password`, пароли Samba, PostgreSQL и др.).
|
||
- **Решение**: Немедленно перенести все секреты в `group_vars/vault.yml` и зашифровать с помощью Ansible Vault. Удалить открытые пароли из `all.yml`.
|
||
|
||
### 5. Отсутствие заголовков безопасности в NPM
|
||
- **Описание**: Для большинства проксируемых доменов не настроены заголовки HSTS, X-Content-Type-Options, X-Frame-Options и другие.
|
||
- **Решение**: Через веб-интерфейс NPM для каждого публичного прокси добавить заголовки (см. раздел [Проксирование и SSL](07-proxy-ssl.md)).
|
||
|
||
## Проблемы высокого приоритета (🟠)
|
||
|
||
### 1. Использование Docker-образов с тегом `latest`
|
||
- **Описание**: Образы, такие как `jc21/nginx-proxy-manager:latest`, обновляются неконтролируемо, что может привести к несовместимости или неожиданным изменениям.
|
||
- **Решение**: Зафиксировать версии образов в `docker-compose.yml` (например, `jc21/nginx-proxy-manager:2.12.3`).
|
||
|
||
### 2. Необновлённые системы
|
||
- **Описание**: На хосте `media` 49 пакетов требуют обновления, включая Docker и системные библиотеки. Аналогичная ситуация на других хостах.
|
||
- **Решение**: Выполнить `apt update && apt upgrade` на всех хостах. Настроить автоматические обновления безопасности (`unattended-upgrades`).
|
||
|
||
### 3. Прокси с Offline статусом
|
||
- **Описание**: `qb.zailon.ru` недоступен. Возможно, qBittorrent не запущен или не слушает порт 8080.
|
||
- **Решение**: Проверить контейнер qBittorrent на `torrent`, убедиться, что порт 8080 открыт, и правило прокси в NPM корректно.
|
||
|
||
## Проблемы среднего приоритета (🟡)
|
||
|
||
### 1. Шифрование Samba на media
|
||
- **Описание**: Установлено `smb encrypt = desired` вместо `required`. Это снижает безопасность передачи данных.
|
||
- **Решение**: После включения VPN для доступа к шарам извне изменить на `required`. Если Android-клиенты не поддерживают шифрование, использовать VPN.
|
||
|
||
### 2. Управление SSH-ключами
|
||
- **Описание**: В `all.yml` указаны три публичных ключа. Необходимо убедиться, что на всех хостах нет лишних ключей, а также что ключи актуальны.
|
||
- **Решение**: Проверить содержимое `~/.ssh/authorized_keys` на каждом хосте, удалить ненужные. Использовать Ansible для централизованного управления ключами.
|
||
|
||
### 3. cAdvisor не включён на всех хостах
|
||
- **Описание**: В плейбуке роль `cadvisor` закомментирована, поэтому метрики Docker-контейнеров собираются не везде.
|
||
- **Решение**: Если нужен полный мониторинг, раскомментировать роль в `olimp-deploy.yml` и применить её для хостов с Docker.
|
||
|
||
### 4. Отсутствие алертов на логи
|
||
- **Описание**: Настроены только алерты на метрики. Нет алертов на появление в логах ошибок, попыток взлома и т.п.
|
||
- **Решение**: Настроить правила алертов в Grafana на основе Loki (например, при появлении `error` в логах NPM или SSH).
|
||
|
||
## Рекомендации по улучшению (🟢)
|
||
|
||
### 1. Включить автоматические обновления безопасности
|
||
- На всех хостах установить `unattended-upgrades` и настроить его на автоматическую установку обновлений безопасности.
|
||
|
||
### 2. Сегментация сети
|
||
- Выделить VLAN для умных устройств (IoT) и гостевой сети, чтобы ограничить распространение атаки.
|
||
|
||
### 3. Мониторинг роутера
|
||
- Настроить сбор SNMP-метрик с роутера TP-Link (если поддерживается) для мониторинга нагрузки, ошибок и подозрительного трафика.
|
||
|
||
### 4. Резервное копирование
|
||
- Организовать регулярное резервное копирование конфигураций, баз данных и пользовательских данных. Хранить копии в зашифрованном виде вне основной сети.
|
||
|
||
### 5. Двухфакторная аутентификация
|
||
- Для критических сервисов (Grafana, GitLab, Bitwarden) включить 2FA, если это поддерживается.
|
||
|
||
### 6. Регулярный аудит
|
||
- Проводить периодический аудит безопасности (например, раз в 3 месяца) с использованием специализированных инструментов (Lynis, OpenVAS).
|
||
|
||
## План действий
|
||
|
||
| Задача | Приоритет | Срок |
|
||
|--------|-----------|------|
|
||
| Перенести пароли в Ansible Vault | 🔴 | Немедленно |
|
||
| Запретить вход root по SSH | 🔴 | Немедленно |
|
||
| Включить UFW на всех хостах | 🔴 | В течение недели |
|
||
| Обновить Samba (протокол и шифрование) | 🔴 | В течение недели |
|
||
| Добавить заголовки безопасности в NPM | 🔴 | В течение недели |
|
||
| Зафиксировать версии Docker-образов | 🟠 | В течение месяца |
|
||
| Обновить все системы | 🟠 | В течение месяца |
|
||
| Настроить автоматические обновления | 🟢 | В течение месяца |
|
||
| Включить cAdvisor | 🟡 | По мере необходимости |
|
||
| Настроить алерты на логи | 🟡 | По мере необходимости |
|
||
|
||
---
|
||
|
||
**Связанные разделы:**
|
||
- [Samba – файловые шары](05-samba.md)
|
||
- [Проксирование и SSL (NPM)](07-proxy-ssl.md)
|
||
- [Мониторинг и логирование](08-monitoring.md)
|
||
- [Управление конфигурацией (Ansible)](09-ansible.md)
|
||
- [Резервное копирование](11-backup.md) |