Руководство по безопасности сервера: от базовых настроек до продвинутой защиты

Безопасность сервера — это не разовое действие, а непрерывный процесс. Каждый день появляются новые уязвимости, автоматические сканеры прощупывают порты, а злоумышленники ищут слабые места. В этой статье мы построим комплексную систему защиты, которая охватывает все уровни: от входа на сервер до работы приложений.

Мы рассмотрим:

  • Общие принципы безопасности.
  • Настройку SSH и доступ к серверу.
  • Фаервол и управление сетевыми соединениями.
  • Защиту веб-сервера и приложений.
  • Безопасность баз данных.
  • Регулярные обновления и управление уязвимостями.
  • Мониторинг и обнаружение вторжений.
  • Резервное копирование как элемент безопасности.
  • Дополнительные продвинутые меры.

1. Общие принципы безопасности

Прежде чем перейти к конкретным настройкам, запомните основные правила:

  • Минимальные привилегии — давайте пользователям и процессам только те права, которые им необходимы для работы.
  • Защита по глубине — используйте несколько уровней защиты, чтобы при взломе одного уровня другие сработали.
  • Регулярные обновления — своевременно устанавливайте патчи для операционной системы и всего ПО.
  • Мониторинг и логирование — вы не сможете защитить то, что не видите.
  • Планирование отката — всегда имейте план восстановления в случае успешной атаки.

2. Настройка SSH — ваш главный вход

SSH — это основной канал для управления сервером, поэтому его защите нужно уделить максимум внимания.

2.1 Смена стандартного порта

Порт 22 сканируется ботами постоянно. Смените его на нестандартный порт (например, 2222 или 5022).

В файле /etc/ssh/sshd_config:

Port 5022

После изменения перезапустите SSH:

Bash
sudo systemctl restart sshd

Не забудьте открыть новый порт в фаерволе и переподключиться, указав порт:

Bash
ssh -p 5022 user@server

⚠️ Важное уточнение: Смена порта не делает SSH безопаснее. Если у вас включены ключи и отключён root, польза от смены порта минимальна. Для большинства проектов важнее: отключить пароли, запретить root и поставить Fail2ban, чем прятать порт.

2.2 Отключение входа под root

Запретите прямой вход под пользователем root. Входите под обычным пользователем, а затем используйте sudo или su.

В файле /etc/ssh/sshd_config:

PermitRootLogin no

2.3 Использование SSH-ключей вместо паролей

Пароли можно подобрать или украсть. SSH-ключи значительно надёжнее.

Генерация ключа на клиентской машине:

Bash
ssh-keygen -t ed25519 -C "your_email@example.com"

(ed25519 — современный и безопасный алгоритм.)

Копирование публичного ключа на сервер:

Bash
ssh-copy-id -p 5022 user@server

После того как ключ добавлен, отключите аутентификацию по паролю в /etc/ssh/sshd_config:

PasswordAuthentication no

Перезапустите SSH.

2.4 Ограничение пользователей, имеющих доступ по SSH

Если на сервере несколько пользователей, разрешите доступ только тем, кому он действительно нужен:

AllowUsers user1 user2
# или AllowGroups admin

2.5 Защита от брутфорса: Fail2ban

Fail2ban блокирует IP-адреса, с которых слишком много неудачных попыток входа.

Установка:

Bash
sudo apt install fail2ban   # Ubuntu/Debian
sudo dnf install fail2ban   # CentOS/RHEL

Базовая настройка — создайте файл /etc/fail2ban/jail.local:

[DEFAULT]
bantime = 3600          # блокировка на 1 час (в секундах)
findtime = 600          # за 10 минут
maxretry = 5            # 5 неудачных попыток

[sshd]
enabled = true
logpath = %(sshd_log)s
backend = systemd

💡 Совет: Fail2ban определяет порт по логам, поэтому явно указывать port в jail необязательно. Главное — чтобы в логах были попытки входа.

После настройки перезапустите Fail2ban:

Bash
sudo systemctl restart fail2ban

2.6 Двухфакторная аутентификация (2FA) для SSH

Для максимальной защиты можно включить двухфакторную аутентификацию через Google Authenticator.

