Восстановление доступа к Linux при утерянных паролях

11.05.2019

Что делать, если потерян пароль от системы Linux: восстановление доступа.


Многие помнят то чувство, когда нужно срочно залезть на свой линух, а все пароли (и/или даже логины) забыты. Загружаем комп, и ни один из супер-сложных паролей не прокатывает! Ни 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!