ルートのシェルを不良ファイルに設定することからの回復


23

たとえば、「chsh」を使用してrootユーザーのシェルを不正なファイルパスに変更するなど、愚かなことをしたとしましょう。ルートアカウントへの今後のログインは、/ bin / whateverが見つからないことを引用して突然失敗し、ログイン画面に戻ります。/ etc / passwdを編集するためにリカバリモードを禁止するか、LiveCDを挿入する場合、システムを元に戻すためのオプションは何ですか?また、(楽しみのために)wheelに他のユーザーはいないと仮定しましょう。考え?


これはあなたが提案している架空の状況ですか?
クリスダウン

私は確かに(比較的新しい)FreeBSDインストールでこれを正確に行いました。それは再インストールされたので、今やいくらか仮説になっていると思いますが、実際に完全なシステムが存在していた場合、回復への最適なルートはどうだったのでしょうか。
noffle

そこに行って、それをして、Tシャツを手に入れました。しかし、万が一に備えて、私が管理するすべてのマシンでバックアップルートアカウントを維持しています。
マークD

回答:


30

起動時init=/bin/bashに、起動オプションに追加(または他の機能的なシェルへのパス)-シングルユーザーシェルに直接ドロップされます。その環境のエントリをmount -o remount,rw /変更する前に行う必要がある場合があり/etc/passwdます。その後、再起動するか、実行しますexec /sbin/init 3。入力したり、Ctrl + Dを押したりしないでくださいexit。カーネルパニック*が発生します。

2段階モード(initrdイメージを使用)でロードされた一部のシステムでは、この方法の1つの追加バリエーションが必要になる場合があります。ブートオプションにinit=とが含まれていることに気付いた場合、最も重要なのはreal_init=、配置する場所/bin/bashが後者のパラメータ(つまりreal_init=/bin/bash)であることです。

*これは、その環境では、シェルがカーネルからinitプログラム(カーネルが知っている唯一のプロセス)として認識されるためです。シェルは、カーネルの目に見える実行中のシステムを表します。システムをシャットダウンするようにカーネルに通知せずに、そのプロセスを突然終了すると、カーネルパニックが発生する必要があります。(あなたの周りのすべてが突然暗くなって静かになったらパニックになりませんか?)


にはいいですがexec、事前にマウントポイントを使いすぎないようにした方が良いと思います。
ステファンギメネス

2
STEPH @あなたは持っているルートをマウントすることはありません、あなたのカーネルがあればという読み書きを行うこと。そうしないと、ファイル(を含む/etc/passwd)を変更できません。
rozcietrzewiacz

いい考え!私は何とかシングルユーザーモードになりましたが、/ etc / passwdを変更するために/を読み取り/書き込みとして再マウントしなければならないとは思いませんでした。ありがとう!
noffle

@roz確かに、/initを実行する前に(以外の)マウントされていた可能性のあるすべてのもののアンマウントを処理すると言っていました。
ステファンギメネス

@Stéphマウントに問題はないはずです。これ/bin/bashはその時点で正確に/sbin/init実行され、通常のブート時に実行されることに注意してください。そのため、その時点でシステムが実行できるアクションはありません。
rozcietrzewiacz

10

su実行するシェルを使用して指定することができます(他のユーザーがにいないというメモでこれが不可能であることを暗示しようとしているのかどうかわかりませんwheel)。

su -c /bin/bash

それ以外の場合、sshデーモンがrootへのログインを許可している場合、同様のことを行うことができます。

ssh root@localhost /bin/bash

たとえば、ブートローダーでシェルをinitとして設定することもできますinit=/bin/ksh


1
良いアイデア。=)ご想像のとおり、他のユーザーは「su」を使用できません。sshdでは、rootログインも無効になっています。
noffle

6

ブートローダがカーネルパラメータのライブ編集を許可するように設定されている場合、解決策は再起動し、initプロセスとしてシェルを使用することinit=/bin/bashです。次に、手動でマウントする必要があるものをすべてマウントし、編集します/etc/passwdsyncそしていつものようにもう一度起動しますinit


うわー、私はちょうどあなたが私と同じ分に同じ答えを投稿したことに気づいた:
rozcietrzewiacz

6

あなたの質問の要点が、あなたがルートになるためのすべての方法を締め出したということであるなら、定義によってあなたはルートになることができません。

UNIXシステムでrootになるための3つの方法を許可するのが一般的です。

  • rootログインプロンプトで入力し、rootパスワードを入力して、root としてログインします。これにより、ルートのシェルが実行されます。
  • 通常のユーザーとしてログインし、実行suしてrootパスワードを入力してrootになります。一部のシステムでは、これには特定のグループ(多くの場合wheel)と呼ばれることが必要です。他のシステムでは、rootパスワードを知っている人はだれでもrootになることができます。認証にPAMを使用pam_wheelするシステムは、ホイールグループがある場合はそれを管理するために使用します。でコマンドを指定するとsu -c、ルートのシェルを介して実行されます。
  • 通常のユーザーとしてログインしsudo、自分のパスワードを実行して入力して、rootになります。ユーザーアカウントには、管理者によってsudo権限が付与されている必要があります。sudoersファイルで制限されていない限り、ルートのシェルに関係なく、任意のコマンドを実行できます。

ルートのシェルが使用できないようにする従来の方法は、UID 0と別のシェル(toor従来の名前)で別のアカウントを定義することです。たとえば、ルートのシェルが動的にリンクされた実行可能ファイル(メモリを節約するための良いアイデア)であり、ライブラリのアップグレードが失敗した場合、ルートのシェルは使用できない可能性があります。代替ルートアカウントには、静的にリンクされた実行可能ファイルがあり、おそらくBusyBoxなどの一般的なユーティリティが組み込まれています。


5

上記の答えは素晴らしく、私はそれらを読んで学んだ。これらのアプローチの詳細を覚えておらず、再起動を気にしない場合は、いつでもライブCDディストリビューションを使用してシステムを起動し、/パーティションをマウントしてから/ etc / passwdを編集して再起動できます。上記のソリューションほどエレガントではありませんが、覚えやすいです。


/etc/passwdファイルの手動編集に関連するリスクを指摘する必要があります。これ以外の良い点-私はちょうど私の提案に同じ提案を加えたかった。
rozcietrzewiacz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.