私は他のシステムをインストールする必要がないようにchroot刑務所を作るためにUnionfs-fuseを組み合わせました。
ただし、結果システムの/ devエントリは読み取れません。これにより/dev/random
、/dev/null
およびアクセスする必要があるプログラムに問題が発生する可能性があります/dev/urandom
。
私は永続ファイルで構成されたディレクトリを作成し、次を使用して上記のファイルとmknod
同等のファイルを作成し、この問題を直接解決しようとしました。ここその後、共用体を作成します。
# unionfs-fuse -o cow /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
その後、
# chroot chroot/
しかし試してみるとき:
# head -c 10 /dev/random | hexdump -C
エラーが発生します。
head: cannot open `/dev/random' for reading: Permission denied
この問題をどのように解決するのですか?
/dev
(likeまたは/dev/sd*
他のファイルにアクセスする必要はありません/dev/mem
。)
答え1
説明は次のとおりです。mount.fuse
マニュアルページ:
ファイルシステムはデフォルトでマウントされており、
nodev,nosuid
特権を持つユーザーのみをオーバーライドできます。
このnodev
オプションを有効にすると、カーネルはマウントされたファイルシステム上のデバイスへのすべてのアクセスを無効にします。このnosuid
オプションを使用すると、カーネルは setuid および setgid 属性を無視します。 root以外のユーザーがファイルシステムをマウントするときは、セキュリティのために両方のオプションが必要です。それ以外の場合は、マウントしているユーザーがファイルシステムをバイパスしてすべてのディスクにアクセスできるようにするsetuidルートシェルまたはデバイスを作成できます。
allow_other
root以外のユーザーがファイルシステムにアクセスしたい場合でも、このオプションが必要です。
unionfs-fuse -o cow,dev,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
chrootに表示されるデバイスを制限するには、連合マウントを使用することはありません。代わりに、dev
必要なものを含む最小限のものを放棄してインストール/dev
してください。 tmpfsで作成できます。
unionfs-fuse -o cow,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
mount -t tmpfs -o mode=755 chroot-dev /chroot/chroot/dev
cp -a /dev/null /dev/zero /dev/urandom /chroot/chroot/dev
mkdir /chroot/chroot/dev/pts
mount --bind /dev/pts /chroot/chroot/dev/pts
tmpfsの代わりに準備されたデバイスを含むディレクトリをバインドマウントできます。/dev/pts
chrootから擬似端末を取得するにはバインドマウントが必要です。