Первый час на новом VPS с Ubuntu: чек-лист по защите

Только ключи, файрвол с запретом по умолчанию, автопатчи и несколько параметров ядра: двенадцать шагов, которые стоит сделать до любого деплоя.

КбКоманда безопасности CheapServАвтор 8 мин чтения
Щит перед сервером, рядом с ним ключ
На этой странице13
  1. 0. До первого входа
  2. 1. Только ключи, root под замком
  3. 2. Файрвол, который по умолчанию всё запрещает
  4. 3. Автоматические обновления безопасности
  5. 4. fail2ban для длинного хвоста атак
  6. 5. Время, имя хоста, локаль
  7. 6. Несколько настроек ядра
  8. 7. Знайте, что слушает порты
  9. 8. Пользователи и sudo
  10. 9. Двухфакторная аутентификация — в панели, а не в SSH
  11. 10. Резервная копия до первого развёртывания
  12. 11. Что-то, что сообщит вам о поломке
  13. 12. Десятиминутная проверка — и можно развёртывать

Новый сервер с публичным 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 и настраивают приватный канал управления прямо при развёртывании.

Кб
Команда безопасности CheapServ

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

Разверните первый сервер меньше чем за минуту.

Пополните баланс от $25 в BTC, ETH, XMR или USDT. Баланс не сгорает, а неиспользованные средства можно вернуть.

Создать аккаунт