Стартовые цены: все тарифы на 30% дешевле самого дешёвого конкурента. Сравнение ценКаждый тариф на 30% дешевле самого дешёвого офшорного хостера

База знаний · Безопасность

Усиление защиты Linux-сервера: первый час

Чек-лист по усилению защиты Linux-серверов на первый час: обновления, пользователь с правами sudo, SSH-ключи, брандмауэр, fail2ban, синхронизация времени, аудит с помощью Lynis, резервное копирование и реагирование на инциденты.

Обновлено 7 мин чтения

В этом руководстве

  • Прежде всего установите обновления системы и включите автоматическую установку обновлений безопасности.
  • Входите под пользователем с правами sudo по SSH-ключу, затем отключите вход под root и вход по паролю.
  • Разрешите с помощью ufw или nftables только нужные порты, а попытки подбора паролей пусть блокирует fail2ban.
  • Если сервер взломан, изолируйте его, сохраните доказательства, смените все секреты и восстановите сервер с нуля из чистого шаблона.
Безопасность12 разделов
Все руководства
На этой странице
  1. Установка обновлений и настройка автоматических обновлений безопасности
  2. Создание пользователя с правами sudo
  3. Вход по SSH-ключу
  4. Отключение входа по паролю и под root
  5. Смена порта SSH (необязательно)
  6. Настройка брандмауэра
  7. Защита от подбора паролей с помощью fail2ban
  8. Синхронизация времени
  9. Аудит с помощью Lynis
  10. Резервные копии — заранее
  11. Замечания для ретрансляторов Tor и VPN-серверов
  12. Если сервер взломан

Вскоре после появления в сети на новый сервер начинают поступать автоматические попытки входа. Пройдите этот чек-лист по порядку в течение первого часа. Команды приведены для Debian и Ubuntu, а там, где AlmaLinux и Rocky Linux отличаются, даны примечания. Пока пользователь с правами sudo не создан, выполняйте команды от имени root; замените alice на своё имя пользователя, а SERVER_IP — на адрес своего сервера.

Установка обновлений и настройка автоматических обновлений безопасности

apt update
apt full-upgrade -y
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

В диалоговом окне ответьте утвердительно. Будет создан файл /etc/apt/apt.conf.d/20auto-upgrades, после чего обновления безопасности будут устанавливаться ежедневно. Чтобы сервер автоматически перезагружался, когда этого требует обновление, например при установке нового ядра, задайте в /etc/apt/apt.conf.d/50unattended-upgrades следующие строки:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

В AlmaLinux и Rocky Linux установите dnf-automatic, задайте upgrade_type = security и apply_updates = yes в /etc/dnf/automatic.conf, затем включите его таймер:

dnf upgrade --refresh -y
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic.timer

Если ядро было обновлено, перезагрузите сервер.

Создание пользователя с правами sudo

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

apt install -y sudo
adduser alice
usermod -aG sudo alice

В AlmaLinux и Rocky Linux группа администраторов называется wheel:

useradd -m -G wheel alice
passwd alice

Вход по SSH-ключу

На своём компьютере создайте пару ключей, защищённую парольной фразой, скопируйте открытый ключ в новую учётную запись, затем войдите с его помощью и проверьте, что sudo работает:

ssh-keygen -t ed25519 -C "alice laptop"
ssh-copy-id alice@SERVER_IP
ssh alice@SERVER_IP
sudo -v

В Windows вместо ssh-copy-id используйте команду PowerShell из руководства по началу работы.

Отключение входа по паролю и под root

Продолжайте, только когда вход по ключу и sudo заработают для нового пользователя. Создайте файл /etc/ssh/sshd_config.d/00-hardening.conf со следующими строками:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
X11Forwarding no
AllowUsers alice

Префикс 00- важен. Для каждого параметра sshd использует первое прочитанное значение, а файлы из sshd_config.d он читает в алфавитном порядке раньше остальной части sshd_config. Поэтому ваш файл имеет приоритет над 50-cloud-init.conf в облачных образах (этот файл может снова включить вход по паролю) и над 01-permitrootlogin.conf в системах семейства Red Hat. AllowUsers запрещает вход всем учётным записям, которых нет в списке. Проверьте синтаксис и значения, которые будут применены, затем перезапустите SSH:

sshd -t
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|kbdinteractive|allowusers'
systemctl restart ssh

В AlmaLinux и Rocky Linux служба называется sshd. Существующие сеансы остаются открытыми. Из нового терминала убедитесь, что alice по-прежнему может войти, а root получает отказ.

Смена порта SSH (необязательно)

Нестандартный порт избавляет логи от большей части шума, создаваемого ботами, но рубежом защиты не является: сканеры всё равно его находят, в каждой команде ssh, scp и rsync придётся указывать порт, а некоторые сети блокируют необычные порты. При входе только по ключам вполне можно оставить порт 22. Если всё же хотите его сменить, добавьте Port 2222 в свой файл с настройками усиления защиты, откройте порт и перезапустите SSH:

ufw allow 2222/tcp
systemctl restart ssh

В Ubuntu 24.04 SSH запускается через сокет systemd, поэтому там вместо перезапуска выполните эти две команды:

systemctl daemon-reload
systemctl restart ssh.socket

В AlmaLinux и Rocky Linux новый порт нужно также разрешить в SELinux и firewalld:

dnf install -y policycoreutils-python-utils
semanage port -a -t ssh_port_t -p tcp 2222
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
systemctl restart sshd

Прежде чем удалять правило для порта 22, проверьте новый порт из нового терминала:

ssh -p 2222 alice@SERVER_IP

Настройка брандмауэра

ufw в Debian и Ubuntu

apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose

limit разрешает SSH, но блокирует адрес, который открывает шесть и более подключений в течение 30 секунд. Если вы меняли порт SSH, укажите свой и открывайте только то, что нужно вашим сервисам. Соответствующие правила для IPv6 ufw добавляет автоматически.

Собственные правила nftables

Для полного контроля напишите собственный набор правил в /etc/nftables.conf. Этот набор отбрасывает весь входящий трафик, кроме ответного трафика, loopback-интерфейса, ICMP (без которого не работает IPv6), SSH и HTTPS:

#!/usr/sbin/nft -f
flush ruleset
table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif "lo" accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport { 22, 443 } accept
  }
}

Проверьте файл, затем примените правила сразу и включите их загрузку при каждом старте системы:

nft -c -f /etc/nftables.conf
systemctl enable --now nftables

Используйте либо ufw, либо собственный файл nftables, но не оба сразу. flush ruleset удаляет в том числе правила, созданные другими программами, поэтому не используйте его на хостах с Docker. В AlmaLinux и Rocky Linux по умолчанию включён firewalld; сервис в нём открывается так:

firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Защита от подбора паролей с помощью fail2ban

apt install -y fail2ban python3-systemd

Создайте /etc/fail2ban/jail.local. Укажите свой IP-адрес в ignoreip, чтобы не заблокировать самого себя, и задайте в port свой порт SSH:

[DEFAULT]
backend = systemd
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 YOUR_IP

[sshd]
enabled = true
port = 22
systemctl enable fail2ban
systemctl restart fail2ban
fail2ban-client status sshd

Бэкенд systemd читает журнал systemd, поэтому работает и на свежеустановленных системах Debian 12 и 13, где нет файла /var/log/auth.log. Чтобы снять блокировку:

fail2ban-client set sshd unbanip IP_ADDRESS

В AlmaLinux и Rocky Linux fail2ban устанавливается из EPEL:

dnf install -y epel-release
dnf install -y fail2ban

Если SSH принимает только ключи, fail2ban в основном уменьшает шум в логах; важнее он для сервисов, которые принимают пароли.

Синхронизация времени

timedatectl set-ntp true
timedatectl set-timezone UTC
timedatectl

Найдите строку System clock synchronized: yes. Если set-ntp сообщает, что NTP не поддерживается, установите клиент синхронизации времени и выполните команду снова:

apt install -y systemd-timesyncd

В AlmaLinux и Rocky Linux chrony включён по умолчанию. Точное время важно для TLS, одноразовых паролей, сопоставления логов и Tor; при UTC логи нескольких серверов легко сравнивать между собой.

Аудит с помощью Lynis

apt install -y lynis
lynis audit system

Lynis проверяет сотни настроек и выводит предупреждения, рекомендации и индекс защищённости (hardening index). Подробности записываются в /var/log/lynis.log и /var/log/lynis-report.dat. Относитесь к результату как к списку задач, а не как к оценке, которую нужно довести до максимума. В AlmaLinux и Rocky Linux Lynis доступен в EPEL.

Резервные копии — заранее

Усиление защиты снижает риск, а резервные копии позволяют восстановиться после инцидента. На VPS сделайте снапшот, когда пройдёте этот чек-лист, и настройте зашифрованное резервное копирование на внешнюю площадку с помощью restic или Borg, как описано в руководстве по снапшотам VPS и резервным копиям на внешней площадке. Сделайте репозиторий резервных копий доступным только для добавления, чтобы злоумышленник, проникший на сервер, не смог удалить историю копий.

Замечания для ретрансляторов Tor и VPN-серверов

