一部の特定のユーザー(グループのメンバーなど)がLinuxでスーパーユーザー権限なしにanyファイルシステムをマウントできるようにすることは可能ですか?
もう1つの質問は、「ユーザーがファイルシステムをマウントすることによってシステムに害を及ぼす可能性があるのはどのような方法ですか?」
いくつかのアプローチがあり、それらの一部はほとんど安全であり、その他はまったくありません。
たとえば、Sudoを介してmount
を実行します。あなたは彼らに根を与えるのもよいでしょう。それは同じことです。ユーザーは、bash
のsuidルートコピーを使用してファイルシステムをマウントできます。これを実行すると、即座にルートが取得されます(mount
が実行されたという事実を超えて、ログを記録しない可能性があります)。
または、ユーザーは、/etc
または/etc/shadow
の独自のコピーを含む/etc/sudoers
の上に独自のファイルシステムをマウントし、su
またはSudo
のいずれかでルートを取得することもできます。または、これらの2つのファイルのいずれかにバインドマウント(mount --bind
)することもできます。または、/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名前空間は、仮想化の非常に軽量な形式(具体的にはコンテナー)です。特に、ユーザー名前空間を使用すると、システム上のanyユーザーは、自分がrootである独自の環境を作成できます。これにより、いくつかの仮想ファイルシステムを除いて明示的にブロックされている場合を除いて、ファイルシステムをマウントできます。最終的には、Fuseファイルシステムはおそらく許可されるでしょうが、 私が見つけた最新のパッチ は、sshfsのようなものだけをブロックデバイスをカバーしません。
さらに、多くのディストリビューションカーネルでは(セキュリティ上の理由により)非特権ユーザーがユーザー名前空間を使用できないようにデフォルト設定されています。たとえば Debian にはkernel.unprivileged_userns_clone
がデフォルトで0に設定されています。他のディストリビューションにも同様の設定がありますが、名前がわずかに異なることがよくあります。
ユーザー名前空間について私が知っている最良のドキュメントは、LWN記事運用中の名前空間、パート5:ユーザー名前空間 。です。
ここでは、udisks2を使用します。
できますが、マウントするファイルシステムに対応する/etc/fstab
のエントリを変更し、このエントリにフラグuser
を追加する必要があります。その後、非特権ユーザーはそれをマウントできます。
詳細は man mount
を参照してください。
ここ はpolkitルールをudisks/udisks2非ルート(ユーザーなど)グループでパーティションをマウントするため。
以下のコードを/ 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などをマウントおよびイジェクトします。
UbuntuがpolicyKitを使用して選択したソリューションが十分に安全であると仮定しましょう。
Debian 8.3のXFCEでは、ユーザーがパスワードなしでthunarからファイルシステムをマウントおよびイジェクトできるようにする必要がありました。私にとってうまくいったのは、Ubuntuから許可ファイルをチェリーピックすることです。
以下の行をrootとして/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/5b4aa4ebbd9229fa2e7 )
Sudo
を設定して、一連のユーザーがmount
コマンドを実行できるようにすることができます。
更新:マウントすることでシステムをどのように損傷させることができますか?たとえば、ファイルシステム上にsetuidルートシェルを作成して、マウントして実行し、ルート権限を取得できます。
デバイスファイルが属するグループを探します。
ls -l /dev/sda2
brw-rw---- 1 root disk /dev/sda2
デバイスファイルがグループdisk
に属していることを確認しました
次に、ユーザーをグループdisk
に追加します
usermod -G disk -a username
そして今、/etc/fstab
/dev/sda2 /mnt/backups ext4 noauto,group,suid,dev,async 0 2
またはUUIDで
UUID=c90324c1-3fba-119c-913c-5f913afdca8b /mnt/backups ext4 noauto,group,suid,dev,async 0 2
これで、グループdisk
のすべてのユーザーが、現時点ではusername
のみであり、特定のディスクをマウントできます。
ファイルシステムはファイルのプレースホルダーであるため、括弧内の質問に答えるために、ユーザーはそのファイルシステムに対してファイルの削除などの有害な操作を実行する可能性があります。
他の2つの質問を要約すると、次のようになります。
fstab
はboot時間でのマウントに最適ですpermanentストレージ。 USBドライブを接続したり、ときどき一部のネットワーク共有をマウントしたりする場合は、それほどすばらしいことではありません。
Sudo mount
は、ubuntu *システムを使用している場合も問題ありません。ただし、パスワードを入力する必要があります。
udev
は、ubuntu *システムでのUSBスティック、カメラ、フラッシュカードなどのマウントを処理します(debian、slackwareなどのユーザーフレンドリーでないディストリビューションでは行いません)。
歴史的に、一部のユーザー(またはグループ)に権限を与えるUNIXの方法は、sudoers
ファイルを使用することです。
そこには多くのガイドがあり、特に提案はしません。 LinuxドキュメンテーションプロジェクトのWebサイトを使用してそれについて学習したと言います。
さらにsudoers
を使用すると、パスワードを指定しなくても、デバイスと共有を透過的にマウントできるようになります(その場合は特に注意してください)。
私が通常制御環境で行うのは、sudoers
ファイルを使用して、特定のグループのユーザーがネットワーク共有を透過的にマウントできるようにすることです。そこで、sudoersファイルにコマンドmount.nfs
とmount.cifs
を追加して、「ユーザーがクライアント端末にログオンしたときに、ネットワークファイルサーバーからユーザーのホームフォルダをマウントする」などの操作を許可します。そのように。
guestmount
libguestfs trickery
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でテスト済み。