Восстанавливаем доступ к Linux при утерянных паролях
buttonxxxxxМногие помнят то чувство, когда нужно срочно залезть на свой линух, а все пароли (и/или даже логины) забыты. Загружаем комп, и ни один из супер-сложных паролей не прокатывает! Ни root, ни десяток обычных учётных записей с правами sudo/wheel и без них не хотят признавать вас своим боссом.
Но, как и у любого мало-мальски умного человека (а любой, кто пользуется Linux, уже по определению мало-мальски умный человек), есть диск или флешка с Live-CD (ну или он знает где и как её быстро найти). В нашем примере возьмём самый простой вариант – у нас в наличии целёхонькая флешка с Ubuntu-установщиком, например, 14.04. Почему Ubuntu? Потому что у этого дистрибутива самый простой интерфейс выбора между использованием дистрибутива и установкой ОС.
Жмём «Запустить Ubuntu», дожидаемся загрузки рабочего стола. Как только рабочий стол прогрузился, нажимаем комбинацию клавиш Ctrl+Alt+t (латинская раскладка), и перед нами появляется окно терминала, в котором будем исправлять постигшие нас ужасные беды.
Немного теории: в Linux пароли автономных пользователей хранятся в зашифрованном виде в файле «shadow», расположенном в каталоге «/etc» (полный путь: /etc/shadow). Структура файла очень простая:
В красную рамку обведено то, что нам необходимо поменять.
Структура этой строки такова: $ID$SALT$ENCRYPTED, где $ID – тип шифрования, $SALT – случайная строка длинной до 16 символов, $ENCRYPTED – непосредственно хеш пароля.
Есть 3 основных $ID, определяющих тип шифрования:
¾ $1 – это алгоритм MD5, имеющий длину хэша 22 символа;
¾ $2, $2a – алгоритм blowfish;
¾ $5 – алгоритм SHA-256, имеющий длину хэша 43 символа;
¾ $6 – алгоритм SHA-521, с длинной хэша 86 символов.
Как можно догадаться, на сегодняшний день из текущего списка самый надёжным считается SHA-512.
Алгоритм таков:
1. Узнаём, на каком диске находится каталог «/etc», и монтируем этот диск;
2. Генерируем хэш пароля в файл;
3. Получаем доступ к файлу «/etc/shadow»;
4. Заменяем хэш пароля в файле «/etc/shadow»;
5. Возвращаем права доступа на файл «/etc/shadow»;
6. Размонтируем примонтированный диск;
7. reboot;
8. …
9. profit?
А теперь поэтапно. В терминале заходим в режим суперпользователя командой
$ sudo su
Набираем команду
# fdisk –l
чтобы получить список всех дисков в системе на текущий момент и наблюдаем примерно следующую картину:
На картинке выше есть пустой жёсткий диск /dev/sda (на нём нет никакой разметки) и жёсткий диск /dev/sdb, на котором есть 3 раздела (sdb1, sdb2 и sdb3 соответственно). При этом видно, что разделы /dev/sdb1 и /dev/sdb3 – это разделы с файловой системой ext4 (Id 83), а раздел /dev/sdb2 – это динамический раздел LVM, на котором размечены два логических диска: /dev/mapper/cl-swap, который является разделом подкачки, и /dev/mapper/cl-root, являющийся корневым разделом.
Поскольку других дисков тут нет, то нас могут интересовать разделы /dev/sdb1, /dev/sdb3 и /dev/mapper/cl-root. Если нет уверенности, на каком из них каталог «/etc», то монтируем по очереди командой
# mount /dev/sdb1 /mnt
И смотрим их содержимое командой
# ls –al /mnt
В случае, если это нужный диск, то оставляем как есть и переходим к этапу генерации пароля, если же нет (как в рассматриваемом примере), то размонтируем сначала текущий диск
# umount /dev/sdb1
и примонтируем следующий диск, например
# mount /dev/mapper/cl-root /mnt
Снова смотрим содержимое примонтированного диска
# ls –al /mnt
И видим, что в списке каталогов есть каталог «/etc»! Отлично, продолжаем!
Теперь нам всего-то нужно создать новый пароль.
Пишем в терминале
# passwd
И вводим 2 раза новый пароль, который уже точно не забудем.
После успешного ввода, делаем следующую, немного хитрую, команду:
# cat /etc/shadow | grep root | awk -F “:” ‘{ print $2 }’
Разберём подробнее эту команду, чтобы отпали лишние вопросы. Командой «cat /etc/shadow» мы берём содержимое файла «/etc/shadow» (файл, который существует в загруженной Ubuntu Live, и в котором после выполнения команды «passwd» появился хэш пароля, который только что ввели).
Это содержимое мы передаём в команду «grep root» с помощью символа «|» (читается «пайп»). Команда «grep root» из всего содержимого этого файла получает только одну строку, которая соответствует пользователю root (двух таких строк в файле быть не может). Эта полученная строка тоже передается в команду « awk -F “:” ‘{ print $2 }’ », которая разбивает эту строку на столбцы, считая символом-разделителем «:» (двоеточие), и печатает в окне терминала второй столбец, который соответствует записи $ID$SALT$ENCRYPTED.
Теперь выделяем в терминале мышкой полученную строку и с помощью комбинации клавиш Ctrl+Insert копируем в буфер обмена всю строку хэша
Теперь эту строку нужно «воткнуть» в файл «/mnt/etc/shadow» для пользователя, которому мы хотим поменять пароль. К примеру, это будет пользователь «root».
Но есть одно маленькое «но»: в современных дистрибутивах, по умолчанию, файл «shadow» не может редактировать даже пользователь root (и выглядит это так):
Но, поскольку мы сейчас всемогущи (работаем под «root»), то для внесения изменений мы можем временно дать себе права на запись:
Дальше всё просто – меняем старый хэш на новый. Для этого проще всего открыть файл «/mnt/etc/shadow» любым редактором, можно графическим, например, командой
# gedit /mnt/etc/shadow
можно в терминале, например, vi, nano
# nano /mnt/etc/shadow
Заменяем старый хэш на новый (при этом внимательно смотрим, чтобы не стереть двоеточия в начале и в конце):
Вместо выделенной части нужно вставить из буфера обмена скопированный ранее новый пароль, сохранить изменения, и выйти из редактора.
Теперь восстанавливаем права доступа (целомудрие и справедливость) на файл «/mnt/etc/shadow» командой
# chmod -w /mnt/etc/shadow
Размонтируем диск командой
# umount /mnt
И перезапускаем устройство:
# reboot
Естественно, загружаемся теперь уже с жёсткого диска и наслаждаемся всеми долгожданными прелестями своего Linux!