10 из 15 конфигураций серверов в наличииМгновенная выдачаБез платы за установку

Безопасность

Защита нового сервера: файрвол, fail2ban и автоматические обновления

Закройте все порты, на которых не работают ваши сервисы, защитите SSH, блокируйте попытки подбора паролей, настройте автоматическую установку обновлений и не допускайте брешей в файрволе, которые создает Docker. Команды для Ubuntu, Debian, AlmaLinux и Rocky Linux.

6 мин чтенияОбновлено UbuntuDebianAlmaLinuxRocky Linux

Применимо к
UbuntuDebianAlmaLinuxRocky Linux
Время чтения
6 минут
Обновлено

Не получается? Инженеры отвечают 24/7

На этой странице

Новый сервер доступен из всего интернета сразу после запуска, а автоматические сканеры быстро находят новые адреса. Защита сервера сводится к одному правилу: открывайте наружу только то, что действительно обслуживаете, и своевременно устанавливайте обновления. Выполняйте шаги по порядку из SSH-сессии, которую держите открытой, пока не проверите каждое изменение.

Не заблокируйте доступ самому себе. Разрешите SSH до включения файрвола, проверяйте каждое изменение из второго терминала и помните, что консоль IPMI в личном кабинете работает, даже если с правилом что-то пошло не так.

Проверьте, что слушает порты

Shell
ss -tulpn

Каждая строка — это открытый порт. В столбце Local Address значения 0.0.0.0, [::] или * означают все интерфейсы, включая публичный, а 127.0.0.1 и [::1] — только локальный. Остановите и отключите то, что вам не нужно, например:

Shell
systemctl disable --now rpcbind.service rpcbind.socket

Сервисы, которыми пользуются только ваши собственные приложения, должны слушать localhost: bind-address = 127.0.0.1 для MySQL и MariaDB, listen_addresses = 'localhost' для PostgreSQL, bind 127.0.0.1 -::1 с protected-mode yes для Redis. Никогда не открывайте в интернет базы данных, Redis, Memcached или Elasticsearch. Если они нужны другому серверу, используйте бесплатную приватную VLAN между вашими серверами (по запросу) или VPN, а также белый список в файрволе.

Настройте файрвол

По умолчанию запрещайте входящий трафик и открывайте только порты своих сервисов. В примерах открыты SSH, HTTP и HTTPS.

Ubuntu и Debian: ufw

Shell
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw enable
ufw status verbose

ufw создает соответствующие правила для IPv6, если в /etc/default/ufw задано IPV6=yes (это значение по умолчанию). Чтобы принимать SSH только со своего адреса, добавьте конкретное правило, прежде чем удалять общее:

Shell
ufw allow from 198.51.100.7 to any port 22 proto tcp
ufw delete allow 22/tcp

Если ваш адрес часто меняется, используйте вместо этого ufw limit 22/tcp: это правило отклоняет адреса, которые открывают 6 и более подключений за 30 секунд.

AlmaLinux и Rocky Linux: firewalld

Shell
dnf install -y firewalld
systemctl enable --now firewalld
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload
firewall-cmd --list-all

Зона по умолчанию public обычно разрешает ssh, cockpit и dhcpv6-client; пропустите строку с cockpit, если пользуетесь его веб-консолью. Правила без указания семейства адресов применяются и к IPv4, и к IPv6. Чтобы принимать SSH только со своего адреса (если подключаетесь по IPv6, добавьте второе правило с family="ipv6"):

Shell
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.7/32" service name="ssh" accept'
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload

В актуальных релизах и ufw, и firewalld работают поверх nftables. Вместо них можно вручную написать /etc/nftables.conf, но выберите что-то одно: если смешивать собственный набор правил с ufw или firewalld, результат будет трудно предсказать.

Защитите SSH

Входите только по ключам. Руководство Вход по SSH-ключам проведет вас через все шаги, включая создание файла /etc/ssh/sshd_config.d/00-keys-only.conf, который отключает вход по паролю. Затем добавьте несколько ограничений во второй drop-in-файл — /etc/ssh/sshd_config.d/10-hardening.conf. Актуальные релизы читают эти файлы раньше основной конфигурации, и действует первое прочитанное значение:

Конфигурация
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no

Проверьте синтаксис, затем перезагрузите конфигурацию (в AlmaLinux и Rocky Linux служба называется sshd):

Shell
sshd -t
systemctl reload ssh

