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

12

Отказ от ответственности: Этот вопрос не решает проблему изменения пароля 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 в качестве гипервизора.

Хорхе Хелено
источник
1
Вы уверены, что это не работает? Попробуйте снова. Это, вероятно, будет работать нормально. Я подозреваю, что у вас просто был неправильный контекст файлов в некоторых файлах, что приводило к сбою всех входов в систему. Таким образом, автобумага была тем, что действительно решило проблему.
Майкл Хэмптон
@MichaelHampton Я просто повторил все свои шаги, делая это снова, и не смог войти снова с активным SELinux. После отключения я смог войти без проблем. Поправьте меня, если я ошибаюсь, но смена пароля не должна менять контексты файла, верно?
Хорхе Хелено
1
Нет, не должно. Вы, кажется, обнаружили что-то странное и неожиданное.
Майкл Хэмптон

Ответы:

17

Мне удалось продублировать эту проблему в недавно установленной системе 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 (требуется подписка).

Майкл Хэмптон
источник
Проблема была в политиках, которые не были загружены. Почему они не загружаются? SELinux должен работать на уровне ядра, поэтому система инициализации не требуется.
Хорхе Хелено,
4
@JorgeHeleno SELinux действительно включен или выключен по умолчанию, когда запускается ядро, но пользовательская область отвечает за решение, какие политики загружены. Ядро не может решить это, потому что некоторые установки могут требовать разных политик (например, таргетированный, строгий, mls) Это происходит на ранней стадии процесса загрузки, но при запуске вы это пропускаете init=/bin/bash.
Майкл Хэмптон
1
если политика не загружена, почему passwd"кажется успешным"?
Андрей Савиных,
и если это не удалось, почему вход в систему со старым паролем все еще не удался?
Гонки
2
@Jorge Helen: Ваше объяснение почти завершено. Дело в том, что файлы изменены, passwdа именно /etc/passwdи /etc/shadow. Если он работает passwdбез загруженной политики, он не работает в правильном контексте selinux, и измененные файлы в конечном итоге попадают в другой контекст selinux. При загрузке с включенным selinux и активными политиками проверка пароля не выполняется из-за неподходящего контекста файла, а не из-за wrong passwordошибки. Принуждение selinux к релевантным файловым контекстам путем касания /.autorelabelтакже может решить эту проблему при смене паролей без загруженной политики.
Hargut