web-dev-qa-db-ja.com

スーパーユーザー以外のユーザーがファイルシステムをマウントできるようにするにはどうすればよいですか?

一部の特定のユーザー(グループのメンバーなど)がLinuxでスーパーユーザー権限なしにanyファイルシステムをマウントできるようにすることは可能ですか?

もう1つの質問は、「ユーザーがファイルシステムをマウントすることによってシステムに害を及ぼす可能性があるのはどのような方法ですか?」

50
user27225

いくつかのアプローチがあり、それらの一部はほとんど安全であり、その他はまったくありません。

安全でない方法

たとえば、Sudoを介してmountを実行します。あなたは彼らに根を与えるのもよいでしょう。それは同じことです。ユーザーは、bashのsuidルートコピーを使用してファイルシステムをマウントできます。これを実行すると、即座にルートが取得されます(mountが実行されたという事実を超えて、ログを記録しない可能性があります)。

または、ユーザーは、/etcまたは/etc/shadowの独自のコピーを含む/etc/sudoersの上に独自のファイルシステムをマウントし、suまたはSudoのいずれかでルートを取得することもできます。または、これらの2つのファイルのいずれかにバインドマウント(mount --bind)することもできます。または、/etc/sudoers.dへの新しいファイル。

同様の攻撃は、/etc/pam.dや他の多くの場所で行われる可能性があります。

ファイルシステムはデバイス上にある必要もないことに注意してください。-o loopは、ユーザーが所有している(したがって変更可能な)ファイルをマウントします。

最も安全な方法:udisksまたは同様のもの

ユーザーがリムーバブルメディアをマウントできるようにするために、さまざまなデスクトップ環境でこれに対するソリューションがすでに構築されています。これらは、/mediaのみのサブディレクトリにマウントし、カーネルオプションを介してset-user/group-idサポートをオフにすることで機能します。ここのオプションには、udisksudisks2pmountusbmount

必要に応じて、独自のスクリプトを記述して同様のことを行い、それを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を使用します。

48
derobert

できますが、マウントするファイルシステムに対応する/etc/fstabのエントリを変更し、このエントリにフラグuserを追加する必要があります。その後、非特権ユーザーはそれをマウントできます。

詳細は man mount を参照してください。

20
MBR

ここ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
8
Meow

1動作する場所を確認する

Xubuntuでは、そのままでUSBマスストレージ、ハードディスクパーティション、CD/DVDなどをマウントおよびイジェクトします。

UbuntuがpolicyKitを使用して選択したソリューションが十分に安全であると仮定しましょう。

2関連する部分を選択してください

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

3利益!

(私が実際に行ったのは、Ubuntu 16.04上の同じ名前のファイルからもう少し選択することでした。それは私にとってはうまくいきました。それが必要な場合は、ほとんどが https://Gist.github.com/kafene/5b4aa4ebbd9229fa2e7

6

Sudoを設定して、一連のユーザーがmountコマンドを実行できるようにすることができます。

更新:マウントすることでシステムをどのように損傷させることができますか?たとえば、ファイルシステム上にsetuidルートシェルを作成して、マウントして実行し、ルート権限を取得できます。

3
Jester

Sudo、ACLなどを使用しないシンプルで安全な方法...

デバイスファイルが属するグループを探します。

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のみであり、特定のディスクをマウントできます。

1
greenif

ファイルシステムはファイルのプレースホルダーであるため、括弧内の質問に答えるために、ユーザーはそのファイルシステムに対してファイルの削除などの有害な操作を実行する可能性があります。

他の2つの質問を要約すると、次のようになります。

  • fstabboot時間でのマウントに最適ですpermanentストレージ。 USBドライブを接続したり、ときどき一部のネットワーク共有をマウントしたりする場合は、それほどすばらしいことではありません。

  • Sudo mountは、ubuntu *システムを使用している場合も問題ありません。ただし、パスワードを入力する必要があります。

  • udevは、ubuntu *システムでのUSBスティック、カメラ、フラッシュカードなどのマウントを処理します(debian、slackwareなどのユーザーフレンドリーでないディストリビューションでは行いません)。

歴史的に、一部のユーザー(またはグループ)に権限を与えるUNIXの方法は、sudoersファイルを使用することです。

そこには多くのガイドがあり、特に提案はしません。 LinuxドキュメンテーションプロジェクトのWebサイトを使用してそれについて学習したと言います。

さらにsudoersを使用すると、パスワードを指定しなくても、デバイスと共有を透過的にマウントできるようになります(その場合は特に注意してください)。

私が通常制御環境で行うのは、sudoersファイルを使用して、特定のグループのユーザーがネットワーク共有を透過的にマウントできるようにすることです。そこで、sudoersファイルにコマンドmount.nfsmount.cifsを追加して、「ユーザーがクライアント端末にログオンしたときに、ネットワークファイルサーバーからユーザーのホームフォルダをマウントする」などの操作を許可します。そのように。

0
nass

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でテスト済み。