Отказ от ответственности: Этот вопрос не решает проблему изменения пароля 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
файле. Этот файл обычно имеет тип SELinuxshadow_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 (требуется подписка).
источник
init=/bin/bash
.passwd
"кажется успешным"?passwd
а именно/etc/passwd
и/etc/shadow
. Если он работаетpasswd
без загруженной политики, он не работает в правильном контексте selinux, и измененные файлы в конечном итоге попадают в другой контекст selinux. При загрузке с включенным selinux и активными политиками проверка пароля не выполняется из-за неподходящего контекста файла, а не из-заwrong password
ошибки. Принуждение selinux к релевантным файловым контекстам путем касания/.autorelabel
также может решить эту проблему при смене паролей без загруженной политики.