Установка модуля:

Bash
sudo apt install libpam-google-authenticator   # Ubuntu
sudo dnf install google-authenticator          # CentOS

Настройка для пользователя:

Bash
google-authenticator

Следуйте инструкциям: получите секретный ключ, сохраните резервные коды.

Настройка PAM и SSH:

В файле /etc/pam.d/sshd добавьте:

auth required pam_google_authenticator.so

⚠️ Критично: Перед включением 2FA убедитесь, что у вас есть альтернативный способ доступа к серверу (консоль в панели хостинга, отдельный SSH‑ключ, rescue‑режим). Ошибка в конфиге PAM может полностью заблокировать вход по SSH. Рекомендуется сначала протестировать 2FA на тестовом сервере.

В /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

Перезапустите SSH. Теперь потребуется вводить одноразовый код после ключа.

3. Настройка фаервола

Фаервол — это первая линия обороны, которая пропускает только разрешённые соединения.

3.1 Использование UFW (Ubuntu/Debian)

Bash
# Включение UFW
sudo ufw enable

# Запретить все входящие по умолчанию
sudo ufw default deny incoming

# Разрешить все исходящие
sudo ufw default allow outgoing

# Разрешить SSH на вашем порту
sudo ufw allow 5022/tcp

# Разрешить HTTP и HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Если используете другие порты (например, для Docker)
sudo ufw allow 8080/tcp

# Проверка статуса
sudo ufw status verbose

⚠️ Правило хорошего тона: Разрешайте только те порты, которые реально используются. Не добавляйте «на всякий случай» лишние порты — это увеличивает поверхность атаки.

3.2 Использование firewalld (CentOS/RHEL)

Bash
# Запуск и включение
sudo systemctl start firewalld
sudo systemctl enable firewalld

# Разрешить SSH
sudo firewall-cmd --permanent --add-port=5022/tcp

# Разрешить HTTP/HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# Перезагрузить конфигурацию
sudo firewall-cmd --reload

# Проверка
sudo firewall-cmd --list-all

3.3 Продвинутая настройка с iptables
Для тонкой настройки можно использовать iptables/nftables. Это сложнее, но даёт полный контроль.

Пример с iptables:

Bash
# Сброс правил
sudo iptables -F
sudo iptables -X

# Политики по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# Разрешить установленные соединения
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешить локальный интерфейс
sudo iptables -A INPUT -i lo -j ACCEPT

# SSH
sudo iptables -A INPUT -p tcp --dport 5022 -j ACCEPT

# HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Сохранение правил
sudo netfilter-persistent save   # для Ubuntu
sudo service iptables save       # для CentOS

🚨 Осторожно: Эти команды полностью сбрасывают правила фаервола. Выполняйте их только в безопасной среде (например, при настройке нового сервера) или с заранее подготовленным набором правил, который сразу примените после сброса.

3.4 Защита от DDoS-атак на уровне фаервола

Ограничьте количество соединений с одного IP-адреса:

Bash
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 20 -j DROP

4. Защита веб-сервера

Веб-сервер — это самый публичный интерфейс, поэтому его защита критически важна.

4.1 Защита конфиденциальных файлов

Для Nginx:

В конфигурации виртуального хоста запретите доступ к файлам с расширениями .ht.env.gitconfig и т.д.:

Nginx
location ~ /\.(ht|env|git|svn) {
    deny all;
}

location ~* \.(sql|log|backup)$ {
    deny all;
}

Для Apache:

Используйте .htaccess или секцию <Directory>:

Apache
<FilesMatch "\.(ht|env|git|sql|log|backup)$">
    Require all denied
</FilesMatch>

4.2 Ограничение HTTP-методов

Разрешите только необходимые методы (GET, POST, HEAD, OPTIONS):

Nginx:

Nginx
if ($request_method !~ ^(GET|POST|HEAD|OPTIONS)$) {
    return 405;
}

Apache:

Apache
<LimitExcept GET POST HEAD OPTIONS>
    Require all denied
</LimitExcept>

4.3 Настройка заголовков безопасности

Добавьте важные заголовки, чтобы защитить пользователей от атак:

