GNU/Linux >> Linux の 問題 >  >> Linux

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

いくつかの方法があり、ほとんど安全なものもあれば、まったく安全でないものもあります。

安全でない方法

mount を実行してみましょう 、たとえば、sudoを介して。それらにルートを与えることもできます。それは同じことです。ユーザーは bash の suid ルート コピーを使用してファイル システムをマウントできます。 —即座にルートを取得する実行 (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 サポートをオフにすることによってのみ。ここのオプションには udisks が含まれます 、 udisks2pmountusbmount

必要に応じて、独自のスクリプトを作成して同様のことを行い、sudo を介して呼び出すこともできますが、root のエクスプロイトを残さないように、このスクリプトの作成には細心の注意を払う必要があります。ユーザーに sudo を覚えさせたくない場合は、スクリプトで次のようにすることができます:

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "[email protected]"
fi

# rest of script goes here 

いつか安全になる方法:ユーザー名前空間

Linux 名前空間は、仮想化 (より具体的にはコンテナー) の非常に軽量な形式です。特に、ユーザー名前空間では、any システム上のユーザーは、ルートである独自の環境を作成できます。これにより、いくつかの仮想ファイルシステムを除いて明示的にブロックされているファイルシステムを除いて、ファイルシステムをマウントできるようになります。最終的には、FUSE ファイルシステムが許可される可能性がありますが、私が見つけた最新のパッチはブロック デバイスをカバーしておらず、sshfs のようなものだけをカバーしています。

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

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

今のところ、udisks2 を使用します。


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

man mount を参照 詳細については


polkit を構成するための wiki は次のとおりです。 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

Linux
  1. ファイルシステムをマウントする方法、ユーザーIDのマッピング?

  2. ユーザーログイン中にファイルシステムをマウントするにはどうすればよいですか?

  3. Linux –ポート番号を指定してリモートファイルシステムをマウントする方法は?

  1. ファイルを作成してファイルシステムとしてマウントする方法は?

  2. FUSE ファイルシステム タイプを mount(8) と fstab に登録する方法は?

  3. NTFS ファイルシステムをマウントして、すべてのユーザーにフル アクセスを許可する方法は?

  1. 単一のLinuxファイルシステムを暗号化する方法

  2. コマンドを任意の端末にパイプする方法は?

  3. Linux でデバイスをマウントするには?