From fb75bce22d6eb83e49c2c8a5b0aa768c51c0ba88 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 22 Aug 2026 12:56:22 +0300 Subject: [PATCH] =?UTF-8?q?fix(ops):=20hardening=20sshd=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=BB=D1=87=D0=B0=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=8F=D0=BB=D1=81=D1=8F=20=D0=B8=D0=B7-=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=20cloud-init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Найдено при первом живом запуске на Poincare. Ubuntu кладёт в /etc/ssh/sshd_config.d/ файл 50-cloud-init.conf с PasswordAuthentication yes. sshd берёт ПЕРВОЕ встреченное значение директивы, а не последнее, поэтому наш 60-hardening.conf проигрывал по имени: после reload парольный вход для root остался бы открытым. Коварство в том, что `sshd -t` при этом отвечает «конфиг валиден», и скрипт рапортовал об успехе. Сервер уже под перебором (fail2ban держал 6 адресов), так что тихий отказ здесь стоил бы дорого. Три правки: - файл называется 00-hardening.conf и читается первым; старый 60-* удаляется, чтобы повторный запуск не оставил два конфликтующих; - после записи проверяется не синтаксис, а ИТОГ через `sshd -T`: если passwordauthentication != no, скрипт падает и НЕ перезапускает sshd; - комментарий про версии Docker приведён в соответствие с поведением — ставится последняя из репозитория, версии прода служат ориентиром для предупреждения (приехали 29.7.2 / 5.5.0 против 29.4.1 / v5.1.3). --- ops/selectel-bootstrap.sh | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ops/selectel-bootstrap.sh b/ops/selectel-bootstrap.sh index 3c9bf465..951a274b 100644 --- a/ops/selectel-bootstrap.sh +++ b/ops/selectel-bootstrap.sh @@ -28,7 +28,11 @@ ADMIN_PUBKEY="${ADMIN_PUBKEY:-}" SSH_PORT="${SSH_PORT:-22}" SWAP_GB="${SWAP_GB:-8}" -# Версии — те же, что на текущем прод-хосте, чтобы поведение compose не разъехалось. +# Версии на текущем прод-хосте — ориентир для сверки, НЕ то, что ставится. +# Репозиторий Docker отдаёт последнюю версию; закреплять старую ради совпадения +# значило бы отказаться от исправлений безопасности. Расхождение печатается +# предупреждением, чтобы оно не прошло незамеченным (22.08.2026 приехали +# docker 29.7.2 и compose 5.5.0 против 29.4.1 / v5.1.3 на Beget). WANT_DOCKER="29.4.1" WANT_COMPOSE="v5.1.3" @@ -177,7 +181,12 @@ systemctl enable --now fail2ban >/dev/null systemctl is-active fail2ban log "10. Ужесточение sshd" -cat > /etc/ssh/sshd_config.d/60-hardening.conf < /etc/ssh/sshd_config.d/00-hardening.conf <