Nginx:

Nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self';" always;

Apache:

Apache
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options "nosniff"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Content-Security-Policy "default-src 'self';"

⚠️ CSP — это «бомба замедленного действия»: слишком строгая политика может сломать скрипты, шрифты, картинки и сторонние виджеты. Начинайте с Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; и постепенно ужесточайте, проверяя сайт. Лучше использовать отчёты CSP (report-uri) на этапе настройки..

4.4 Защита от SQL-инъекций и XSS через WAF

Установите ModSecurity для Apache или используйте встроенный модуль Nginx (с набором правил OWASP).

Для Apache:

Bash
sudo apt install libapache2-mod-security2
sudo a2enmod security2

Конфигурация обычно находится в /etc/modsecurity/. Правила OWASP можно скачать и включить.

Для Nginx можно использовать сторонние WAF, например, с помощью Nginx Unit или проксирования через специальные контейнеры.

4.5 Лимитирование запросов для защиты от DDoS

Ограничьте количество запросов с одного IP-адреса:

Nginx (в блоке http):

Nginx
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

server {
    location / {
        limit_req zone=mylimit burst=20 nodelay;
        # ...
    }
}

Это позволит пропускать не более 10 запросов в секунду на IP.

4.6 Отключение отображения версий

Скрывайте версии веб-сервера и языков:

Nginx:

Nginx
server_tokens off;

Apache:

Apache
ServerSignature Off
ServerTokens Prod

5. Безопасность баз данных

База данных — сердце любого динамического сайта. Её защита критична.

5.1 Ограничение доступа к СУБД

  • Настройте MySQL/PostgreSQL так, чтобы они слушали только локальный интерфейс (127.0.0.1), если приложение работает на том же сервере.
  • Используйте отдельного пользователя для каждого приложения с минимальными правами (только на нужные базы и операции).
  • Запретите вход root для удалённых подключений.

Для MySQL в /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address = 127.0.0.1

🔍 Нюанс: Если приложение находится на другом сервере (или в Docker на отдельной машине), то bind-address = 127.0.0.1 сделает базу недоступной. В таких случаях используйте SSL + белый список IP‑адресов и сетевые политики.

Создание пользователя с ограниченными правами:

SQL
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;

5.2 Использование SSL для подключения к БД

Включите шифрование соединения между приложением и базой данных, особенно если они на разных серверах.

Настройка MySQL для SSL:

В файле конфигурации:

[mysqld]
ssl-ca=/etc/mysql/ssl/ca.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem

В приложении укажите параметры SSL при подключении.

5.3 Регулярные бэкапы

Об этом мы говорили в предыдущей статье. Бэкапы — часть безопасности, так как они позволяют восстановить данные в случае взлома или повреждения.

5.4 Аудит доступа

Включите логирование всех попыток входа в базу данных, чтобы отслеживать подозрительную активность.

MySQL:

general_log = 1
general_log_file = /var/log/mysql/audit.log

6. Регулярные обновления

Необновлённое ПО — главная причина успешных атак.

6.1 Настройка автоматических обновлений безопасности

На Ubuntu/Debian установите пакет unattended-upgrades:

Bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Включите автоматическую установку только критических обновлений безопасности.

На CentOS/RHEL используйте dnf-automatic:

Bash
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

6.2 Ручная проверка и обновление

Регулярно проверяйте наличие обновлений для всех компонентов:

Bash
sudo apt list --upgradable
sudo apt upgrade --dry-run

Особенно следите за обновлениями веб-сервера, PHP, БД и всех используемых приложений (CMS, фреймворки).

6.3 Мониторинг уязвимостей

Используйте утилиты для сканирования уязвимостей:

  • lynis — проверяет общую конфигурацию системы.
  • clamav — антивирус для поиска вредоносных файлов.
  • chkrootkit или rkhunter — поиск руткитов.

Запускайте их регулярно (например, раз в неделю) и анализируйте отчёты.

7. Мониторинг и обнаружение вторжений

7.1 Логирование и централизация

Включите подробное логирование всех важных сервисов. Используйте централизованный сбор логов для анализа (например, ELK Stack, Graylog).

