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

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

ИкИнженерная команда CheapServАвтор 6 мин чтения
Светящийся спасательный круг рядом с сервером
На этой странице9
  1. Что делает режим восстановления
  2. Монтируем диск
  3. Исправление 1: сломанный конфиг sshd
  4. Исправление 2: правило файрвола, которое вас подвело
  5. Исправление 3: переполненный диск
  6. Исправление 4: неверная строка в fstab
  7. Для чего ещё пригодится режим восстановления
  8. Выход из режима восстановления
  9. На будущее

Рано или поздно каждый администратор сам закрывает себе доступ к серверу: опечатка в sshd_config; правило файрвола, под запрет которого попал и порт 22; диск, заполнившийся за ночь; строка в fstab, указывающая на том, которого больше нет. Для таких утр и существует режим восстановления (rescue). Он загружает по сети live-систему, не трогая ваш диск, так что вы можете смонтировать его, исправить ту единственную строку, которая всё сломала, и после перезагрузки получить рабочий сервер. Ниже — как им пользоваться и четыре исправления, которые закрывают большинство случаев.

Что делает режим восстановления

На вкладке Питание сервера пункт Загрузить в режим восстановления перезагружает сервер в небольшой образ на базе Debian, загружаемый по сети. Ваши диски при этом не изменяются и не монтируются: система восстановления работает из оперативной памяти. В ней предустановлен SSH с ключами из вашей панели управления, есть привычные инструменты (mount, chroot, fsck, mdadm, cryptsetup, zfs, редакторы) и доступ к сети. Если вы сломали как раз SSH, поможет консоль в панели. Выход из режима восстановления — обычная перезагрузка; пока он активен, в панели отображается баннер, чтобы вы не забыли о нём.

Прежде всего сделайте в панели снапшот, если это ещё возможно. Если нет (сервер уже в режиме восстановления), диск остаётся в сохранности, пока вы ничего на него не записали; действуйте аккуратно.

Монтируем диск

lsblk -f                                # find the root partition: usually vda2 (VPS) or md0 / nvme0n1p2 (dedicated)
mount /dev/vda2 /mnt
mount /dev/vda1 /mnt/boot               # if /boot is separate; on UEFI images: /mnt/boot/efi
for d in dev proc sys run; do mount --rbind /$d /mnt/$d; done
chroot /mnt /bin/bash                   # you are now "inside" your server, without running it

На выделенном сервере с программным зеркалом сначала выполните mdadm --assemble --scan и смонтируйте /dev/md0; на ZFS всё монтируется за один шаг командой zpool import -f -R /mnt rpool.

Исправление 1: сломанный конфиг sshd

sshd -t -f /mnt/etc/ssh/sshd_config      # from outside the chroot: prints the offending line
nano /mnt/etc/ssh/sshd_config.d/10-hardening.conf

Обычные виновники: блок Match, поглотивший все опции ниже него; PasswordAuthentication no до установки ключа; смена порта без правила в файрволе. Исправьте строку, снова проверьте конфиг командой sshd -t и перезагрузите сервер.

Исправление 2: правило файрвола, которое вас подвело

chroot /mnt ufw disable                 # ufw: turns it off at next boot; re-enable after fixing the rule
nano /mnt/etc/nftables.conf             # nftables: remove or fix the rule, keep the file valid
rm /mnt/etc/iptables/rules.v4           # iptables-persistent: drop the saved rules entirely

Перезагрузитесь, войдите, добавьте недостающее правило allow 22/tcp (или для вашего порта) и снова включите файрвол. Если файрвол настраивается через cloud-init или Ansible, исправьте и источник конфигурации, иначе при следующем запуске вы опять потеряете доступ.

Исправление 3: переполненный диск

du -xh --max-depth=2 /mnt | sort -h | tail -20    # where did it go?
journalctl --root=/mnt --vacuum-size=200M          # systemd journal, a common offender
rm -rf /mnt/var/lib/docker/tmp/*                   # or prune from inside after boot
find /mnt/var/log -name '*.gz' -delete             # rotated logs are safe to remove

Освободите несколько гигабайт, перезагрузитесь и после этого займитесь причиной: ротацией логов, скриптом резервного копирования, который пишет на тот же диск, базой данных без политики хранения. Диск, дошедший до 100%, переполнится снова уже в следующем месяце, если причина останется.

Исправление 4: неверная строка в fstab

Запись об отсутствующем томе в /etc/fstab без опции nofail останавливает загрузку на аварийной оболочке, до которой вам не добраться. Закомментируйте строку или добавьте к ней nofail,x-systemd.device-timeout=10 и перезагрузитесь. У каждого монтирования, кроме корневого, должна быть опция nofail: это единственная привычка в работе с fstab, которая полностью исключает такой тип блокировок.

Для чего ещё пригодится режим восстановления

  • Сброс пароля root: chroot /mnt passwd. Панель умеет делать это и без режима восстановления, но не в том случае, если вы поменяли расположение SSH-ключей, на которое она опирается.
  • Запуск fsck на файловой системе, которая не хочет монтироваться: безопасно делать это можно только на размонтированной системе, то есть из режима восстановления.
  • Копирование данных с сервера, который вы бросаете: rsync -a /mnt/srv/ other-server:/srv/ по сети системы восстановления.
  • Пересоздание загрузчика после неудачного обновления пакета ядра: внутри chroot — update-grub или grub-install (BIOS) / update-initramfs -u.
  • Расследование взлома при неработающей операционной системе: ничто в ней не сможет от вас спрятаться.

Выход из режима восстановления

exit                                     # leave the chroot
umount -R /mnt                          # or: zpool export rpool
reboot

Если доступа к оболочке уже нет, то же самое делает кнопка Выйти из режима восстановления на вкладке Питание в панели. Сервер снова загружается со своего диска, а в журнале событий остаётся запись о сеансе восстановления с указанием его длительности.

На будущее

Делайте снапшот перед рискованными изменениями: он превращает восстановление в обычный откат. Изменение файрвола проверяйте так: добавьте правило в ufw, пока открыта вторая сессия. Не закрывайте рабочую SSH-сессию, пока не убедитесь, что новая работает. И обязательно держите включённой двухфакторную аутентификацию в панели: режим восстановления — это дверь с полным доступом, а замок на ней — панель.

Ик
Инженерная команда CheapServ

Те, кто создаёт конвейер развёртывания, панель управления и слой хранения данных.

Разверните первый сервер меньше чем за минуту.

Пополните баланс от $25 в BTC, ETH, XMR или USDT. Баланс не сгорает, а неиспользованные средства можно вернуть.

Создать аккаунт