Отказ от ответственности: этот вопрос не предназначен для решения проблемы смены пароля 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, вам необходимо выполнить следующий процесс:
init=/bin/bash
в конец командной строки ядра в grub, как вы это делали ранее./usr/sbin/load_policy -i
.mount -o remount,rw /
.passwd root
mount -o remount,ro /
.exec /sbin/init 6
.Теперь вы можете войти в систему с измененным паролем root.
А более подробное объяснение этой процедуры доступно в Red Hat (требуется подписка).