Минимальный набор логов:

  • SSH-логи (/var/log/auth.log).
  • Веб-сервер (access и error логи).
  • База данных.
  • Системные логи (journalctl).

7.2 Инструменты обнаружения вторжений

  • Fail2ban — мы уже установили, он блокирует злоумышленников.
  • OSSEC — более мощная система, которая анализирует логи, проверяет целостность файлов и обнаруживает аномалии.
  • AIDE — система контроля целостности файлов (следит, не изменялись ли критические файлы).

Установка AIDE:

Bash
sudo apt install aide
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Инициализацию (aideinit) нужно делать сразу после чистой установки ОС и базовой настройки, иначе «эталон» будет содержать уже существующие проблемы.

Регулярно запускайте проверку:

Bash
sudo aide --check

7.3 Настройка оповещений

Настройте отправку критических логов на почту или в мессенджер (Telegram, Slack). Например, можно использовать logwatch:

Bash
sudo apt install logwatch
sudo logwatch --mailto admin@example.com --detail high

Или настроить cron для ежедневного отчёта.

8. Резервное копирование как элемент безопасности

Бэкапы нужны не только для восстановления после сбоя оборудования, но и для случая шифровальщика или удаления данных злоумышленником.

Правила надёжного бэкапа:

  • Делайте бэкап регулярно (ежедневно или чаще).
  • Храните копии вне основного сервера (на отдельном диске, в облаке).
  • Шифруйте бэкапы, если они содержат конфиденциальные данные.
  • Периодически проверяйте, что бэкапы можно восстановить.

Пример скрипта бэкапа с шифрованием:

Bash
# backup_encrypt.sh
tar -czf /backups/files.tar.gz /var/www
gpg --batch --symmetric --cipher-algo AES256 --passphrase "ВАШ_ПАРОЛЬ" /backups/files.tar.gz
mv /backups/files.tar.gz.gpg /secure_backup/
rm /backups/files.tar.gz

Ключ для расшифровки храните отдельно и надёжно.

⚠️ Безопасность: Никогда не храните пароль шифрования в скрипте. Используйте переменные окружения или менеджер секретов (Vault, AWS Secrets Manager и т.п.). Для локальных бэкапов лучше шифровать вручную или использовать отдельный шаг с вводом пароля.

9. Дополнительные продвинутые меры

9.1 Bastion-хост (Jump host)

Используйте промежуточный сервер (bastion) для доступа к внутренним серверам. Все администраторы подключаются сначала к bastion-хосту, а уже через него — к остальным машинам. Это упрощает мониторинг и управление доступом.

9.2 Сегментация сети

Разделите серверы на зоны: публичные (веб-серверы), внутренние (базы данных, кеш) и административные. Настройте фаервол так, чтобы доступ извне был только к публичным сервисам, а внутренние серверы общались только между собой.

9.3 Двухфакторная аутентификация для всех сервисов

Где возможно, включайте 2FA: для SSH (мы уже рассмотрели), для панелей управления, для Git-репозиториев, для доступа к облачным консолям.

10. Заключение

Мы охватили основные аспекты безопасности сервера — от SSH и фаервола до защиты веб-приложений, баз данных, мониторинга и обновлений. Помните, что безопасность — это не конечная цель, а постоянный процесс. Вы никогда не будете защищены на 100%, но ваша задача — сделать взлом настолько сложным и дорогим, чтобы злоумышленник предпочёл более лёгкую цель.

Краткий чек-лист:

  • SSH на нестандартном порту.
  • Отключен вход root.
  • Используются SSH-ключи.
  • Fail2ban настроен.
  • Фаервол открывает только необходимые порты.
  • Веб-сервер скрывает версию и имеет защитные заголовки.
  • База данных доступна только локально (или по SSL).
  • Автоматические обновления включены.
  • Логирование и мониторинг настроены.
  • Бэкапы делаются регулярно и хранятся отдельно.
  • 2FA включена для критических сервисов.

Постоянно пересматривайте свои настройки, следите за новыми уязвимостями и адаптируйте защиту. Это окупится сторицей, когда ваша инфраструктура останется невредимой в то время, как другие серверы падают под атаками.