На этой странице
Новый сервер доступен из всего интернета сразу после запуска, а автоматические сканеры быстро находят новые адреса. Защита сервера сводится к одному правилу: открывайте наружу только то, что действительно обслуживаете, и своевременно устанавливайте обновления. Выполняйте шаги по порядку из SSH-сессии, которую держите открытой, пока не проверите каждое изменение.
Не заблокируйте доступ самому себе. Разрешите SSH до включения файрвола, проверяйте каждое изменение из второго терминала и помните, что консоль IPMI в личном кабинете работает, даже если с правилом что-то пошло не так.
Проверьте, что слушает порты
ss -tulpnКаждая строка — это открытый порт. В столбце Local Address значения 0.0.0.0, [::] или * означают все интерфейсы, включая публичный, а 127.0.0.1 и [::1] — только локальный. Остановите и отключите то, что вам не нужно, например:
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
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 verboseufw создает соответствующие правила для IPv6, если в /etc/default/ufw задано IPV6=yes (это значение по умолчанию). Чтобы принимать SSH только со своего адреса, добавьте конкретное правило, прежде чем удалять общее:
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
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"):
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):
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:
apt install -y fail2ban python3-systemdСоздайте /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 198.51.100.7
[sshd]
enabled = true
backend = systemdsystemctl 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 установите и включите его:
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:
dnf install -y dnf-automatic dnf-plugins-coreВ /etc/dnf/automatic.conf задайте upgrade_type = security и apply_updates = yes в секции [commands], затем включите таймер. dnf needs-restarting -r сообщит, когда нужна перезагрузка:
systemctl enable --now dnf-automatic.timer
dnf needs-restarting -rDocker обходит ufw и firewalld
Docker создает собственные правила iptables, и трафик к опубликованному порту контейнера перенаправляется раньше, чем его увидят правила вашего файрвола для входящего трафика. Контейнер, запущенный с -p 6379:6379, доступен из всего интернета, что бы ни показывал ufw. Есть два решения:
Публикуйте порты на localhost и ставьте обратный прокси перед всем, что должно быть доступно публично. В Compose пишите
"127.0.0.1:6379:6379".docker run -d -p 127.0.0.1:6379:6379 redisФильтруйте трафик в цепочке DOCKER-USER, которую Docker обрабатывает раньше собственных правил. Замените
eth0на свой публичный интерфейс (ip route show default):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. Не используйте директиву chronyallow, если не собираетесь раздавать время: открытый в интернет NTP-сервер могут использовать для атак с усилением. - Проведите аудит с помощью Lynis (по желанию; пакет есть в Debian, Ubuntu и EPEL).
lynis audit systemвыдает конкретные рекомендации: относитесь к ним как к чек-листу, а не как к баллам, которые нужно набрать по максимуму. - Не открывайте внеполосный доступ посторонним. Пользуйтесь консолью IPMI только через личный кабинет и защитите свой аккаунт в личном кабинете уникальным паролем.
Следующие шаги
- Что покрывает входящая в стоимость защита сети, читайте в руководстве Как работает защита от DDoS на вашем сервере.
- Завершите базовую настройку с помощью руководства «Первые шаги».
- Потеряли доступ после изменения правил файрвола? Воспользуйтесь консолью IPMI или обратитесь в поддержку — она работает 24/7.