На этой странице
- Обновите всё
- Создайте пользователя с sudo и вашим SSH-ключом
- Разрешите вход только по ключам и запретите вход под root
- Базовые правила межсетевого экрана
- UFW
- nftables
- fail2ban
- Синхронизация времени
- Оставьте минимум сервисов
- Проверьте снаружи
- Основы мониторинга
- Учётные данные IPMI и KVM
- Резервное копирование
- После первых 15 минут
- Запуск на FlexDedi
Любой сервер с публичным IP-адресом круглосуточно атакуют попытками входа по SSH и сканированием открытых сервисов. Чек-лист ниже — базовый минимум, который стоит применить к свежему серверу на Ubuntu 24.04 LTS или Debian 12/13 до установки чего-либо ещё. Это займёт около 15 минут, а если на каком-то шаге что-то пойдёт не так, вы всё равно сможете войти через внеполосную консоль.
Выполняйте команды от root или, после того как создадите своего пользователя, через sudo. Замените deploy на имя вашего пользователя, а 203.0.113.10 — на IP-адрес вашего сервера.
| Шаг | Время |
|---|---|
| Обновления и автоматические обновления безопасности | 3 мин |
| Пользователь с sudo и вашим SSH-ключом | 2 мин |
| SSH только по ключам, без входа под root | 2 мин |
| Базовые правила межсетевого экрана | 2 мин |
| fail2ban | 1 мин |
| Синхронизация времени и проверка сервисов | 2 мин |
| Мониторинг, гигиена IPMI и резервное копирование | 3 мин |
Обновите всё
Начните с обновления пакетов и один раз перезагрузите сервер, поскольку первое обновление на свежем образе часто приносит новое ядро:
apt update && apt full-upgrade -y
rebootВ Ubuntu Server unattended-upgrades для обновлений безопасности включён из коробки. В Debian установите и включите его:
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades # answer Yes
unattended-upgrade --dry-run --debug 2>&1 | tail -n 5Команда перенастройки записывает /etc/apt/apt.conf.d/20auto-upgrades. Если после обновления ядра сервер должен перезагружаться в спокойные часы, добавьте локальный файл с переопределениями, а не редактируйте файл из пакета:
cat > /etc/apt/apt.conf.d/52unattended-upgrades-local <<'EOF'
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
EOFСоздайте пользователя с sudo и вашим SSH-ключом
Если у вас ещё нет ключа, создайте его на своей рабочей машине:
ssh-keygen -t ed25519 -C "you@workstation"Защитите закрытый ключ парольной фразой и загрузите его в ssh-agent, чтобы вводить её один раз за сеанс. Если у вас есть аппаратный ключ безопасности FIDO2, команда ssh-keygen -t ed25519-sk создаст ключ, который работает только при подключённом токене.
На сервере создайте пользователя и выдайте ему права sudo. В минимальной установке Debian сначала выполните apt install sudo.
adduser deploy
usermod -aG sudo deployЕсли вы вошли под root по ключу, скопируйте ключ в новую учётную запись:
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keysЕсли вы вошли по паролю, вместо этого выполните на своей рабочей машине ssh-copy-id deploy@203.0.113.10; оба случая описаны в документации по доступу по SSH. Затем откройте второй терминал и убедитесь, что ssh deploy@203.0.113.10 работает, а sudo -v принимает ваш пароль. Не закрывайте сессию root, пока не проверите следующий шаг.
Разрешите вход только по ключам и запретите вход под root
В Ubuntu 24.04 и Debian файл /etc/ssh/sshd_config подключает /etc/ssh/sshd_config.d/*.conf почти в самом начале, и для каждого параметра действует первое прочитанное значение. Поэтому файл, имя которого идёт первым при сортировке, переопределяет последующие, включая 50-cloud-init.conf на образах, где разрешён вход по паролю:
cat > /etc/ssh/sshd_config.d/00-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
X11Forwarding no
AllowUsers deploy
EOF
sshd -t && systemctl restart ssh
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|allowusers'Прежде чем что-либо закрывать, проверьте новый вход из другого терминала. Если вы всё же лишите себя доступа, войти помогут консоль KVM из средств внеполосного доступа и режим восстановления (rescue).
Перенос SSH на другой порт уменьшает шум в журналах, но мерой безопасности не является. Если вы всё же делаете это в Ubuntu 24.04, где SSH запускается через ssh.socket, после изменения выполните systemctl daemon-reload и перезапустите ssh.socket.
Базовые правила межсетевого экрана
Выберите один инструмент и не используйте оба одновременно. UFW — самый простой вариант для Ubuntu и Debian; nftables подойдёт тем, кто предпочитает явные правила.
UFW
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp
ufw allow 80,443/tcp
ufw enable
ufw status verboselimit блокирует адрес источника, который открывает 6 или более соединений за 30 секунд. UFW применяет те же правила и к IPv6.
nftables
Та же политика в /etc/nftables.conf:
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
ip protocol icmp accept
meta l4proto ipv6-icmp accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
}nft -c -f /etc/nftables.conf && systemctl enable --now nftables
nft list rulesetnft -c проверяет синтаксис до применения правил. Разрешённый ICMPv6 нужен для работы механизма обнаружения соседей (Neighbor Discovery) в IPv6; без него IPv6 перестаёт работать.
fail2ban
fail2ban блокирует адреса, с которых раз за разом не удаётся пройти аутентификацию. Чтение журнала systemd работает в обоих дистрибутивах, включая системы Debian без /var/log/auth.log:
apt install -y fail2ban python3-systemd
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 198.51.100.7
[sshd]
enabled = true
backend = systemd
EOF
systemctl restart fail2ban
fail2ban-client status sshdУкажите в ignoreip адрес своего офиса или VPN. Когда вход по SSH возможен только по ключам, fail2ban в основном уменьшает шум в журналах и число напрасных рукопожатий; важнее он для сервисов, которые по-прежнему принимают пароли, например почты или форм входа на сайтах, — для них есть собственные jail-правила.
Синхронизация времени
Точное время важно для TLS, журналов и всего, что использует токены или сертификаты:
timedatectl
timedatectl set-timezone UTCНайдите строку System clock synchronized: yes. Оба дистрибутива обычно синхронизируют время через systemd-timesyncd. Если NTP service показывает n/a, установите его или поставьте вместо него chrony — он к тому же добавляет chronyc tracking для диагностики. UTC позволяет сопоставлять журналы разных серверов.
Оставьте минимум сервисов
Каждый прослушиваемый порт — это поверхность атаки. Посмотрите, что слушает порты и что запущено:
ss -tulpn
systemctl list-units --type=service --state=runningОстановите ненужное командой systemctl disable --now NAME и удалите пакеты, которыми вы никогда не будете пользоваться. Сервисы, которые общаются только с другими серверами, — базы данных, экспортеры метрик, панели администрирования — должны слушать 127.0.0.1 или вашу частную сеть, но никогда не публичный адрес.
Проверьте снаружи
Правила на бумаге и действующие правила могут различаться. С другой машины просканируйте сервер и сравните открытые порты с тем списком, который вы планировали:
nmap -Pn -p- 203.0.113.10 # every TCP port; takes a few minutesКаждый открытый порт, которого нет в вашем плане, — это либо сервис, который нужно привязать к частному адресу, либо правило межсетевого экрана, которое нужно исправить. Постоянно включённая защита от DDoS FlexDedi фильтрует трафик атак ещё до того, как он достигнет сервера, но не определяет, какие порты открыты: это делает межсетевой экран хоста.
Основы мониторинга
- Состояние дисков: установите
smartmontoolsиnvme-cli. После этогоsmartdбудет следить за накопителями, аnvme smart-log /dev/nvme0покажет износ (percentage_used) и ошибки носителя. Если вы используете программный RAID, настройте оповещения, как описано в руководстве о программном RAID с mdadm. - Метрики: после
apt install prometheus-node-exporterметрики CPU, памяти, дисков и сети отдаются на порту 9100. Разрешите доступ к этому порту только с вашего хоста мониторинга, напримерufw allow from 10.0.0.5 to any port 9100 proto tcp. - Внешние проверки: проверка доступности извне вашей сети выявит то, чего не видят локальные инструменты, например сломанный маршрут или истёкший сертификат.
- Журналы:
journalctl -p warning -bвыводит предупреждения и ошибки с момента загрузки. Отправляйте журналы на другую машину, чтобы злоумышленник не смог замести следы.
Учётные данные IPMI и KVM
Контроллер внеполосного управления может перезагрузить сервер по питанию, подключить ISO-образы и открыть консоль, поэтому относитесь к его учётным данным так же, как к доступу root:
- Если у вас есть учётные данные IPMI, замените выданный пароль на длинный уникальный и храните его в менеджере паролей. Доступ описан в документации по IPMI и KVM.
- Никогда не используйте этот пароль повторно — ни для SSH, ни для панели управления, ни для чего-либо ещё.
- Ограничьте круг людей, которым он известен, отзывайте доступ при уходе сотрудников и закрывайте сеансы консоли по завершении работы.
- Так же защищайте вход в панель управления: через неё можно переустановить сервер.
Резервное копирование
Даже защищённый сервер может потерять данные из-за неудачного деплоя или отказа диска. Делайте резервные копии на другую машину, в идеале — в другой локации, и проверяйте восстановление. restic создаёт зашифрованные резервные копии с дедупликацией по SFTP:
apt install -y restic
openssl rand -base64 32 > /root/.restic-password && chmod 600 /root/.restic-password
export RESTIC_REPOSITORY="sftp:backup@10.0.0.20:/srv/restic/web01"
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic init
restic backup /etc /home /var/www --exclude-caches
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic restore latest --target /tmp/restore-test --include /etc/sshХраните копию пароля не только на сервере: без него репозиторий невозможно прочитать. Перед каждым запуском выгружайте базы данных в файлы (pg_dump, mysqldump), а не копируйте рабочие файлы данных, запускайте задание по таймеру systemd или через cron и настройте оповещение на случай сбоя. Сервер хранения данных в той же локации принимает резервные копии по бесплатной частной сети.
После первых 15 минут
Чек-лист срабатывает один раз, скрипт — каждый раз. Опишите эти шаги в системе управления конфигурациями, например в Ansible или cloud-init, чтобы каждый новый сервер стартовал с одной и той же базовой конфигурации, а отклонения от неё становились заметны. Затем займитесь тем, чего эта базовая конфигурация не охватывает:
- Запустите инструмент аудита, например Lynis (
apt install lynis, затемlynis audit system), и проработайте его рекомендации. - Не отключайте AppArmor. В Ubuntu и Debian он включён по умолчанию, а
aa-statusпоказывает загруженные профили. - Пересматривайте учётные записи пользователей, права sudo и файлы
authorized_keysкаждый раз, когда кто-то приходит в команду или уходит из неё.
Запуск на FlexDedi
Каждый сервер FlexDedi включает всё, на что опирается эта базовая конфигурация: IPMI и консоль HTML5 KVM на случай, когда SSH недоступен, режим восстановления (rescue) и переустановку в один клик в панели управления, постоянно включённую защиту от DDoS для каждого IP-адреса и бесплатную частную сеть для трафика резервного копирования. Для типичного веб- или API-сервера обычная отправная точка — Core 16 ($299/мес.); дополните его сервером Storage 264 ($699/мес.) или вторым Core 16 для хранения резервных копий.