プロセスごとのプライベートファイルシステムマウントポイント


24

私はunshareコマンドをチェックしていましたが、そのマニュアルページによると、

   unshare - run program with some namespaces unshared from parent

また、次のような名前空間のタイプがリストされています。

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

このマウント名前空間の目的は何ですか?私はいくつかの例の助けを借りてこの概念を理解しようとしています。



@Gilles、ありがとう。確認してみるよ。それまでの間、回答に他の何かを追加する必要がある場合はお知らせください。
ラメシュ14

回答:


29

実行unshare -mすると、呼び出しプロセスにそのマウント名前空間のプライベートコピーが与えられ、ファイルシステム属性の共有も解除されるため、ルートディレクトリ、現在のディレクトリ、またはumask属性が他のプロセスと共有されなくなります。

それでは、上記のパラグラフは何と言っていますか?簡単な例を使用して、理解してみましょう。

ターミナル1:

最初の端末で以下のコマンドを実行します。

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

最後のコマンドは、私に出力を与えます、

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

さて、次のコマンドも実行しました。

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

lsコマンドの出力は、

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

それで、これらすべてを行う上で大したことは何ですか?なぜそれをする必要がありますか?

今、別のターミナル(ターミナル2)を開き、以下のコマンドを実行します。

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

出力は次のとおりです。

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

ファイルhellohelloagain表示されていないと私も、これらのファイルをチェックするには、rootでログイン。そのため、この機能により他のルート所有プロセスでも表示または参照できないプライベート一時ファイルシステムを作成できるという利点があります。

のmanページからunshare

mount namespaceファイルシステムのマウントとアンマウントは、システムの残りの部分(CLONE_NEWNSフラグ)には影響しません。ただし、明示的に共有としてマークされているファイルシステムを除きます(mount --make-sharedを使用。共有フラグについては/ proc / self / mountinfoを参照)。

unshare --mountの後にmount --make-rprivateまたはmount --make-rslaveを使用して、新しい名前空間のマウントポイントが親の名前空間と実際に共有されていないことを確認することをお勧めします。

名前空間に使用されているメモリは、カーネルからのVFSです。そして-そもそもセットアップすれば、ルート権限のないルートユーザーである仮想環境全体を作成できます。

参照:

例は、このブログ投稿の詳細を使用して構成されています。また、この答えの引用は、マイクからのこの素晴らしい説明からです。これに関する別の素晴らしい読書はここからの答えから見つけることができます


1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.と比較してchrootchrootファイルは他のユーザーに表示されます。これは驚くべきことであり、おそらくその文は答えの一番上にあるはずです。+1しました。
セルギーKolodyazhnyy

1
ルートから逃れるものは何もありません! を使用しnsenterて、ネームスペースを入力し、一時ファイルを表示できます。次いで、(TEMPDIRを所有しているもの)のみ共有解除を想定しsudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pた内容を見ることを可能にする
earcam

2

あなたが持っている場合は気泡緩衝材システムにインストールし、あなたがワンステップで簡単に行うことができます。

bwrap --dev-bind / / --tmpfs /tmp bash

上記の例では、内部bashは/ tmpに独自のビューを持ちます。

@ Ramesh-sの回答に触発されたソリューション-ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.