一部の特定のユーザー(グループのメンバーなど)に、Linuxのスーパーユーザー特権なしで任意のファイルシステムをマウントできるようにすることは可能ですか?
もう1つの質問は、「ユーザーがファイルシステムをマウントすることにより、どのような方法でシステムに損害を与えることができるのか?」
一部の特定のユーザー(グループのメンバーなど)に、Linuxのスーパーユーザー特権なしで任意のファイルシステムをマウントできるようにすることは可能ですか?
もう1つの質問は、「ユーザーがファイルシステムをマウントすることにより、どのような方法でシステムに損害を与えることができるのか?」
回答:
いくつかのアプローチがあり、それらのいくつかはほとんど安全ですが、他はまったく安全ではありません。
mount
sudoなどを介してrunを使用します。また、ルートを与えることもできます。それは同じことです。ユーザーは、suid rootのコピーでファイルシステムをマウントできます。これは、bash
すぐにrootになります(mount
実行されたという事実を超えて、ロギングなしで実行される可能性が高い)。
あるいは、ユーザーは自分のファイルシステムをにマウントし/etc
、/etc/shadow
またはの自分のコピーを格納し/etc/sudoers
てから、su
またはのいずれかでルートを取得できますsudo
。またはmount --bind
、これらの2つのファイルの1つにバインドマウント()することもできます。またはに新しいファイル/etc/sudoers.d
。
同様の攻撃は/etc/pam.d
、他の多くの場所で実行される可能性があります。
ファイルシステムはデバイス上にある必要さえなく-o loop
、ユーザーが所有する(したがって変更可能な)ファイルをマウントすることを忘れないでください。
ユーザーがリムーバブルメディアをマウントできるように、さまざまなデスクトップ環境で実際にこれに対するソリューションが既に構築されています。これらは、サブディレクトリ/media
のみにマウントし、カーネルオプションを介してset-user / group-idサポートをオフにすることで機能します。ここでのオプションがありudisks
、udisks2
、pmount
、usbmount
、
必要に応じて、同様のことを行う独自のスクリプトを作成し、sudoを介して呼び出すことができますが、ルートエクスプロイトを残さないように、このスクリプトの作成には細心の注意を払う必要があります。ユーザーがsudoを覚えておく必要がないようにするには、スクリプトで次のようなことができます。
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "$@"
fi
# rest of script goes here
Linux名前空間は、仮想化の非常に軽量な形式です(より具体的には、コンテナー)。特に、ユーザーの名前空間を使用すると、システム上のすべてのユーザーが、自分がrootである独自の環境を作成できます。これにより、いくつかの仮想ファイルシステムを除いて明示的にブロックされている場合を除き、ファイルシステムをマウントできます。最終的には、FUSEファイルシステムはおそらく許可されるでしょうが、私が見つけた最新のパッチはブロックデバイスをカバーせず、sshfsのようなものだけをカバーしています。
さらに、多くのディストリビューションカーネルは、(セキュリティ上の理由から)デフォルトでは、特権のないユーザーがユーザーのネームスペースを使用できないようにしています。例えばDebianはありkernel.unprivileged_userns_clone
デフォルトに0他のディストリビューションはしかし、多くの場合、わずかに異なる名前で、同様の設定を持っていること。
ユーザーの名前空間について知っている最高のドキュメントは、LWNの記事 Namespaces in operation、part 5:User namespacesです。
今のところ、私はudisks2で行きます。
mount
rootのようにファイルシステムをマウントできるようにすることは安全だと思いますか?リンクした名前空間のドキュメントを読み、少なくとも演習として、このマウントグループの実装を試みます。
mount
コマンドを実行する許可を与えると、それはrootを与えるのと同じです。
実行できますが、/etc/fstab
マウントするファイルシステムに対応するエントリを変更し、user
このエントリにフラグを追加する必要があります。その後、非特権ユーザーはマウントできます。
詳細man mount
を参照してください。
vfs.usermount
)を設定することでユーザーがファイルシステムをマウントできるようになることがわかりました。欲しい それに似ています。私はそれぞれに多くのパーティションを持つ多くのリムーバブルドライブを使用していますが、それぞれのfstabに12個または2個のエントリを追加するのは面倒です。
udev
devicesい回避策は、新しいデバイスが表示されたり消えたりするときにエントリを管理できるようにすることです。
これは、非ルート(ユーザーなど)グループでパーティションをマウントするためにudisks / udisks2のpolkitルールを設定するためのwikiです。
以下のコードを/etc/polkit-1/rules.d/50-udisks.rulesに保存します
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// only required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.filesystem-mount-system-internal": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// only required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.filesystem-mount-system": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("users")) {
return permission[action.id];
}
});
次のコマンドを使用してパーティションをマウントし、「users」グループにいると仮定します(sudoは不要です)。
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1
Xubuntuでは、USB大容量ストレージ、ハードディスクパーティション、CD / DVDなどをマウントおよびイジェクトできます。
policyKitを使用してUbuntuが選択したソリューションが十分に安全であると仮定しましょう。
Debian 8.3のXFCEでは、ユーザーがパスワードなしでthunarからファイルシステムをマウントおよびイジェクトできるようにする必要がありました。私のために働いたのは、Ubuntuから許可ファイルをチェリーピックすることです。
以下の行を名前付きファイルにルートとして追加すると/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
、トリックが実行されます。
[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes
(私は実際のUbuntu 16.04に同じ名前のファイルからもう少しピックアップしてなかったし、それは私のために働いた。あなたがそれを必要とする場合、それはほとんどのコンテンツのように見えるhttps://gist.github.com/kafene/5b4aa4ebbd9229fa2e73)
sudo
一連のユーザーがmount
コマンドを実行できるように構成できます。
更新:マウントすることでシステムを損傷する方法については?たとえば、ファイルシステム上にsetuidルートシェルを作成し、マウントして実行してルート権限を取得できます。
mount
を作成するsudo mount
か、ラッパースクリプトを使用します。
user
ため、fstabへの追加も機能することに注意してくださいmount
。カーネルはルートまたはCAP_SYS_ADMIN
機能をチェックしているので、実際にはルートを巻き込むことはできません。
括弧内の質問に答えるために、ファイルシステムはファイルのプレースホルダーであるため、ユーザーはファイルの削除など、そのファイルシステムで有害な操作を実行できる可能性があります。
他の2つの質問を要約すると、次のようになります。
fstab
ブート時に永続的なストレージにマウントするのに最適です。USBドライブを接続したり、ときどきネットワーク共有をマウントしたりするのは、それほど素晴らしいことではありません。
sudo mount
ubuntu *システムを使用している場合でも大丈夫です。ただし、パスワードを入力する必要があります。
udev
usbスティック、カメラ、フラッシュカードなどをubuntu *システムにマウントします(ただし、debian、slackwareなどのユーザーフレンドリーではないディストリビューションではありません)
歴史的に、一部のユーザー(またはグループ)に何かを行う権限を付与するUNIXの方法は、sudoers
ファイルを使用することです。
そこにそれを使用する多くのガイドがありますので、私は特定のものを提案しません。LinuxドキュメンテーションプロジェクトのWebサイトを使用して、それについて学習したと言います。
さらに、sudoers
デバイスと共有を透過的にマウントできるということです-パスワードを指定しなくても、そうすることを選択した場合は(特に注意してください)。
通常、制御環境で行うことは、sudoers
ファイルを使用して、特定のグループのユーザーがネットワーク共有を透過的にマウントできるようにすることです。そこで、「ユーザーがクライアント端末にログオンしたときに、ネットワークファイルサーバーからユーザーのホームフォルダーをマウントする」などの操作を許可するコマンドmount.nfs
をmount.cifs
sudoersファイルに追加します。
autofs
マウントするために、単独で使用する方法を理解できませんでした。/home/$USER
/home/$USER/fromFS/
guestmount
libguestfsの策略
sudo apt-get install libguestfs-tools
# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*
# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt
依存している:
ドキュメント:http : //libguestfs.org/guestmount.1.html
Ubuntu 18.04、libguestfs-tools 1:1.36.13-1ubuntu3でテスト済み。
gvfs-mount
-d /dev/sdX