Одна команда chown на корень, и сервер больше не пускает даже root: что делать и почему проще переустановить

Классика, о которой полезно прочитать до того, как она случится.

Что произошло. Пользователь хотел поправить владельца файлов в своём каталоге, но выполнил sudo chown -hR $USER:root / с косой чертой в конце: рекурсивно на весь корень файловой системы. Пока сессия была открыта, всё выглядело нормально. После закрытия терминала вход по SSH под root был запрещён настройкой, а su отвечал «Authentication failure», sudo жаловался, что не имеет прав root («effective uid is not 0»).

Почему всё сломалось. Права на системные файлы это не только «чтение и запись». У sudo, su, passwd стоит специальный бит, который работает только при владельце root; смена владельца снимает его действие. Файлы паролей и ключей, которые должны принадлежать root и быть закрыты для остальных, стали принадлежать обычному пользователю, и часть служб отказывается их использовать из соображений безопасности.

Как вернули доступ. Через режим восстановления у хостера: загрузка с отдельного образа, монтирование диска, ручное восстановление владельцев критичных файлов. Автор подтвердил, что доступ вернулся. Участники обсуждения, включая модератора, честно предупредили: после такой команды в системе всегда остаётся риск службы с неправильными правами, поэтому надёжнее забрать данные и конфигурацию и переустановить систему.

Что делать, если это произошло у вас.

  1. Не закрывайте открытую сессию с правами root: из неё ещё можно многое исправить.
  2. Первым делом вернуть владельца ключевым файлам: chown root:root /usr/bin/sudo /usr/bin/su /etc/sudoers /etc/shadow /etc/passwd и бит chmod 4755 /usr/bin/sudo /usr/bin/su, chmod 640 /etc/shadow.
  3. Если сессии нет, используйте консоль виртуальной машины из панели управления или rescue-режим.
  4. Затем спокойно спланировать переустановку: восстановить права по всем пакетам без ошибок практически невозможно.

Как не повторить. Рекурсивные команды по корню запускать нельзя никогда; перед chown -R и chmod -R дважды посмотреть на путь, а для автоматизации использовать явные пути без переменных, которые могут оказаться пустыми.

Поведение команды описано в справочнике chown.