На всех серверах Безлимитный трафик, защита от DDoS и IPMI включены. Без платы за подключение и контракта. Безлимитный трафик на всех серверах Смотреть цены

Руководство · Безопасность

Как защитить новый выделенный сервер на Linux за 15 минут

Базовая защита серверов на Ubuntu 24.04 и Debian за 15 минут: обновления, пользователь sudo, SSH-ключи, файрвол, fail2ban, мониторинг и резервные копии.

  • 7 мин чтения
  • Обновлено
  • Инженерная команда FlexDedi

Для этого руководства

Core 16

  • AMD EPYC 4545P · 16 ядер
  • 128 ГБ DDR5 ECC
  • 2 × 1,92 ТБ NVMe Gen4
  • 10 Гбит/с, безлимитный трафик
На этой странице

Любой сервер с публичным IP-адресом круглосуточно атакуют попытками входа по SSH и сканированием открытых сервисов. Чек-лист ниже — базовый минимум, который стоит применить к свежему серверу на Ubuntu 24.04 LTS или Debian 12/13 до установки чего-либо ещё. Это займёт около 15 минут, а если на каком-то шаге что-то пойдёт не так, вы всё равно сможете войти через внеполосную консоль.

Выполняйте команды от root или, после того как создадите своего пользователя, через sudo. Замените deploy на имя вашего пользователя, а 203.0.113.10 — на IP-адрес вашего сервера.

ШагВремя
Обновления и автоматические обновления безопасности3 мин
Пользователь с sudo и вашим SSH-ключом2 мин
SSH только по ключам, без входа под root2 мин
Базовые правила межсетевого экрана2 мин
fail2ban1 мин
Синхронизация времени и проверка сервисов2 мин
Мониторинг, гигиена IPMI и резервное копирование3 мин

Обновите всё

Начните с обновления пакетов и один раз перезагрузите сервер, поскольку первое обновление на свежем образе часто приносит новое ядро:

bash
apt update && apt full-upgrade -y
reboot

В Ubuntu Server unattended-upgrades для обновлений безопасности включён из коробки. В Debian установите и включите его:

bash
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. Если после обновления ядра сервер должен перезагружаться в спокойные часы, добавьте локальный файл с переопределениями, а не редактируйте файл из пакета:

bash
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-ключом

Если у вас ещё нет ключа, создайте его на своей рабочей машине:

bash
ssh-keygen -t ed25519 -C "you@workstation"

Защитите закрытый ключ парольной фразой и загрузите его в ssh-agent, чтобы вводить её один раз за сеанс. Если у вас есть аппаратный ключ безопасности FIDO2, команда ssh-keygen -t ed25519-sk создаст ключ, который работает только при подключённом токене.

На сервере создайте пользователя и выдайте ему права sudo. В минимальной установке Debian сначала выполните apt install sudo.

bash
adduser deploy
usermod -aG sudo deploy

Если вы вошли под root по ключу, скопируйте ключ в новую учётную запись:

bash
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 на образах, где разрешён вход по паролю:

bash
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

bash
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 verbose

limit блокирует адрес источника, который открывает 6 или более соединений за 30 секунд. UFW применяет те же правила и к IPv6.

nftables

Та же политика в /etc/nftables.conf:

text
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;
    }
}
bash
nft -c -f /etc/nftables.conf && systemctl enable --now nftables
nft list ruleset

nft -c проверяет синтаксис до применения правил. Разрешённый ICMPv6 нужен для работы механизма обнаружения соседей (Neighbor Discovery) в IPv6; без него IPv6 перестаёт работать.

fail2ban

fail2ban блокирует адреса, с которых раз за разом не удаётся пройти аутентификацию. Чтение журнала systemd работает в обоих дистрибутивах, включая системы Debian без /var/log/auth.log:

bash
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, журналов и всего, что использует токены или сертификаты:

bash
timedatectl
timedatectl set-timezone UTC

Найдите строку System clock synchronized: yes. Оба дистрибутива обычно синхронизируют время через systemd-timesyncd. Если NTP service показывает n/a, установите его или поставьте вместо него chrony — он к тому же добавляет chronyc tracking для диагностики. UTC позволяет сопоставлять журналы разных серверов.

Оставьте минимум сервисов

Каждый прослушиваемый порт — это поверхность атаки. Посмотрите, что слушает порты и что запущено:

bash
ss -tulpn
systemctl list-units --type=service --state=running

Остановите ненужное командой systemctl disable --now NAME и удалите пакеты, которыми вы никогда не будете пользоваться. Сервисы, которые общаются только с другими серверами, — базы данных, экспортеры метрик, панели администрирования — должны слушать 127.0.0.1 или вашу частную сеть, но никогда не публичный адрес.

Проверьте снаружи

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

bash
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:

bash
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 для хранения резервных копий.

Другие руководства

Ваш следующий сервер — через несколько минут.

Закажите Core 16 за $299/мес. или доверьте нашим инженерам подбор парка серверов под ваши задачи.

  • Без платы за подключение
  • Безлимитный трафик
  • Отмена в любой момент