Чек-лист финальной проверки безопасности перед запуском проекта
Дата публикации: 24.04.2026

Чек-лист финальной проверки безопасности перед запуском проекта

ccb9a536


Чек-лист финальной проверки безопасности перед запуском проекта

Или как не превратить свой сервер в "дырявое решето" за 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. Проверяйте восстановление

Раз в квартал:

  1. Разверните бэкап на тестовом сервере.
  2. Убедитесь, что сайт работает.
  3. Проверьте целостность базы.

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 Проверено восстановление из бэкапа

🚀 Практика для закрепления

Вопросы для самопроверки:

  1. Вы запустили новый сервер и видите в netstat, что порт 3306 (MySQL) открыт для всех. Какие команды нужно выполнить, чтобы закрыть его для внешнего доступа?
  2. Почему вход по SSH по паролю опаснее, чем по ключу? Какой алгоритм ключа рекомендуется использовать (rsa, ed25519 или ecdsa) и почему?
  3. Вы настроили HTTPS, но на securityheaders.com видите предупреждение об отсутствии Content-Security-Policy. Какую директиву CSP нужно добавить, чтобы запретить загрузку скриптов со сторонних сайтов, кроме cdn.jsdelivr.net?
  4. Ваш сервер был взломан через уязвимость в устаревшей версии PHP. Как избежать такой ситуации в будущем? (Укажите конкретные команды.)
  5. Вы арендовали 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% на тур в Коста-Рике
Видеочат рулетка бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы