Безопасность сервера начинается с трёх обязательных слоёв защиты: брандмауэр фильтрует трафик, автоматические обновления закрывают уязвимости, а DNSSEC предотвращает подмену DNS-ответов. Без любого из этих слоёв сервер остаётся открытым для атак. В этом руководстве - готовые команды и конфигурации, которые можно применить за один рабочий день и сразу сократить поверхность атаки.
Вы настроите iptables и Windows Firewall с правилами под конкретные службы, автоматизируете установку патчей безопасности через unattended-upgrades и dnf-automatic, подпишете DNS-зону с DNSSEC на BIND. Каждый раздел содержит проверенные на практике конфигурации - копируйте и адаптируйте под свою среду.
Быстрый старт: минимальный набор мер для защиты сервера за 30 минут
Когда времени на полный аудит нет, выполните этот чек-лист. Пять шагов, которые закрывают основные векторы атак и не требуют длительной настройки.
- Обновите систему. Установите все доступные патчи безопасности одной командой:
apt update && apt upgrade -y(Debian/Ubuntu) илиdnf update --security -y(RHEL/CentOS). - Настройте брандмауэр. Разрешите только нужные порты. Для iptables базовый набор:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPTiptables -P INPUT DROP
Сохраните правила:netfilter-persistent save. - Отключите вход root по SSH. В
/etc/ssh/sshd_configустановитеPermitRootLogin noи перезапустите sshd. - Включите автоматические обновления безопасности. Установите
unattended-upgradesи настройте его только на security-репозиторий. - Установите fail2ban. Три команды:
apt install fail2ban -y,systemctl enable fail2ban --now. Стандартная конфигурация защитит SSH от перебора.
Эти пять действий не заменяют полноценный hardening, но дают выигрыш во времени. Сервер перестаёт быть легкой мишенью для автоматизированных сканеров. Детальная настройка каждого пункта - в следующих разделах.
Настройка брандмауэра: iptables для Linux и Windows Firewall для Windows Server
Брандмауэр - первый рубеж обороны. Он решает, какой трафик достигает служб сервера. Правила должны следовать принципу «запрещено всё, что не разрешено явно». Ниже - пошаговая настройка для обеих платформ.
Практическая настройка iptables: от базовых правил до блокировки IP-адресов
iptables работает с цепочками правил. Пакет проходит через цепочки INPUT (входящий трафик), OUTPUT (исходящий) и FORWARD (транзитный). Для защиты сервера достаточно настроить INPUT.
Просмотрите текущие правила:
iptables -L -v -n
Если таблица пуста или содержит только политику ACCEPT, начните с создания базового набора. Ниже - скрипт, который разрешает SSH, HTTP/HTTPS, DNS и ping, блокируя всё остальное:
#!/bin/bash
# Сброс всех правил
iptables -F
iptables -X
# Политика по умолчанию: запретить входящий трафик
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешить loopback
iptables -A INPUT -i lo -j ACCEPT
# Разрешить установленные и связанные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH (порт 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP и HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS (UDP и TCP)
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Логирование заблокированных пакетов (ограничение частоты)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
Сохраните правила:
apt install iptables-persistent -y
netfilter-persistent save
Для блокировки конкретного IP-адреса используйте:
iptables -A INPUT -s 203.0.113.50 -j DROP
Блокировка целой подсети:
iptables -A INPUT -s 203.0.113.0/24 -j DROP
Правило с ограничением количества подключений защищает от brute-force атак на SSH:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Это разрешает не более трёх новых SSH-соединений в минуту с одного IP. Четвёртая попытка блокируется. Подробнее о стратегиях блокировки IP и автоматизации этого процесса - в нашем руководстве по блокировке IP-адресов.
Windows Firewall: создание правил через графический интерфейс и PowerShell
Windows Firewall в Windows Server 2022/2025 управляется через оснастку wf.msc или PowerShell. Три профиля - Domain, Private, Public - определяют, какие правила активны в зависимости от сетевого расположения. На сервере обычно активен доменный профиль.
Создание правила через графический интерфейс:
- Откройте
wf.msc. - Выберите «Правила для входящих подключений» → «Создать правило».
- Тип правила: «Для порта», укажите TCP и порт 443.
- Действие: «Разрешить подключение».
- Профиль: отметьте Domain.
- Имя: «HTTPS Web Server».
Тот же результат через PowerShell - быстрее и воспроизводимее:
New-NetFirewallRule -DisplayName "HTTPS Web Server" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow -Profile Domain
Разрешение RDP только для конкретного IP:
New-NetFirewallRule -DisplayName "RDP from Admin" -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress 198.51.100.25 -Action Allow -Profile Domain
Включение логирования блокированных пакетов:
Set-NetFirewallProfile -Name Domain -LogBlocked True -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log"
Экспорт текущей политики для резервного копирования или переноса:
Export-NetFirewallPolicy -Path "C:\Backup\firewall-policy.wfw"
Импорт политики на другом сервере:
Import-NetFirewallPolicy -Path "C:\Backup\firewall-policy.wfw"
Автоматизация установки обновлений: безопасность без ручного вмешательства
Уязвимости в ПО обнаруживаются ежедневно. Ручная установка обновлений создаёт окно, в течение которого сервер уязвим. Автоматизация решает эту проблему, но требует тонкой настройки: обновления безопасности должны применяться немедленно, а обновления пакетов с изменением функциональности - по расписанию.
Настройка unattended-upgrades на Debian/Ubuntu
Установите пакет:
apt install unattended-upgrades -y
Основной конфигурационный файл - /etc/apt/apt.conf.d/50unattended-upgrades. Минимальная рабочая конфигурация, которая обновляет только пакеты из security-репозитория:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Параметр Automatic-Reboot установлен в false - перезагрузка после обновления ядра не выполняется автоматически. В продакшене это критично: вы сами решите, когда перезагрузить сервер.
Активируйте автоматические обновления в /etc/apt/apt.conf.d/20auto-upgrades:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
Проверьте логи:
cat /var/log/unattended-upgrades/unattended-upgrades.log
Автоматические обновления в RHEL/CentOS с dnf-automatic
Установите dnf-automatic:
dnf install dnf-automatic -y
Отредактируйте /etc/dnf/automatic.conf:
[commands]
upgrade_type = security
download_updates = yes
apply_updates = yes
[emitters]
emit_via = motd
Параметр upgrade_type = security гарантирует, что применяются только патчи безопасности. Включите таймер systemd:
systemctl enable --now dnf-automatic.timer
Таймер по умолчанию запускает обновление ежедневно. Проверить статус:
systemctl status dnf-automatic.timer
Логи доступны через journalctl:
journalctl -u dnf-automatic
Защита DNS-сервера: внедрение DNSSEC для предотвращения атак
DNS-запросы по умолчанию не защищены от подмены. Злоумышленник может перенаправить пользователя на фишинговый сайт, подменив ответ DNS-сервера. DNSSEC решает эту проблему криптографической подписью каждой записи зоны. Резолвер проверяет цепочку доверия от корневой зоны до конкретного домена и отвергает поддельные ответы.
Генерация ключей и подписание зоны в BIND
DNSSEC использует два типа ключей: KSK (Key Signing Key) подписывает ключи зоны, ZSK (Zone Signing Key) подписывает записи. Разделение позволяет менять ZSK без обновления DS-записи у регистратора.
Создайте директорию для ключей и перейдите в неё:
mkdir /etc/bind/keys
example.com
cd /etc/bind/keys/example.com
Сгенерируйте ZSK:
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE example.com
Сгенерируйте KSK:
dnssec-keygen -a RSASHA256 -b 4096 -n ZONE -f KSK example.com
Добавьте публичные ключи в файл зоны:
cat Kexample.com.*.key >> /etc/bind/db.example.com
Подпишите зону:
dnssec-signzone -o example.com -k Kexample.com.*.private /etc/bind/db.example.com
Команда создаст файл db.example.com.signed. Обновите named.conf, указав подписанный файл:
zone "example.com" {
type master;
file "/etc/bind/db.example.com.signed";
dnssec-enable yes;
dnssec-validation auto;
};
Перезапустите BIND:
systemctl restart named
Проверка работоспособности DNSSEC
Проверьте наличие флага ad (authenticated data) в ответе:
dig +dnssec example.com @localhost
Если DNSSEC работает, ответ содержит флаг ad и записи RRSIG. Проверьте цепочку доверия от корневой зоны:
dig +dnssec +trace example.com
Последний шаг - передать DS-запись регистратору домена. Она содержится в файле dsset-example.com, созданном при подписании зоны. Без этого шага внешние резолверы не смогут проверить подпись вашей зоны.
Снижение поверхности атаки: аудит и отключение ненужных служб
Каждая служба, слушающая сетевой порт - потенциальная точка входа. Аудит открытых портов показывает реальную поверхность атаки. Цель - оставить только необходимые службы и закрыть остальные.
Для Linux используйте ss:
ss -tulpn
Вывод покажет все слушающие порты и процессы, которые их открыли. Типовые кандидаты на отключение: telnet (порт 23), rsh (514), старые версии SNMP (161), CUPS (631), если сервер не является принт-сервером, Avahi (5353) для mDNS.
Отключите ненужную службу:
systemctl stop
systemctl disable
Для Windows Server аналогичную информацию даёт PowerShell:
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess
Сопоставьте PID процесса с его именем:
Get-Process -Id | Select-Object Name
Используйте минимальные образы ОС при развёртывании новых серверов. Например, Ubuntu Server без графического окружения или Windows Server Core без рабочего стола. Меньше пакетов - меньше уязвимостей. Более глубокий подход к аудиту с инструментами Lynis и OpenSCAP описан в руководстве по hardening Linux-сервера.
Мониторинг и реагирование: анализ логов брандмауэра
Настроенный брандмауэр генерирует логи. Их анализ выявляет атаки на ранней стадии: сканирование портов, попытки подбора паролей, обращения к закрытым службам.
В iptables логирование включается правилом с целью LOG. Оно уже добавлено в базовый скрипт выше. Логи попадают в syslog:
grep "iptables denied" /var/log/syslog
Поиск IP-адресов с наибольшим количеством блокировок за последний час:
grep "iptables denied" /var/log/syslog | awk '{print $NF}' | sort | uniq -c | sort -nr | head -10
Если какой-то IP генерирует сотни блокировок - добавьте его в постоянный бан:
iptables -A INPUT -s -j DROP
netfilter-persistent save
В Windows Firewall логи записываются в файл, указанный при настройке профиля. Анализируйте его через PowerShell:
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" | Select-String "DROP"
Fail2ban автоматизирует этот процесс: читает логи, обнаруживает множественные неудачные попытки и добавляет блокирующие правила. Интеграция fail2ban с iptables настраивается в /etc/fail2ban/jail.local. Готовые конфигурации для разных сценариев - в материале по автоматизации блокировки IP.
Интеграция в DevOps-пайплайн: безопасность как код
Ручная настройка безопасности на каждом сервере не масштабируется. Конфигурации брандмауэра, обновлений и аудита должны храниться в Git и применяться автоматически через систему управления конфигурациями.
Пример Ansible-роли для настройки iptables и unattended-upgrades:
---
- name: Configure basic firewall and auto-updates
hosts: all
become: yes
tasks:
- name: Install iptables-persistent
apt:
name: iptables-persistent
state: present
- name: Deploy iptables rules
copy:
src: files/rules.v4
dest: /etc/iptables/rules.v4
notify: reload iptables
- name: Install unattended-upgrades
apt:
name: unattended-upgrades
state: present
- name: Configure unattended-upgrades
copy:
src: files/50unattended-upgrades
dest: /etc/apt/apt.conf.d/50unattended-upgrades
handlers:
- name: reload iptables
command: iptables-restore < /etc/iptables/rules.v4
Храните конфигурационные файлы в репозитории вместе с кодом приложения. При развёртывании нового сервера Ansible применяет роль, и защита включается до того, как сервер начнёт обрабатывать трафик.
Включите проверку безопасности в CI/CD-пайплайн. Линтеры конфигураций (например, ansible-lint) отлавливают ошибки до применения. Сканеры уязвимостей контейнеров (Trivy, Grype) проверяют образы на этапе сборки. Такой подход - «security as code» - делает безопасность воспроизводимой и версионируемой.
Часто задаваемые вопросы (FAQ)
Что делать, если после настройки iptables пропал доступ по SSH?
Подключитесь к серверу через консоль провайдера (IPMI, KVM, VNC). Просмотрите текущие правила: iptables -L -v -n. Если правило для порта 22 отсутствует или имеет неправильный порт - добавьте его: iptables -A INPUT -p tcp --dport 22 -j ACCEPT. Проверьте, что SSH слушает именно этот порт: ss -tulpn | grep ssh. После восстановления доступа сохраните правила.
Как часто нужно обновлять ключи DNSSEC?
ZSK рекомендуется менять раз в 6–12 месяцев, KSK - раз в 1–2 года. Автоматическое переподписание зоны настраивается в BIND через опцию auto-dnssec maintain в конфигурации зоны. При смене KSK требуется обновить DS-запись у регистратора - планируйте это заранее.
Можно ли использовать nftables вместо iptables?
Да. nftables - современная замена iptables, доступная во всех актуальных дистрибутивах Linux. Синтаксис отличается, но принципы те же. Пример базового набора правил на nftables и сравнение с iptables - в руководстве по безопасности Linux-сервера. Если вы начинаете новый проект, выбирайте nftables. Если поддерживаете существующую инфраструктуру с iptables - миграция оправдана при плановом обновлении.
Как проверить, что автоматические обновления работают?
Для unattended-upgrades проверьте лог: cat /var/log/unattended-upgrades/unattended-upgrades.log. Запись с Packages that were upgraded: подтверждает установку обновлений. Для dnf-automatic: journalctl -u dnf-automatic --since today. Если лог пуст - проверьте статус таймера: systemctl status dnf-automatic.timer.