Первые 30 минут: чек-лист усиления VPS
Свежий VPS получает первый SSH-скан в течение минут после получения IP. Вот точная последовательность, которую я выполняю на каждом новом боксе — готово к копипасту для Debian 13, с таблицей чек-листа в конце.
Допущения: свежий образ Debian 13 из вашего деплоя VPSRento, вы вошли как root по SSH, и пример IP — 185.220.101.14 — подставьте свой. Общее время: около получаса. Выполняйте шаги по порядку; шаг 2 может заблокировать вас, если поспешить.
1. Создайте своего sudo-пользователя
Работа под root — это как опечатки превращаются в инциденты. Создайте реального пользователя, дайте ему sudo и делайте всё оттуда:
# create the user (you'll set a password — still useful for sudo)
adduser ops
# grant sudo
usermod -aG sudo ops
Всё ниже этого пункта выполняется как ops , если не указано иное.
2. Только SSH-ключи — никаких паролей, никакого root-логина
Парольная аутентификация — самая большая дыра на интернет-ориентированном боксе. Боты долбят порт 22 списками учёток весь день, каждый день. Ключи делают весь класс атак неактуальным. На вашей локальной машине:
# generate a keypair if you don't have one (ed25519, no passphrase tradeoff is yours)
ssh-keygen -t ed25519 -C "ops@atlas"
# push the public key to the server
ssh-copy-id [email protected]
Убедитесь, что можете войти с ключом в новом терминал — ssh [email protected] — перед тем как трогать конфиг. Держите существующую root-сессию открытой как запасной выход. Затем отредактируйте /etc/ssh/sshd_config:
# /etc/ssh/sshd_config — the three lines that matter
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
# validate the config, then reload (Debian 13 uses ssh.service)
sshd -t && systemctl reload ssh
prohibit-password вместо плоского no для root намеренно: root всё ещё может аутентифицироваться с ключом с вашей рабочей станции, что иногда полезно для восстановления через консоль провайдера — но никакой пароль никогда не сработает, ни для кого, ниоткуда. Подтвердите с помощью sshd -T | grep -E 'passwordauthentication|permitrootlogin'.
3. Файрвол: запрет по умолчанию, разрешайте только то, что запускаете
ufw в Debian — тонкий, адекватный слой поверх nftables. Политика — это безопасность; правила — лишь исключения из неё:
apt update && apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
# SSH stays open — add this BEFORE enabling
ufw allow 22/tcp comment 'SSH'
# whatever your box actually serves, e.g.:
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw enable
ufw status verbose
Каждый открытый порт должен иметь имя и причину. Если вы не можете назвать, для чего порт, — ему не место в правилах.
4. fail2ban: замедлите ботов до ползания
С отключённой парольной аутентификацией брутфорс уже мёртв — но fail2ban держит ваши логи читаемыми и банит сканеры, которые тыкаются во всё остальное:
apt install -y fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
systemctl enable --now fail2ban
# watch it work
fail2ban-client status sshd
5. Автоматические обновления безопасности
Незапатченная CVE — больший риск, чем перезагрузка. unattended-upgrades в Debian устанавливает обновления безопасности сам:
apt install -y unattended-upgrades
# answer Yes to auto-install updates
dpkg-reconfigure -plow unattended-upgrades
Конфиг по умолчанию в /etc/apt/apt.conf.d/50unattended-upgrades тянет только из security-репозитория — что и нужно на сервере: исправления безопасности автоматически, всё остальное — когда вы решите.
6. Отключите то, что не запускаете
Каждый работающий сервис — это поверхность атаки, которую придётся патчить. Посмотрите, что реально слушает:
# who is listening, on what, as which process
ss -tulpn
# everything enabled at boot
systemctl list-unit-files --state=enabled
# example: you don't run a print server — nobody does
systemctl disable --now cups
Правило: если вы не можете сказать, что делает слушатель, — выясните, прежде чем позволить ему жить. На минимальном образе VPSRento должно быть очень мало кроме sshd и вашего собственного приложения.
7. Опционально, но рекомендуется: плоскость управления WireGuard
Самая сильная версия безопасности SSH — это SSH, который вообще не выходит в интернет. Запустите WireGuard на сервере, разрешите SSH только внутри туннеля, и порт 22 исчезнет из поля зрения всех сканеров на земле:
apt install -y wireguard
# /etc/wireguard/wg0.conf — minimal management tunnel
# [Interface] Address = 10.8.0.1/24, ListenPort = 51820
# open the tunnel, not the shell
ufw allow 51820/udp comment 'WireGuard'
ufw allow in on wg0 to any port 22 proto tcp comment 'SSH via WG'
ufw delete allow 22/tcp
systemctl enable --now wg-quick@wg0
После этого вы ssh [email protected] через туннель, и публичный IP отвечает ровно на один UDP-порт. Полное руководство по WireGuard — ключи, пиры, конфиги клиентов, QR-коды для телефона — в сопутствующем руководстве.
Контрольный список из 10 пунктов
Пройдитесь по этой таблице после каждого нового деплоя и снова после каждого добавленного сервиса:
| # | Пункт | Где находится | Проверить с помощью |
|---|---|---|---|
| 1 | Не-root sudo пользователь | /etc/passwd | id ops |
| 2 | SSH-аутентификация только по ключам | sshd_config | sshd -T | grep passwordauth |
| 3 | Вход root по паролю отключен | sshd_config | sshd -T | grep permitrootlogin |
| 4 | Файрвол: запрет входящих по умолчанию | ufw | ufw status verbose |
| 5 | Открыты только именованные порты | ufw | ufw status numbered |
| 6 | Тюрьма fail2ban sshd активна | jail.local | fail2ban-client status sshd |
| 7 | Автоматические обновления безопасности | apt | systemctl status unattended-upgrades |
| 8 | Нет необъяснимых слушателей | — | ss -tulpn |
| 9 | Управление через WireGuard (опционально) | wg0.conf | wg show |
| 10 | Снапшот после укрепления | Дополнение в клиентской зоне, $1.99/мес | Услуги → ваш VPS → снапшоты |
Пункт 10 заслуживает одного предложения: сначала укрепление, потом снапшот, в таком порядке — снапшот чистого укрепленного сервера — это ваш откат для любой будущей ошибки. Ежедневные внешние снапшоты — это дополнение за $1.99/мес в клиентской зоне. Тридцать минут профилактики, один клик страховки.