web-dev-qa-db-ja.com

chrootで実行していることをどのように確認できますか?

Chrootとスタンドアロンシステムの両方として使用できるはずのUNIXインストールがあります。 chrootとして実行している場合は、サービス(cron、inetdなど)を実行したくありません。ホストシステムと競合するか、冗長になるためです。

Chrootで実行されているかどうかによって動作が異なるシェルスクリプトを作成するにはどうすればよいですか?私の緊急の必要性は、/procがchrootにマウントされた最新のLinuxシステムであり、スクリプトはrootとして実行されていますが、より移植性の高い回答も歓迎します。 (/ / procがマウントされていない場合、chrootで実行していることをどのように確認するのですか?/procのないLinuxの場合を参照してください。)

より一般的には、他の封じ込め方法で機能する提案は興味深いでしょう。実用的な問題は、このシステムはサービスを実行しているはずですか? (答えはchrootにはありません、そして本格的な仮想マシンにはあります。jailやコンテナーなどの中間的なケースについては知りません。)

ここでは、initプロセス(PID 1)のルートが現在のプロセスのルートと同じかどうかをテストしています。 /proc/1/rootは常に/へのリンクですが(init自体がchrootされている場合を除きますが、それは私が気にするケースではありません)、それに従うと「マスター」ルートディレクトリにつながります。この手法は、Debianのいくつかのメンテナンススクリプトで使用されています。たとえば、chrootにインストールした後にudevの起動をスキップします。

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(ちなみに、これは、chrootされたプロセスにrootアクセスがある場合、chrootがセキュリティに役に立たない理由のもう1つの例です。非rootプロセスは/proc/1/rootを読み取ることはできませんが、/proc/1234/root PID 1234の実行中のプロセスが同じユーザーとして実行されている場合。)

Root権限がない場合は、/proc/1/mountinfoおよび/proc/$$/mountinfoを確認できます(Linuxカーネルのドキュメントの filesystems/proc.txtに簡単に記載されています )。このファイルは誰でも読み取り可能で、ファイルシステムのプロセスのビューにある各マウントポイントに関する多くの情報が含まれています。そのファイルのパスは、もしあれば、リーダープロセスに影響を与えるchrootによって制限されます。 /proc/1/mountinfoを読み取るプロセスがグローバルルートとは異なるファイルシステムにchrootされている場合(pid 1のルートがグローバルルートであると想定)、/のエントリは/proc/1/mountinfoに表示されません。 /proc/1/mountinfoを読み取るプロセスがグローバルルートファイルシステムのディレクトリにchrootされている場合、/のエントリが/proc/1/mountinfoに表示されますが、マウントIDは異なります。ちなみに、ルートフィールド($4)は、chrootがマスターファイルシステムのどこにあるかを示します。

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

これは純粋なLinuxソリューションです。 /procが十分に類似している他のUnixバリアントに一般化できる場合があります(Solarisも/proc/1/rootと類似していますが、mountinfoはそうではありません)。

inode番号を見つけるためのポータブルな方法 および 内部からchroot jailを検出する で述べたように、/のiノード番号が2であるかどうかを確認できます:

$ ls -di /
2 /

2以外のiノード番号は、見かけのルートがファイルシステムの実際のルートではないことを示します。これは、マウントポイントまたは ランダムなルートiノード番号を持つオペレーティングシステム をルートとするchrootを検出しません。

23
l0b0

ここにリストした他の多くのオプションほど明らかに移植性はありませんが、Debianベースのシステムを使用している場合は、ischrootを試してください。

参照: https://manpages.debian.org/jessie/debianutils/ischroot.1.en.html

Ischrootを使用してコンソールでステータスを直接取得するには:

ischroot;echo $?

終了コード:

0 if currently running in a chroot
1 if currently not running in a chroot
2 if the detection is not possible (On GNU/Linux this happens if the script is not run as root).
5
thom_nic