Чек-лист финальной проверки безопасности перед запуском проекта
Чек-лист финальной проверки безопасности перед запуском проекта
Или как не превратить свой сервер в "дырявое решето" за 5 минут после старта
Вы потратили недели (а может, месяцы) на разработку проекта. Код написан, дизайн отполирован, трафик готов литься рекой. Но есть одна проблема: если вы пропустили хотя бы один пункт безопасности, ваш сервер может стать легкой добычей для ботов, хакеров или даже конкурентов.
Пример из жизни: В 2021 году арбитражник запустил лендинг на свежем VPS, не закрыв порт 22 (SSH) и не настроив fail2ban. Через 12 часов сервер стал частью ботнета для DDoS-атак, а хостинг заблокировал аккаунт за нарушение правил. Потери: $3 000 на рекламу + репутация.
Этот чек-лист поможет избежать таких историй. Проходите его шаг за шагом перед каждым запуском — даже если "в прошлый раз всё работало".
1. Базовая защита сервера: "Закройте двери и окна"
Первое, что проверяют злоумышленники — открытые порты и устаревшие сервисы. Ваша задача — оставить только то, что действительно нужно проекту.
✅ Что делать:
1.1. Проверьте открытые порты
Используйте команду:
sudo netstat -tulnp
или (если нет netstat):
sudo ss -tulnp
| Что должно остаться: | Порт | Назначение | Нужно ли вам? |
|---|---|---|---|
| 22 | SSH | Да (но только с ключом!) | |
| 80 | HTTP | Да (перенаправляйте на 443) | |
| 443 | HTTPS | Обязательно | |
| 3306 | MySQL | Нет (закрывайте внешний доступ) | |
| 27017 | MongoDB | Нет (только локально) |
❌ Удалите всё лишнее!
Если видите неизвестные порты (например, 23/Telnet или 21/FTP) — блокируйте их в фаерволе (ufw или iptables).
1.2. Настройте фаервол (UFW)
Минимальная конфигурация:
sudo ufw default deny incoming # Заблокировать всё входящее
sudo ufw default allow outgoing # Разрешить исходящее
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 22/tcp # SSH (только если нужен)
sudo ufw enable
⚠️ Важно:
- Если используете Cloudflare, можно закрыть 80/443 для всех, кроме их IP (список здесь).
- Для SSH лучше поменять порт на нестандартный (например, 2222) и разрешить только свой IP:
sudo ufw allow from 123.123.123.123 to any port 2222
1.3. Обновите всё до последних версий
sudo apt update && sudo apt upgrade -y # Для Debian/Ubuntu
sudo yum update -y # Для CentOS
Почему это критично? В 2022 году уязвимость в Log4j позволяла хакерам выполнять код на серверах. Исправление вышло за день — но многие не обновились и поплатились.
2. Защита SSH: "Ключ лучше пароля"
SSH — главный вход на ваш сервер. Если его взломают, проект умер.
✅ Что делать:
2.1. Отключите вход по паролю
Редактируйте /etc/ssh/sshd_config:
PasswordAuthentication no
PermitRootLogin no
⚠️ Предварительно настройте вход по ключу! Сгенерируйте ключ на локальной машине:
ssh-keygen -t ed25519 -C "your_email@example.com"
Скопируйте его на сервер:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
Проверьте вход:
ssh -i ~/.ssh/id_ed25519 user@server_ip
2.2. Поменяйте порт SSH (опционально, но рекомендуется)
В том же /etc/ssh/sshd_config:
Port 2222 # Вместо 22
Не забудьте открыть новый порт в фаерволе!
2.3. Установите fail2ban
Это как "охранник", который блокирует IP после нескольких неудачных попыток входа.
sudo apt install fail2ban
sudo systemctl enable fail2ban
Проверьте лог:
sudo tail -f /var/log/fail2ban.log
3. Веб-сервер: "Нет HTTPS — нет безопасности"
Если ваш сайт работает по HTTP, все данные (включая пароли пользователей) передаются открытым текстом.
✅ Что делать:
3.1. Настройте HTTPS (Let’s Encrypt)
Установите Certbot:
sudo apt install certbot python3-certbot-nginx # Для Nginx
sudo certbot --nginx -d ваш_домен.com
⚠️ Важно:
- Автоматическое обновление сертификатов:
sudo certbot renew --dry-run - Перенаправляйте HTTP → HTTPS в конфиге Nginx:
server { listen 80; server_name ваш_домен.com; return 301 https://$host$request_uri; }
3.2. Защитите заголовки (Security Headers)
Добавьте в конфиг Nginx/Apache:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:";
Что это даёт?
- X-Frame-Options — защита от кликджекинга.
- CSP — блокирует загрузку скриптов с неизвестных источников (например, если хакер встроит вредоносный JS).
Проверьте заголовки на securityheaders.com.
3.3. Отключите ненужные методы HTTP
В конфиге Nginx:
limit_except GET POST {
deny all;
}
Почему? Методы вроде PUT, DELETE или TRACE часто используются для атак.
4. Базы данных: "Не оставляйте ключи в замке"
Если ваша база данных доступна из интернета — её украдут или удалят.
✅ Что делать:
4.1. Закройте внешний доступ к БД
Для MySQL/MariaDB:
sudo mysql -u root -p
Внутри консоли:
DROP USER 'root'@'%'; # Удалите удалённого root
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'сложный_пароль';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
Для MongoDB редактируйте /etc/mongod.conf:
net:
bindIp: 127.0.0.1 # Только локальный доступ
port: 27017
4.2. Настройте резервное копирование
Автоматическое копирование базы раз в день:
sudo mysqldump -u admin -p'пароль' имя_базы > /backup/db_$(date +%F).sql
Или для MongoDB:
mongodump --out /backup/mongo_$(date +%F)
⚠️ Важно:
- Храните бэкапы вне сервера (например, в S3 или Google Drive).
- Проверяйте восстановление раз в месяц!
5. Мониторинг и логи: "Видеть всё, как Бог"
Если вы не знаете, что происходит на сервере — вы слепы.
✅ Что делать:
5.1. Настройте логирование
Проверьте, что логи пишутся:
sudo tail -f /var/log/nginx/error.log # Ошибки Nginx
sudo tail -f /var/log/auth.log # Попытки входа
Настройте ротацию логов, чтобы они не забивали диск:
sudo nano /etc/logrotate.conf
Добавьте (например, для Nginx):
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx
endscript
}
5.2. Установите инструменты мониторинга
- Netdata (реальное время):
bash <(curl -Ss https://my-netdata.io/kickstart.sh)Доступ:
http://ваш_сервер:19999 - Grafana + Prometheus (для продвинутых).
5.3. Настройте алерты
Пример для fail2ban (отправка на email при блокировке IP):
sudo nano /etc/fail2ban/jail.local
Добавьте:
[DEFAULT]
destemail = ваш@email.com
sender = fail2ban@ваш_сервер.com
action = %(action_mwl)s
6. Резервное копирование: "Если всё сломалось"
Правило арбитражника: "Если нет бэкапа — его не существует."
✅ Что делать:
6.1. Автоматизируйте бэкапы
Пример скрипта для полного бэкапа сервера (включая базы и файлы):
#!/bin/bash
BACKUP_DIR="/backup/full_$(date +%F)"
mkdir -p $BACKUP_DIR
# Дамп баз
mysqldump -u admin -p'пароль' --all-databases > $BACKUP_DIR/all_dbs.sql
# Архив файлов
tar -czvf $BACKUP_DIR/files.tar.gz /var/www /etc/nginx /etc/php
# Загрузка в облако (пример для AWS S3)
aws s3 cp $BACKUP_DIR s3://ваше-ведро/backup/ --recursive
Настройте cron на ежедневный запуск:
sudo crontab -e
Добавьте:
0 3 * * * /путь/к/скрипту.sh
6.2. Проверяйте восстановление
Раз в квартал:
- Разверните бэкап на тестовом сервере.
- Убедитесь, что сайт работает.
- Проверьте целостность базы.
7. Дополнительные меры (для параноиков)
Если проект критически важен — сделайте это:
| Мера | Зачем нужно | Как настроить |
|---|---|---|
| Двухфакторная аутентификация (2FA) для SSH | Даже если украдут ключ, без кода доступа не войти | google-authenticator + настройка в /etc/ssh/sshd_config |
| Изоляция процессов (Docker/LXC) | Если взломают один сервис, остальные не пострадают | Разверните каждый сервис в отдельном контейнере |
| WAF (ModSecurity или Cloudflare) | Блокирует SQL-инъекции, XSS и другие атаки | Установите libapache2-mod-security2 + правила OWASP |
| Отключение IPv6 (если не используется) | Уменьшает поверхность атаки | В /etc/sysctl.conf: net.ipv6.conf.all.disable_ipv6=1 |
🔥 Финальный чек-лист перед запуском
Пройдите по пунктам и отметьте выполненное:
| № | Задача | Выполнено? |
|---|---|---|
| 1 | Закрыты все порты, кроме 80, 443 и SSH (сменён на нестандартный) | ☐ |
| 2 | Вход по SSH только по ключу, пароль отключён | ☐ |
| 3 | Установлен и настроен fail2ban | ☐ |
| 4 | Все пакеты обновлены (apt upgrade) |
☐ |
| 5 | Настроен HTTPS (Let’s Encrypt) + перенаправление с HTTP | ☐ |
| 6 | Добавлены Security Headers (CSP, X-Frame-Options и др.) | ☐ |
| 7 | База данных доступна только с localhost, удалённый root удалён | ☐ |
| 8 | Настроено автоматическое резервное копирование (вне сервера) | ☐ |
| 9 | Включен мониторинг логов (Netdata/Grafana) | ☐ |
| 10 | Проверено восстановление из бэкапа | ☐ |
🚀 Практика для закрепления
Вопросы для самопроверки:
- Вы запустили новый сервер и видите в
netstat, что порт 3306 (MySQL) открыт для всех. Какие команды нужно выполнить, чтобы закрыть его для внешнего доступа? - Почему вход по SSH по паролю опаснее, чем по ключу? Какой алгоритм ключа рекомендуется использовать (
rsa,ed25519илиecdsa) и почему? - Вы настроили HTTPS, но на securityheaders.com видите предупреждение об отсутствии Content-Security-Policy. Какую директиву CSP нужно добавить, чтобы запретить загрузку скриптов со сторонних сайтов, кроме
cdn.jsdelivr.net? - Ваш сервер был взломан через уязвимость в устаревшей версии PHP. Как избежать такой ситуации в будущем? (Укажите конкретные команды.)
- Вы арендовали VPS у хостера, который не предоставляет бэкапы. Напишите скрипт для автоматического копирования
/var/wwwи базы MySQL в облако Yandex S3 (используйтеs3cmdилиawscli).
💡 Бонусное задание:
Настройте автоматическое блокирование IP в fail2ban для атак на WP-Login (если используете WordPress). Пришлите конфиг из /etc/fail2ban/jail.local.
⚠️ Важно: Безопасность — это не одноразовая настройка, а постоянный процесс. Раз в месяц:
- Проверяйте логи на подозрительную активность.
- Обновляйте софт.
- Тестируйте бэкапы.
Если что-то непонятно — не гадайте, а гуглите или спрашивайте. Один неверный шаг может стоить вам всего проекта. Удачи! 🚀
Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно