web-dev-qa-db-ja.com

Linuxが「init = / bin / bash」を許可するのはなぜですか?

ブート前にGRUBを編集してrw init=/bin/bash最終的にルートシェルができます。

すべてを理解したい状態で、なぜこれが起こるのか知りたいです。それはバグですか?それは機能ですか?コンピューターに物理的にアクセスできる場合にのみ機能するので、管理者が問題を修正するのに役立ちますか?

GRUBまたは実際のカーネルによって提供されますか?

51
triedtoomuck

これは機能であり、システムの保守に使用されます。これにより、システム管理者は、混乱した初期化ファイルからシステムを回復したり、忘れたパスワードを変更したりできます。

このRed Hatメーリングリストの投稿 はいくつかのことを説明しています:

Unixライクなシステムでは、initが最初に実行されるプロセスであり、これまでに実行されたすべてのプロセスの最終的な祖先です。すべてのinitスクリプトの実行を担当します。

Linuxカーネルに、システムのinitではなく/ bin/bashをinitとして実行するように指示しています。 [...]

したがって、何も利用しておらず、標準のカーネル機能を使用しているだけです。

さらに、コメントに記載されているように、rwフラグはinit=とは別のもので、ルートファイルシステムを読み書き可能としてマウントするようにシステムに通知するだけです(そのため、誤って構成されたファイルやパスワードを変更します)。

44
Renan

システムには、実行およびデバッグのためのメカニズム(initパラメーターなど)があり、不要なユーザーがそれらを利用できないようにするためのセキュリティメカニズムがおそらくあります。これらはバグではなく機能です。

ブートローダーは、OSの起動を担当します。その時点では、OSのセキュリティは明らかに適用されません。別のカーネル、initrd、root fsをロードしたり、別のオプション(initパスなど)を設定したりできます。ユーザーがそれを行わないようにする場合は、ブートローダーで行う必要があります。

システム(おそらくPCなのでBIOS)がブートローダーをロードするため、明らかに、ブートローダーのセキュリティは適用されません。ユーザーがBIOSをUSBなどから起動するのを止めたい場合は、そのレベルで実行する必要があります。

あなたのシステムはどこかの机の上にあるかもしれません。ユーザーがヘリコプターを開いたり、自分用のHDDを切り替えたり、ドライブを取り外してマシンにマウントしたりできないようにする場合は、物理レベルで行う必要があります。そして、それは彼らが机全体を手に取り、彼らの逃走車で運転することを止めません...

これがセキュリティです。象はずっと下にいます。

20
XTL

コンピュータが起動すると、通常/bin/initまたは/sbin/initにある「init」と呼ばれるプログラムを実行します。このプログラムは、すべてのシステムの起動と使用可能な環境の作成を担当します。

init=/bin/bashを指定すると、代わりに/bin/bash(シェル)を実行するようにカーネルに指示します。 rwを指定すると、カーネルは、ハードディスクを読み取り専用モードではなく読み取り/書き込みモードで起動するように指示されます。従来、カーネルは読み取り専用モードのディスクから開始し、後でプロセスがディスクの整合性をチェックしてから、読み書きモードに切り替えます。

11
tylerl

kernel.org からつなぎ合わせる:

KNL     Is a kernel start-up parameter.

init=   [KNL]
        Format: <full_path>
        Run specified binary instead of /sbin/init as init
        process.

rw      [KNL] Mount root device read-write on boot
6
Philip Durbin

これはカーネルの機能です。「呼び出し元」、つまりブートローダーを使用できるため、柔軟性が高くなります。 Grubは起動時にこの柔軟性を利用する手段を提供しますが、 この種の改ざんを制限する手段 も提供します。これは、権限のないユーザーが起動プロセスを取得できる可能性がある場合に特に意味がありますが、それ以外の場合はハードドライブ自体へのアクセスが拒否されます。

1
MvG

init=をとることができます実行可能ファイル

init=は、 シェルスクリプト を含む、任意の実行可能ファイルを取得できます。

ここで例として、Cでコンパイルされた任意の最小限のinitを作成する方法を示します。 1つのプログラムだけを実行し、それ以外は何も実行しないカスタムLinuxディストリビューションを作成する方法

それでは、なぜを受け入れないすべてのものの/bin/bashを受け入れますが、これは単なる通常の実行可能ファイルであり、実際に役立ちますか? :-)

次に、systemdやBusyboxなどの通常のinitとのトレードオフを理解するようにしてください。

基本的に、生の/bin/bashを使用すると、次のようになります。

inittabの先頭に-を付けて、Busyboxの初期化およびその他の同様の初期化でジョブ制御を復元できます。

tty3::respawn:-/bin/sh

ログインを使用し、Ctrl + Dを実行した場合にシェルを生成し続ける、より一般的なinittabエントリは次のとおりです。

::respawn:/sbin/getty -L ttyS0 0 vt100

getty実行可能ファイルを使用しますが、TODO:Busybox initgetty start from command line? がないと、自分でスポーンできませんでした。

this setup を使用して、それをいじって上記の結論に達することができます。