Перейти к содержимому
RunStack
Вики· Обновлено 19 окт. 2026 г.

rs harden — защита сервера

Что меняет каждый шаг rs harden, как проверить и как откатить.

rs harden включает базовую защиту по шагам. Каждый шаг спрашивает; SSH и файрвол откатываются сами, если за 3 минуты не подтвердить вход из нового окна. Страница скрипта — в каталоге.

sudo rs harden --plan    # только посмотреть
sudo rs harden           # по шагам с вопросами
sudo rs harden --yes     # без вопросов, кроме SSH и файрвола (их без терминала не меняет)

1. Автообновления безопасности

Ставит unattended-upgrades и пишет /etc/apt/apt.conf.d/20auto-upgrades.

systemctl status unattended-upgrades
less /var/log/unattended-upgrades/unattended-upgrades.log
# выключить
printf 'APT::Periodic::Unattended-Upgrade "0";\n' > /etc/apt/apt.conf.d/20auto-upgrades

Перезагрузку для нового ядра система не делает сама — rs security покажет, если она нужна.

2. fail2ban

Файл /etc/fail2ban/jail.d/rs-sshd.local: 5 попыток за 10 минут → бан на час, порты SSH берутся из sshd -T.

fail2ban-client status sshd              # кто забанен
fail2ban-client set sshd unbanip 203.0.113.10
# откатить
rm /etc/fail2ban/jail.d/rs-sshd.local && systemctl restart fail2ban

3. SSH только по ключу

Шаг выполняется, только если у пользователя, под которым вы зашли (SUDO_USER), есть ключ в ~/.ssh/authorized_keys, а sshd_config подключает sshd_config.d. Файл /etc/ssh/sshd_config.d/00-runstack-harden.conf:

PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
X11Forwarding no
sshd -T | grep -E 'passwordauth|permitroot|maxauth'   # что действует
# откатить
rm /etc/ssh/sshd_config.d/00-runstack-harden.conf && sshd -t && systemctl reload ssh

Нет ключа? Создайте его на своём компьютере и добавьте на сервер, затем запустите шаг снова:

ssh-keygen -t ed25519
ssh-copy-id user@server

4. Файрвол ufw

Порты SSH открыты всегда. Про остальные порты, которые слушают не на 127.0.0.1, скрипт спрашивает. Если уже работает ufw или nftables с запретом по умолчанию — шаг пропускается.

ufw status numbered
ufw allow 8443/tcp
ufw allow from 203.0.113.10 to any port 5432 proto tcp
ufw delete 3
# выключить
ufw disable

Docker обходит ufw: порты из ports: в compose открыты, даже если ufw их запрещает. Публикуйте на 127.0.0.1:порт или используйте rs <сервис> access.

Если стоит стек Grafana + Prometheus, скрипт добавляет правило для node-exporter на мосту rs-mon0 — иначе Prometheus перестанет получать метрики.

5. Swap

Файл /swapfile 2 ГБ (4 ГБ при памяти от 8 ГБ), запись в /etc/fstab, vm.swappiness = 10 в /etc/sysctl.d/90-runstack-swap.conf.

swapon --show && free -h
# убрать
swapoff /swapfile && rm /swapfile && sed -i '\#^/swapfile #d' /etc/fstab

6. Время и ядро

Включает NTP (timedatectl set-ntp true) и пишет /etc/sysctl.d/90-runstack-harden.conf: syncookies, без ICMP-редиректов и source routing, логирование подозрительных пакетов, kernel.randomize_va_space = 2. На Docker и обычный трафик не влияет.

# откатить
rm /etc/sysctl.d/90-runstack-harden.conf && sysctl --system

Если отрезало доступ

Таймер отката срабатывает, даже если окно зависло. Если всё же не войти — консоль (VNC) в панели провайдера, затем удалите файл шага (SSH или ufw disable). Подробнее про SSH — шпаргалка.