Загальний опис інциденту
Під час роботи з Docker-інфраструктурою було виявлено ransomware атаку на базу даних MySQL. База file_storage була видалена, а замість неї з’явилася підозріла база RECOVER_YOUR_DATA – типова ознака ransomware атаки на базу даних.
Причина атаки
Головною причиною стало неправильне налаштування Docker мережевої безпеки:
- Відкритий MySQL порт через docker-compose конфігурацію
- Docker обходить ufw firewall автоматично
- Слабкий пароль за замовчуванням (
secret)
Діагностика проблеми
Перевірка відкритих портів
|
1 2 3 4 5 6 7 8 9 |
# Сканування портів з зовні nmap -p 3306 YOUR_SERVER_IP # Перевірка локальних портів sudo netstat -tlnp | grep LISTEN # Перевірка Docker правил в iptables sudo iptables -L DOCKER -n |
Виявлення атаки на базу даних
|
1 2 3 4 5 |
# Перевірка наявних баз даних docker exec mysql_container mysql -u root -p -e "SHOW DATABASES;" # Якщо є база RECOVER_YOUR_DATA - це ознака ransomware |
Аналіз Docker мережевої конфігурації
|
1 2 3 4 5 6 |
# Перевірка портів що експортує Docker docker ps --format "table {{.Names}}\t{{.Ports}}" # Статус ufw sudo ufw status verbose |
Виправлення безпеки
1. Закриття небезпечних портів
Неправильно:
|
1 2 3 4 5 |
mysql: image: mysql:8.0.35 ports: - "3306:3306" # Відкритий для всього інтернету |
Правильно:
|
1 2 3 4 5 6 |
mysql: image: mysql:8.0.35 # ports: - видалено повністю networks: - app-network |
2. Використання expose замість ports
Для внутрішнього доступу:
|
1 2 3 4 5 6 |
phpmyadmin: image: phpmyadmin/phpmyadmin expose: - "80" # Доступний тільки всередині Docker мережі # ports: - видалено |
3. Обмеження доступу до localhost
Якщо потрібен зовнішній доступ:
|
1 2 3 4 5 |
phpmyadmin: image: phpmyadmin/phpmyadmin ports: - "127.0.0.1:8090:80" # Доступ тільки з localhost |
4. Налаштування Docker для поваги до ufw
|
1 2 3 |
# Створіть /etc/docker/daemon.json sudo nano /etc/docker/daemon.json |
|
1 2 3 4 |
{ "iptables": false } |
|
1 2 3 |
# Перезапустіть Docker sudo systemctl restart docker |
5. Сильні паролі
|
1 2 3 4 |
# Встановіть сильні паролі в .env echo "DB_ROOT_PASSWORD=$(openssl rand -base64 32)" >> .env echo "DB_PASSWORD=$(openssl rand -base64 24)" >> .env |
Відновлення після атаки
1. Очистка пошкоджених даних
|
1 2 3 4 5 |
# Видаліть ransomware базу docker exec mysql_container mysql -u root -p -e " DROP DATABASE IF EXISTS RECOVER_YOUR_DATA; " |
2. Створення нової бази
|
1 2 3 4 5 6 7 |
# Створіть базу заново docker exec mysql_container mysql -u root -p -e " CREATE DATABASE file_storage CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON file_storage.* TO 'user'@'%'; FLUSH PRIVILEGES; " |
3. Відновлення структури
|
1 2 3 4 |
# Запустіть міграції Laravel docker exec php_container php artisan migrate --force docker exec php_container php artisan db:seed --force |
Аудит безпеки після інциденту
Перевірка процесів
|
1 2 3 4 5 6 7 |
# Пошук підозрілих процесів ps aux | grep -E "(kinsing|mining|crypto|xmrig|masscan)" # Процеси з високим споживанням ресурсів ps aux --sort=-%cpu | head -20 ps aux --sort=-%mem | head -20 |
Перевірка мережевої активності
|
1 2 3 4 5 6 7 |
# Підозрілі з'єднання sudo netstat -tulpn | grep -v -E "(127.0.0.1|::1|docker)" # SSH логи sudo journalctl -u ssh --since "yesterday" | grep -E "(Failed|Invalid|Accepted)" last | head -20 |
Перевірка файлової системи
|
1 2 3 4 5 6 7 8 9 10 11 |
# Нові файли в підозрілих місцях find /tmp /var/tmp /dev/shm -type f -mtime -3 2>/dev/null # Зміни в системних директоріях find /usr/bin /usr/sbin -perm /u+s -type f # Cron завдання crontab -l sudo crontab -l ls -la /etc/cron.* |
Запобіжні заходи
1. Принципи Docker безпеки
- Ніколи не експортуйте порти баз даних назовні
- Використовуйте внутрішні Docker мережі
- Застосовуйте сильні паролі
- Регулярно оновлюйте контейнери
2. Firewall конфігурація
|
1 2 3 4 5 6 7 8 9 10 |
# Активуйте ufw sudo ufw --force enable sudo ufw default deny incoming sudo ufw allow 22/tcp # SSH sudo ufw allow 80,443/tcp # HTTP/HTTPS # Налаштуйте Docker щоб поважати firewall echo '{"iptables": false}' | sudo tee /etc/docker/daemon.json sudo systemctl restart docker |
3. Мониторинг
|
1 2 3 4 5 6 7 8 9 |
# Регулярно перевіряйте відкриті порти nmap -sS localhost # Моніторте Docker правила sudo iptables -L DOCKER -n | grep ACCEPT # Відстежуйте логи доступу sudo tail -f /var/log/auth.log |
4. Бекапи
|
1 2 3 |
# Автоматичні бекапи баз даних 0 2 * * * docker exec mysql_container mysqldump -u root -p${DB_ROOT_PASSWORD} --all-databases > /backups/mysql-$(date +\%Y\%m\%d).sql |
Висновки
Даний інцидент демонструє критичну важливість правильного налаштування Docker мережевої безпеки. Головні уроки:
- Docker за замовчуванням обходить системний firewall
- Експорт портів має бути мінімальним і обдуманим
- Внутрішні сервіси (БД, кеш) не повинні бути доступні з інтернету
- Сильні паролі обов’язкові навіть для внутрішніх сервісів
- Регулярний аудит безпеки має бути частиною DevOps процесів
Своєчасне виявлення та виправлення цих проблем запобігає серйозним інцидентам безпеки та втраті даних.