Ретрансляторы Tor

  • Полная настройка для каждой роли описана в нашем руководстве по запуску ретранслятора, моста или onion-сервиса Tor.
  • Ретрансляторы, не являющиеся выходными узлами, и мосты лишь передают зашифрованный трафик внутри сети Tor; явно зафиксируйте это строкой ExitRelay 0 в /etc/tor/torrc.
  • С выходными узлами всё иначе: их трафик к сайтам выглядит так, будто исходит с вашего IP-адреса, и на него поступают жалобы на нарушения. Прежде чем запускать выходной узел, прочитайте правила допустимого использования. Исходящий порт 25 по умолчанию закрыт.
  • Устанавливайте tor из репозитория Tor Project и поручите его обновление unattended-upgrades; точные строки источников (origin) для Debian и Ubuntu приведены в руководстве Tor Project по ретрансляторам.
  • Открывайте в брандмауэре только ORPort, а ControlPort и порт метрик, если они есть, держите на localhost.
  • Трафик безлимитный в рамках принципа добросовестного использования. Если вы ожидаете постоянно высокий трафик, ограничьте его параметрами RelayBandwidthRate и RelayBandwidthBurst или AccountingMax в torrc.
  • Запускайте ретранслятор на отдельном сервере: адреса ретрансляторов публичны, и многие сервисы их блокируют.

VPN-серверы WireGuard

Полная настройка — от ключей до клиентов на телефонах — описана в руководстве о развёртывании собственного VPN с помощью WireGuard. Вкратце: откройте порт WireGuard, включите пересылку IP-пакетов, разрешите пересылку только из туннеля на публичный интерфейс (его имя можно узнать командой ip -br addr) и сделайте конфигурацию доступной для чтения только root:

ufw allow 51820/udp
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wireguard.conf
sysctl --system
ufw route allow in on wg0 out on eth0
chmod 600 /etc/wireguard/wg0.conf
  • Добавьте NAT для диапазона адресов туннеля, а если вы маршрутизируете IPv6, включите также пересылку IPv6.
  • Трафик пользователей вашего VPN выходит в интернет с IP-адреса вашего сервера. По правилам допустимого использования спам, сканирование и атаки с их стороны считаются исходящими с вашего сервера, поэтому давайте доступ только тем, кому доверяете.
  • Сам WireGuard не ведёт логов подключений. Если вы обещаете пользователям отсутствие логов, проверьте также journald и журналирование брандмауэра.

Если сервер взломан

Типичные признаки: неизвестные процессы, нагружающие CPU, неожиданный исходящий трафик, новые учётные записи или SSH-ключи либо наше уведомление о нарушении.

  1. Изолируйте сервер. Первым делом остановите исходящие атаки: заблокируйте исходящий трафик в брандмауэре или выключите сервер. На атаки из нашей сети мы реагируем незамедлительно согласно положениям о нулевой терпимости из правил допустимого использования, даже если сервер был захвачен злоумышленником.
  2. Сохраните доказательства. На VPS сделайте снапшот, прежде чем что-либо менять, и скопируйте логи с сервера.
  3. Проведите расследование с помощью команд ниже: проверьте входы в систему, открытые порты, процессы, задания cron, службы, SSH-ключи root и учётные записи с идентификатором пользователя 0.
  4. Смените все секреты, которые хранились на сервере: пароли, SSH-ключи (новые создавайте на чистой машине), токены доступа, пароли баз данных и закрытые ключи TLS.
  5. Восстановите сервер с нуля. Переустановите систему из чистого шаблона, восстановите данные из резервной копии, сделанной до взлома, пройдите этот чек-лист и закройте брешь, которой воспользовался злоумышленник, например устаревший плагин, слабый пароль или открытый наружу сервис.
  6. Сообщите нам. Если у вас выделенный или GPU-сервер, ответьте в тикете на наше уведомление о нарушении: расскажите, что вы обнаружили и исправили, или попросите о помощи.
last -a
ss -tulpn
ps auxf
ls -la /etc/cron.d /var/spool/cron
systemctl list-units --type=service --state=running
cat /root/.ssh/authorized_keys
awk -F: '$3 == 0' /etc/passwd
Застряли на каком-то шаге?

Клиенты с выделенными и GPU-серверами могут открыть тикет в личном кабинете, указав IP-адрес сервера и то, что они уже пробовали сделать. Целевой срок первого ответа — менее 12 часов. Для всех остальных серверов используйте действия с сервером на его странице, руководства и страницу статуса сети.

С возвращением

Войдите, чтобы управлять серверами и балансом.

Без KYCПроверка на человека с помощью Cloudflare TurnstileБез отслеживания