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


47

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

もう1つの質問は、「ユーザーがファイルシステムをマウントすることにより、どのような方法でシステムに損害を与えることができるのか?」


たぶんgvfs-mount-d /dev/sdX
KrisWebDev

回答:


44

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

安全でない方法

mountsudoなどを介して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、ユーザーが所有する(したがって変更可能な)ファイルをマウントすることを忘れないでください。

主に安全な方法: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名前空間は、仮想化の非常に軽量な形式です(より具体的には、コンテナー)。特に、ユーザーの名前空間を使用すると、システム上のすべてのユーザーが、自分がrootである独自の環境を作成できます。これにより、いくつかの仮想ファイルシステムを除いて明示的にブロックされている場合を除き、ファイルシステムをマウントできます。最終的には、FUSEファイルシステムはおそらく許可されるでしょうが、私が見つけた最新のパッチはブロックデバイスをカバーせず、sshfsのようなものだけをカバーしています。

さらに、多くのディストリビューションカーネルは、(セキュリティ上の理由から)デフォルトでは、特権のないユーザーがユーザーのネームスペースを使用できないようにしています。例えばDebianはありkernel.unprivileged_userns_cloneデフォルトに0他のディストリビューションはしかし、多くの場合、わずかに異なる名前で、同様の設定を持っていること。

ユーザーの名前空間について知っている最高のドキュメントは、LWNの記事 Namespaces in operation、part 5:User namespacesです。

今のところ、私はudisks2で行きます。


ご回答有難うございます!ところで、グループのユーザーがmountrootのようにファイルシステムをマウントできるようにすることは安全だと思いますか?リンクした名前空間のドキュメントを読み、少なくとも演習として、このマウントグループの実装を試みます。

@gkya最初のセクションで、(a)nosuid [およびnodev]を強制せずにファイルシステムをマウントできることを明らかにしたことを願っています。または(b)任意の場所で基本的にルートを与えています。誰かに任意のmountコマンドを実行する許可を与えると、それはrootを与えるのと同じです。
デロバート

「それぞれに多くのパーティションを持つ多くのリムーバブルドライブ」の@gkyaが別の答えにコメントしています。「udisksまたは類似の」アプローチが必要だと思います。
デロバート

1
@n ファイルツリーをプロセスごとの名前空間としてモデル化します(ルートなどはありません)。魅力的なもの。
被災者

1
@malan OK、更新しました。どちらかといえば、これにユーザー名前空間を使用することは、さらに先のことになりそうです。
デロバート

16

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

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


1
これはグーグルで見つけることができる唯一の答えです。FreeBSDでは、変数(つまりvfs.usermount)を設定することでユーザーがファイルシステムをマウントできるようになることがわかりました。欲しい それに似ています。私はそれぞれに多くのパーティションを持つ多くのリムーバブルドライブを使用していますが、それぞれのfstabに12個または2個のエントリを追加するのは面倒です。

udevdevicesい回避策は、新しいデバイスが表示されたり消えたりするときにエントリを管理できるようにすることです。
ジェスター

これがMintまたはUbuntuで動作することを発見していません。はい、デフォルトのユーザーアカウントはルートなしでマウントできますが、「標準」/「デスクトップ」ユーザーはマウントできません。
ジョニーなぜ

6

これは、非ルート(ユーザーなど)グループでパーティションをマウントするために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

2
行く方法のように思えますが、私にとってはうまくいきませんでした。
ステファンゴーリチョン

5

1動作する場所を見る

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

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

2関連するパーツを選択します

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

3利益!

(私は実際のUbuntu 16.04に同じ名前のファイルからもう少しピックアップしてなかったし、それは私のために働いた。あなたがそれを必要とする場合、それはほとんどのコンテンツのように見えるhttps://gist.github.com/kafene/5b4aa4ebbd9229fa2e73


これはDebianのようなシステムでのみ機能します。/etc/にルールを設定できなかった理由がわかりません。
アンワール

Debianストレッチでは機能しません。
フィリップルートヴィヒ

1
XFCE上のDebian Busterで動作します!ありがとう!
マックスウェルレイテ

3

sudo一連のユーザーがmountコマンドを実行できるように構成できます。

更新:マウントすることでシステムを損傷する方法については?たとえば、ファイルシステム上にsetuidルートシェルを作成し、マウントして実行してルート権限を取得できます。


私はこれを考えましたが、これでユーザーがコマンドを実行する必要はありませんsudoか?また、この方法で、rootユーザーがファイルシステムをマウントしているのは、舞台裏だけではないでしょうか?

はい、彼らはsudoを必要とし、はい、それはルートの名前で実行されます。最初の問題を解決するには、ラッパースクリプトにエイリアスmountを作成するsudo mountか、ラッパースクリプトを使用します。
ジェスター

私が欲しいのは、rootユーザーの代理なしでファイルシステムをマウントすることです。この代理店を何かで隠すことは、結局私がやっていることではありません。

setuid rootであるuserため、fstabへの追加も機能することに注意してくださいmount。カーネルはルートまたはCAP_SYS_ADMIN機能をチェックしているので、実際にはルートを巻き込むことはできません。
ジェスター

どのように設定できますか?これは役に立ちません。
Nuzzolilo

0

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

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

  • fstabブート時に永続的なストレージにマウントするのに最適です。USBドライブを接続したり、ときどきネットワーク共有をマウントしたりするのは、それほど素晴らしいことではありません。

  • sudo mountubuntu *システムを使用している場合でも大丈夫です。ただし、パスワードを入力する必要があります。

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

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

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

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

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


1
sudoを使用して、ユーザーがログイン時にホームフォルダーをマウントできるようにする場合は、autofsを確認する必要があります。
デロバート

これらを一緒に使用します。ファイルサーバーからクライアントPCの場所にautofsマウントするために、単独で使用する方法を理解できませんでした。/home/$USER/home/$USER/fromFS/
ナス

0

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

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