従来との違い
管理者のパスワードを忘れてログインできなくなった場合はシングルユーザモードに入ってパスワードを変更する、というのがCentOSのみならずLinux全般でのお作法であった。
しかしCentOS 7では旧来のシングルユーザモードに相当するレスキューモードに入ってもrootユーザのパスワードを要求されるので、その手は使えなくなっている。
エマージェンシーモード(レスキューモードとの違いはルートパーティションだけ読み取り専用でマウントする)というのもあるが同様にrootユーザのパスワードを入力する必要がある。
CentOS 7では以下のURLに書かれている方法を使用するが、検証の結果、手順に多少誤りがあるようなので、より良い手順を書き出しておく。
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Terminal_Menu_Editing_During_Boot.html
パスワード変更の手順
- GRUB2の起動画面のカーネル選択時に
e
を押して起動オプションの編集モードに入る - linux, linux16, linuxefiのいずれかで始まる行があるので、この行の
rhgb
を削除し(さもないとキーボード入力が反映されない)、LANG=ja_JP.UTF-8
があればこれも削除し(日本語で出力されても文字化けするだけ)、rw init=/bin/sh
を最後に追加する -
Ctrl+x
を押して起動する -
passwd
(rootユーザが無効で他に管理者ユーザがあるならpasswd <管理者ユーザ>
)で任意のパスワードを設定する - SELinuxがEnforcingの場合は
touch /.autorelabel
を実行する(通常のモードに戻る際に一度SELinuxのリラベリング処理が走るようになる。これを実行しないとログインできない) -
exec /sbin/init
を実行して通常のモードに移行する(上記URLにはexec /sbin/reboot
で再起動しても良いと書いてあるが、これはエラーになった)
終わりに
逆に、この手順を封じて管理者パスワードを変更できなくする方法はないか探してみたが見つけていない。
つまり、コンソールの前に座られるとrootユーザのパスワードを好き放題できるということなので、本当にそうされてはならない場合はBIOS/UEFIやディスクにパスワードを掛けるなどをしなければならない。
CentOS 6でも/etc/sysconfig/initのSINGLE行をSINGLE=/sbin/sulogin
とすればCentOS 7と同様にシングルユーザモードでrootユーザのパスワードを要求されるようになるが、上記手順と同じ方法でパスワードの変更が可能である(SELinuxがEnforcingでもtouch /.autorelabel
は不要だったが)。