Назад | Перейти на главную страницу

SELinux сбросит пароль root

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

Я недавно использую SELinux, но в последнее время все больше с ним контактирую. Был момент, когда меня спросили, как я могу сбросить пароль root, если его забуду.

Итак, я загрузил свой CentOS, отредактировал запись grub примерно так:

linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash

Я побежал passwd а потом побежал sync и принудительная перезагрузка. После перезагрузки вход с новым паролем был отклонен, как и, конечно же, со старым.

Снова перезагрузился и передал ядру параметр для отключения SELinux (selinux=0). Пытался войти в систему с новым паролем, и это сработало. Впоследствии я принудительно изменил метку fs (через файл .autorelabel) и с активным SELinux теперь можно было войти в систему.

У меня вопрос: почему это происходит? Почему изменение метки влияет на вход в систему, если произошла просто смена пароля, а не пользователей или объектов?

Спасибо за Ваше внимание.

TL; DR: Обычный сброс пароля root не работает в SELinux. Зачем?

Изменить: это было протестировано на виртуальной машине под управлением CentOS7 с KVM в качестве гипервизора.

Мне удалось продублировать эту проблему в только что установленной системе CentOS 7.5.

Вот что происходит:

Когда вы загружаетесь с init=/bin/bash Вы можете столкнуться с двумя проблемами:

  • Корневая файловая система может быть смонтирована только для чтения. В таком случае passwd будет жаловаться на Authentication token manipulation error.

    Это довольно очевидно: если файловая система не смонтирована для чтения и записи, запись в нее невозможна.

  • Политика SELinux не может быть загружена. В таком случае passwd успешно изменит пароль, но у вас будет проблема, описанная в исходном вопросе выше: никто не сможет войти в систему.

    Хэши паролей хранятся в /etc/shadow файл. Этот файл обычно имеет тип SELinux shadow_t. Однако изменение файла, когда политика SELinux не загружена, приводит к удалению типа SELinux из файла, оставляя его как unlabeled_t. Таким образом, службы, которые пытаются прочитать файл для аутентификации логинов, больше не могут его прочитать.

Следовательно, чтобы изменить пароль root в RHEL / CentOS 7, вам необходимо выполнить следующий процесс:

  1. Добавить init=/bin/bash в конец командной строки ядра в grub, как вы это делали ранее.
  2. В командной строке bash загрузите политику SELinux с помощью /usr/sbin/load_policy -i.
  3. Смонтируйте корневую файловую систему для чтения и записи с помощью mount -o remount,rw /.
  4. Теперь измените пароль, и все получится. passwd root
  5. Перемонтируйте файловую систему только для чтения, чтобы зафиксировать изменения и получить чистую файловую систему при следующей загрузке с помощью mount -o remount,ro /.
  6. Выйдите из оболочки или перезапустите систему с помощью exec /sbin/init 6.

Теперь вы можете войти в систему с измененным паролем root.

А более подробное объяснение этой процедуры доступно в Red Hat (требуется подписка).