SELinuxがrootパスワードをリセット


12

免責事項:この質問は、SELinuxがアクティブな間にrootパスワードを変更する問題を解決するものではありません。既に解決している多くのガイドがあります。これは、SELinuxが内部的に行う方法の詳細です。

私は最近SELinuxを使用していますが、最近はもっと連絡を取り合っています。rootパスワードを忘れた場合にリセットする方法を誰かから尋ねられた瞬間がありました。

だから私はCentOSを起動し、grubエントリを次のように編集しました

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

私が走ったpasswd後、走っsyncて強制的に再起動しました。再起動後、新しいパスワードでのログインはもちろん、古いパスワードでのログインも拒否されました。

再起動し、カーネルにSELinuxを無効にするパラメーターを渡しました(selinux=0)。新しいパスワードでログインしてみましたが、うまくいきました。その後、(ファイルを介して.autorelabel)fs自動ラベル変更を強制し、SELinuxがアクティブな状態でログインできるようになりました。

私の質問は:なぜ起こるのですか?ユーザーまたはオブジェクトの変更ではなく、パスワードの変更のみが行われたときに、再ラベル付けがログインに影響を及ぼすのはなぜですか?

ご清聴ありがとうございました。

TL; DR:通常のルートパスワードのリセットは、SELinuxでは機能しません。どうして?

編集:これは、ハイパーバイザーとしてKVMを使用してCentOS7を実行している仮想マシンでテストされました。


1
機能しませんか?もう一回やってみよう。おそらくうまくいくでしょう。単にいくつかのファイルに間違ったファイルコンテキストがあり、すべてのログインが失敗したのではないかと思われます。したがって、自動再ラベル付けが実際に問題を解決したものでした。
マイケルハンプトン

@MichaelHamptonすべての手順を再度たどりましたが、SELinuxがアクティブな状態で再度ログインできませんでした。無効にした後、問題なくログインできました。間違っているが、パスワードを変更してもファイルコンテキストが正しく変更されない場合は修正してください。
ホルヘヘレノ

1
いいえ、できません。あなたは奇妙で予想外の何かを発見したようです。
マイケルハンプトン

回答:


17

新しくインストールしたCentOS 7.5システムでこの問題を再現できました。

ここで何が起こっているのですか:

起動するとinit=/bin/bash、次の2つの問題が発生する可能性があります。

  • ルートファイルシステムは、読み取り専用でマウントできます。この場合passwdAuthentication token manipulation error

    これは非常に明白です。ファイルシステムが読み書き可能にマウントされていない場合、ファイルシステムに書き込むことはできません。

  • SELinuxポリシーがロードされていない可能性があります。この場合passwd、パスワードは正常に変更されますが、上記の最初の質問で説明されている問題が発生します。誰もログインできません。

    パスワードハッシュは/etc/shadowファイルに保存されます。通常、このファイルのタイプはSELinuxですshadow_t。ただし、SELinuxポリシーがロードされていない状態でファイルを変更すると、SELinuxタイプがファイルから削除され、そのまま残りますunlabeled_t。したがって、ログインを認証するためにファイルを読み取ろうとするサービスは、それを読み取ることができなくなります。

したがって、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はカーネルレベルで動作する必要があるため、initシステムは必要ありません。
ホルヘヘレノ

4
@JorgeHeleno SELinuxは、カーネルの起動時にデフォルトで実際にオンまたはオフになりますが、ユーザーランドはどのポリシーをロードするかを決定する責任があります。一部のインストールでは異なるポリシー(ターゲット、厳格、mlsなど)が必要な場合があるため、カーネルはこれを決定できませんでした。これはブートプロセスの初期段階で発生しますが、実行時にそれをバイパスしますinit=/bin/bash
マイケルハンプトン

1
ポリシーがロードされていない場合、passwd「成功したように見える」のはなぜですか?
アンドリューサヴィニク

そして、それが成功しなかった場合、なぜ古いパスワードでのログインがまだ失敗したのですか?
軌道

2
@Jorge Helen:あなたの説明はほぼ完了です。ポイントは、passwdつまり/etc/passwdおよびによって変更されたファイルです/etc/shadow。実行している場合はpasswd、ロードされた政策なしに、それは適切なSELinuxのコンテキストで実行されず、変更されたファイルは、異なるSELinuxのコンテキストで終わります。selinuxを有効にした状態で起動し、ポリシーがアクティブな場合、wrong passwordエラーではなく不適切なファイルコンテキストが原因でパスワードチェックが失敗します。タッチしてselinuxをrelable filecontextsに強制/.autorelabelすると、ポリシーをロードせずにパスワードを変更するときの問題も修正できます。
ハーグート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.