Новый сервер с публичным IP получает первую попытку SSH-брутфорса в среднем примерно через четыре минуты — это данные по всему нашему парку. Почти всё, что приходит следом, примитивно: перебор паролей, сканеры старых панелей, боты, которые ищут открытый Redis. Этот чек-лист — тот час, который мы советуем потратить до развёртывания чего бы то ни было; шаги идут в порядке важности, для Ubuntu 24.04. Каждый шаг применим и к Debian с минимальными правками.
0. До первого входа
Добавьте публичный SSH-ключ в панели, в разделе SSH-ключи, до оформления заказа. На серверах, развёрнутых с ключом, вход по паролю отключён с первой загрузки, так что первый шаг сводится к проверке, а не к изменению. Если же вы развернули сервер с паролем, выполните первый и второй шаги сразу, в той же сессии.
1. Только ключи, root под замком
Создайте пользователя, добавьте ему свой ключ и отключите парольную аутентификацию для всех.
adduser --disabled-password --gecos "" ops
usermod -aG sudo ops
mkdir -p /home/ops/.ssh && cp ~/.ssh/authorized_keys /home/ops/.ssh/
chown -R ops:ops /home/ops/.ssh && chmod 700 /home/ops/.ssh
cat > /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
LoginGraceTime 20
EOF
sshd -t && systemctl reload ssh
Откройте второй терминал и убедитесь, что можете войти как ops по своему ключу, прежде чем закрывать первый. Вся суть в drop-in-каталоге: обновления Ubuntu его не перезаписывают, в отличие от правок самого sshd_config.
2. Файрвол, который по умолчанию всё запрещает
Для большинства серверов хватает трёх правил: разрешить SSH, разрешить HTTP и HTTPS, запретить всё остальное. nftables уже установлен; ufw — удобная надстройка над ним.
ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp comment 'ssh, rate limited'
ufw allow 80,443/tcp comment 'web'
ufw enable
limit вместо allow на порту 22 блокирует адрес после шести попыток подключения за тридцать секунд, что заметно сбивает пыл брутфорса ещё до того, как подключится fail2ban. Помните, что Docker по умолчанию публикует порты в обход ufw; если вы запускаете контейнеры, либо привязывайте их к 127.0.0.1 и ставьте перед ними обратный прокси, либо задайте "iptables": false в /etc/docker/daemon.json и управляйте правилами самостоятельно.
3. Автоматические обновления безопасности
Автоматические обновления (unattended-upgrades) есть в наших образах, но включены не всегда. Включите их и задайте машине окно для перезагрузки, чтобы обновления ядра действительно применялись.
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
cat > /etc/apt/apt.conf.d/52reboot <<'EOF'
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:30";
EOF
Если ночная перезагрузка неприемлема, оставьте автоматическую перезагрузку выключенной и подпишитесь на рассылку Ubuntu по безопасности. Неприемлемо другое — сервер, который никто не обновляет: именно так начинается большинство жалоб (abuse), которые нам приходят.
4. fail2ban для длинного хвоста атак
apt install -y fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
[sshd]
enabled = true
EOF
systemctl enable --now fail2ban
Когда вход разрешён только по ключам, fail2ban не столько защищает вход, сколько помогает сохранить журнал читаемым. Бэкенд systemd важен на 24.04, потому что /var/log/auth.log по умолчанию больше не пишется.
5. Время, имя хоста, локаль
Сертификаты, журналы и коды двухфакторной аутентификации зависят от правильных часов. В наших образах systemd-timesyncd синхронизируется с нашими собственными серверами stratum-2; убедитесь с помощью timedatectl, что выводится System clock synchronized: yes. Задайте то имя хоста, которое вы указали в панели, командой hostnamectl set-hostname web-01, чтобы rDNS, почта и мониторинг использовали одно и то же имя.
6. Несколько настроек ядра
cat > /etc/sysctl.d/60-hardening.conf <<'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_syncookies = 1
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
EOF
sysctl --system
Это значения по умолчанию в hardened-дистрибутивах, и они ничем вам не обходятся. Не копируйте с форумов случайные sysctl «для производительности»: большинство из них появились задолго до нынешнего ядра, а некоторые и вовсе делают хуже.
7. Знайте, что слушает порты
ss -tulpn выводит все слушающие сокеты. На свежем образе там должны быть sshd на 22 и systemd-resolved на 127.0.0.53, и больше ничего. Каждый сервис, который вы добавите позже, должен быть либо привязан к localhost, либо иметь правило файрвола, которое вы можете объяснить. Redis, MongoDB, Elasticsearch и API Docker в разное время поставлялись с настройками, при которых они слушали все интерфейсы без аутентификации, и каждый такой случай обернулся чьей-то утечкой данных.
8. Пользователи и sudo
Один человек — один аккаунт. Общие пароли root — верный способ потерять понимание, кто что удалил. Требуйте пароль для sudo (так по умолчанию), а если сервером управляют несколько человек, задайте Defaults logfile=/var/log/sudo.log в файле внутри /etc/sudoers.d/, чтобы привилегированные команды фиксировались.
9. Двухфакторная аутентификация — в панели, а не в SSH
Включите двухфакторную аутентификацию TOTP в своём аккаунте CheapServ: через панель можно переустановить сервер, открыть консоль и сменить пароль root, а значит, это более лакомая цель. SSH с аппаратным ключом (YubiKey через ssh-keygen -t ed25519-sk) надёжнее TOTP для SSH и проще в эксплуатации.
10. Резервная копия до первого развёртывания
Сделайте снапшот в панели прямо сейчас, пока система чистая и заведомо рабочая. Это самый быстрый откат, который у вас когда-либо будет. Затем настройте внешнюю резервную копию данных, которые вы будете создавать; мы написали отдельное руководство с рецептом на restic, который обходится в несколько долларов в месяц.
11. Что-то, что сообщит вам о поломке
Как минимум — бесплатный мониторинг доступности, который раз в минуту обращается к вашему сайту и присылает вам письмо при сбое. Лучше — netdata (одно из наших дополнений) для наблюдения за CPU, диском и сетью в реальном времени и сборщик логов, если серверов больше одного. Дашборды вы смотреть не будете; вам нужно оповещение.
12. Десятиминутная проверка — и можно развёртывать
ssh ops@serverработает по ключу;ssh root@serverс паролем отклоняется.ufw status verboseпоказывает запрет по умолчанию и ваши три правила.systemctl status unattended-upgrades fail2banпоказывает, что обе службы активны.ss -tulpnне показывает ничего, что вы не смогли бы назвать.- Снапшот создан, а двухфакторная аутентификация в панели включена.
Вот и весь час. Всё, что будет после — от обратного прокси до базы данных, — стоит на фундаменте, из-за которого вам не позвонят в три часа ночи. Если не хочется делать всё вручную, дополнения fail2ban, Автоматические обновления безопасности и Tailscale в форме заказа применяют шаги 3 и 4 и настраивают приватный канал управления прямо при развёртывании.
