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 — шпаргалка.