Когда начнете входить под пользователем с sudo, например deploy, замените в 00-keys-only.conf значение PermitRootLogin на no. Перенос SSH на другой порт уменьшает шум в логах, но мерой безопасности не является.

Блокируйте подбор паролей с помощью fail2ban

fail2ban считывает неудачные попытки входа из журнала systemd и на время блокирует адрес источника в файрволе. В AlmaLinux и Rocky Linux сначала подключите EPEL (dnf install -y epel-release) и установите те же два пакета с помощью dnf:

Shell
apt install -y fail2ban python3-systemd

Создайте /etc/fail2ban/jail.local:

INI
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 198.51.100.7

[sshd]
enabled = true
backend = systemd
Shell
systemctl enable --now fail2ban
fail2ban-client status sshd

На публичном сервере счетчики в выводе Total failed обычно начинают расти уже через несколько минут. Если там по-прежнему 0, фильтр не соответствует вашим логам: начиная с OpenSSH 9.8 неудачные попытки входа записывает sshd-session, а старые фильтры fail2ban эти записи пропускают, поэтому обновите fail2ban. Чтобы снять блокировку: fail2ban-client set sshd unbanip 198.51.100.7.

Устанавливайте обновления безопасности автоматически

В Ubuntu unattended-upgrades обычно уже включен. В Debian установите и включите его:

Shell
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

Оба значения в /etc/apt/apt.conf.d/20auto-upgrades должны быть равны "1"; пробный запуск можно выполнить командой unattended-upgrade --dry-run --debug. Обновления ядра требуют перезагрузки: чтобы сервер автоматически перезагружался в часы минимальной нагрузки, задайте Unattended-Upgrade::Automatic-Reboot "true"; и Unattended-Upgrade::Automatic-Reboot-Time "04:00"; в /etc/apt/apt.conf.d/50unattended-upgrades.

В AlmaLinux и Rocky Linux установите dnf-automatic:

Shell
dnf install -y dnf-automatic dnf-plugins-core

В /etc/dnf/automatic.conf задайте upgrade_type = security и apply_updates = yes в секции [commands], затем включите таймер. dnf needs-restarting -r сообщит, когда нужна перезагрузка:

Shell
systemctl enable --now dnf-automatic.timer
dnf needs-restarting -r

Docker обходит ufw и firewalld

Docker создает собственные правила iptables, и трафик к опубликованному порту контейнера перенаправляется раньше, чем его увидят правила вашего файрвола для входящего трафика. Контейнер, запущенный с -p 6379:6379, доступен из всего интернета, что бы ни показывал ufw. Есть два решения:

  1. Публикуйте порты на localhost и ставьте обратный прокси перед всем, что должно быть доступно публично. В Compose пишите "127.0.0.1:6379:6379".

    Shell
    docker run -d -p 127.0.0.1:6379:6379 redis
  2. Фильтруйте трафик в цепочке DOCKER-USER, которую Docker обрабатывает раньше собственных правил. Замените eth0 на свой публичный интерфейс (ip route show default):

    Shell
    iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 6379 --ctdir ORIGINAL -j DROP

    Эти правила не сохраняются после перезагрузки: применяйте их из юнита systemd или через систему управления конфигурацией, а если контейнеры используют IPv6, продублируйте их с помощью ip6tables.

Никогда не открывайте Docker API на TCP-порту 2375: любой, кто до него доберется, получит root-доступ к хосту. Вместо этого управляйте удаленными экземплярами Docker через SSH, например DOCKER_HOST=ssh://deploy@203.0.113.10.

Синхронизация времени, аудит и доступ к консоли

  • Следите за точностью часов. От нее зависят TLS, коды двухфакторной аутентификации и сопоставление логов. Команда timedatectl должна показывать System clock synchronized: yes; если служба времени не запущена, установите chrony. Не используйте директиву chrony allow, если не собираетесь раздавать время: открытый в интернет NTP-сервер могут использовать для атак с усилением.
  • Проведите аудит с помощью Lynis (по желанию; пакет есть в Debian, Ubuntu и EPEL). lynis audit system выдает конкретные рекомендации: относитесь к ним как к чек-листу, а не как к баллам, которые нужно набрать по максимуму.
  • Не открывайте внеполосный доступ посторонним. Пользуйтесь консолью IPMI только через личный кабинет и защитите свой аккаунт в личном кабинете уникальным паролем.

Следующие шаги

Нужна помощь?

Клиенты с активным сервером создают тикеты в личном кабинете, а отвечают на них инженеры 24/7.

Как работает поддержка