Bagaimana memperbolehkan non-pengguna super untuk me-mount sistem file apa pun?

48

Apakah mungkin untuk mengizinkan beberapa pengguna tertentu (misalnya anggota grup) untuk memasang sistem file apa pun tanpa hak pengguna superuser di Linux?

Pertanyaan lain mungkin adalah "dalam hal apa pengguna dapat membahayakan sistem dengan memasang sistem file?"

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
Mungkingvfs-mount-d /dev/sdX
KrisWebDev
related unix.stackexchange.com/questions/20838/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

46

Ada beberapa pendekatan, sebagian dari mereka sebagian besar aman, yang lain tidak sama sekali.

Cara tidak aman

Biarkan semua penggunaan berjalan mount, misalnya, melalui sudo. Anda mungkin juga memberi mereka root; itu adalah hal yang sama. Pengguna dapat me-mount sistem file dengan salinan root suid dari bash—running yang secara instan memberikan root (kemungkinan tanpa logging, di luar fakta yang mountdijalankan).

Sebagai alternatif, pengguna dapat memasang sistem file sendiri di atas /etc, berisi salinannya sendiri /etc/shadowatau /etc/sudoers, kemudian mendapatkan root dengan salah satu suatau sudo. Atau mungkin bind-mount ( mount --bind) pada salah satu dari dua file tersebut. Atau file baru menjadi /etc/sudoers.d.

Serangan serupa dapat ditarik dari atas /etc/pam.ddan banyak tempat lainnya.

Ingat bahwa filesystem tidak perlu ada di perangkat, -o loopakan me-mount file yang dimiliki (dan dengan demikian dapat dimodifikasi) oleh pengguna.

Cara yang paling aman: udisks atau sejenisnya

Berbagai lingkungan desktop sebenarnya sudah membangun solusi untuk ini, untuk memungkinkan pengguna memasang media yang dapat dilepas. Mereka bekerja dengan memasang di subdirektori /mediahanya dan dengan mematikan dukungan set-user / group-id melalui opsi kernel. Pilihan di sini termasuk udisks, udisks2, pmount, usbmount,

Jika harus, Anda dapat menulis skrip Anda sendiri untuk melakukan hal serupa, dan memohonnya melalui sudo — tetapi Anda harus benar-benar berhati-hati menulis skrip ini untuk tidak meninggalkan eksploitasi root. Jika Anda tidak ingin pengguna Anda harus mengingat sudo, Anda dapat melakukan sesuatu seperti ini dalam sebuah skrip:

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

# rest of script goes here 

Cara yang akan aman suatu hari nanti: ruang nama pengguna

Ruang nama Linux adalah bentuk virtualisasi yang sangat ringan (wadah, untuk lebih spesifik). Secara khusus, dengan ruang nama pengguna, setiap pengguna pada sistem dapat membuat lingkungan mereka sendiri di mana mereka root. Ini akan memungkinkan mereka untuk me-mount sistem file, kecuali yang telah diblokir secara eksplisit kecuali untuk beberapa sistem file virtual. Akhirnya, filesystem FUSE mungkin akan diizinkan, tetapi tambalan terbaru yang saya temukan tidak mencakup perangkat blok, hanya hal-hal seperti sshfs.

Lebih lanjut, banyak kernel distro (untuk alasan keamanan) default untuk tidak mengizinkan pengguna yang tidak memiliki hak menggunakan ruang nama pengguna; misalnya Debian memiliki kernel.unprivileged_userns_clonedefault ke 0. Distro lain memiliki pengaturan yang serupa, walaupun seringkali dengan nama yang sedikit berbeda.

Dokumentasi terbaik yang saya ketahui tentang ruang nama pengguna adalah artikel LWN ruang nama operasi, bagian 5: Ruang nama pengguna .

Untuk saat ini, saya akan menggunakan udisks2.

derobert
sumber
Terima kasih atas jawaban anda! BTW, apakah menurut Anda aman untuk memungkinkan pengguna dalam grup mountuntuk dapat me-mount sistem file seperti yang dilakukan root? Saya akan membaca dokumen ruang nama yang telah Anda tautkan, dan mencoba menerapkan hal mount group ini, setidaknya sebagai latihan.
1
@derobert karena Anda berbicara tentang ruang nama pengguna, Anda mungkin ingin memeriksa Plan 9 dari Bell Labs (itu adalah penerus UNIX, dibuat oleh orang yang sama). itu memodelkan pohon file sebagai namespace per-proses (dan tidak ada yang namanya root). hal-hal menarik.
strugee
1
@derobert Bisakah kita mendapatkan pembaruan pada bagian " Cara yang akan aman suatu saat: ruang nama pengguna "?
malan
1
@alan OK, saya sudah memperbaruinya. Jika ada, saya pikir menggunakan ruang nama pengguna untuk ini terlihat lebih jauh di masa depan.
derobert
1
@derobert Betapa menyedihkan. Saya membaca jawabannya, melihatnya dari tahun 2015, dan berpikir, "Saya ingin tahu apakah kita memiliki ini sekarang!"
malan
16

Anda dapat melakukannya, tetapi Anda perlu memodifikasi entri yang /etc/fstabsesuai dengan sistem file yang ingin Anda pasang, menambahkan tanda userpada entri ini. Pengguna yang tidak memiliki hak istimewa kemudian dapat memasangnya.

Lihat man mountuntuk lebih jelasnya.

MBR
sumber
1
Ini adalah satu-satunya jawaban yang dapat saya temukan dengan googling. Saya telah menemukan bahwa di FreeBSD, seseorang dapat memperbolehkan pengguna untuk me-mount filesystem dengan menetapkan variabel (yaitu vfs.usermount). Saya ingin sth. analog dengan itu. Saya menggunakan banyak drive yang dapat dilepas dengan banyak partisi pada masing-masing partisi dan akan sulit untuk menambahkan selusin atau dua entri ke fstab untuk masing-masing partisi.
Solusi yang buruk dapat membiarkan udevmengelola entri saat perangkat baru muncul dan menghilang.
Jester
saya belum menemukan ini berfungsi pada Mint atau Ubuntu. Ya, akun pengguna default dapat dipasang tanpa root, tetapi pengguna 'standar' / 'desktop' tidak dapat memasang.
Johnny mengapa
6

Berikut adalah wiki untuk mengonfigurasi aturan polkit untuk udisks / udisks2 untuk me-mount partisi oleh grup non-root (misalnya pengguna).

Simpan kode di bawah ini ke /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];
  }
});

Asumsikan Anda berada di grup "pengguna", menggunakan perintah berikut untuk me-mount partisi (tidak perlu sudo).

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1
meong
sumber
2
Sepertinya cara untuk pergi tetapi tidak berhasil untuk saya.
Stéphane Gourichon
5

1 Lihat di mana ia bekerja

Pada Xubuntu ia berfungsi di luar kotak untuk memasang dan mengeluarkan penyimpanan massal USB, partisi hard disk, CD / DVD dan mungkin lebih.

Mari kita asumsikan bahwa solusi yang dipilih Ubuntu, menggunakan policyKit, cukup aman.

2 Pilih bagian yang relevan

Pada XFCE pada Debian 8.3 saya harus mengizinkan pengguna untuk memasang dan mengeluarkan sistem file dari thunar tanpa kata sandi. Yang berhasil bagi saya adalah memilih file izin dari Ubuntu.

Menambahkan baris di bawah ini sebagai root ke file bernama /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pklaharus melakukan trik:

[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 Untung!

(Apa yang saya lakukan sebenarnya adalah mengambil sedikit lebih banyak dari file dengan nama yang sama di Ubuntu 16.04 dan itu bekerja untuk saya. Jika Anda membutuhkannya, sebagian besar sepertinya isi https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )

Stéphane Gourichon
sumber
Hanya ini berfungsi di sistem seperti debian, tidak tahu mengapa meletakkan aturan di / etc / tidak berfungsi.
Anwar
Tidak berfungsi pada debian stretch.
Philipp Ludwig
1
Bekerja pada Debian Buster di XFCE! Terima kasih!
Maxwel Leite
3

Anda dapat mengonfigurasi sudountuk mengizinkan sekelompok pengguna untuk menjalankan mountperintah.

Pembaruan : bagaimana Anda dapat merusak sistem dengan memasang? Sebagai contoh, Anda dapat membuat shell root setuid pada sistem file yang kemudian bisa Anda mount dan jalankan untuk mendapatkan privilege root.

Pelawak
sumber
Saya sudah memikirkan hal ini, tetapi tidakkah ini mengharuskan pengguna untuk menjalankan perintah sudo? Juga, bukankah pengguna root memasang sistem file, hanya di belakang layar, dengan metode ini?
Ya, mereka membutuhkan sudo dan ya itu berjalan atas nama root. Untuk mengatasi masalah pertama, Anda bisa alias mountuntuk sudo mountatau menggunakan script wrapper.
Jester
Yang ingin saya miliki adalah me-mount sistem file tanpa agensi dari pengguna root. Menyembunyikan agen ini dengan apa pun bukanlah apa yang saya inginkan sama sekali.
Perhatikan bahwa menambahkan userke fstab hanya berfungsi karena mountsetuid root. Kernel memeriksa root atau CAP_SYS_ADMINkapabilitas sehingga Anda tidak bisa benar-benar melibatkan root.
Jester
Anda bisa mengonfigurasi, bagaimana? Ini tidak membantu.
Nuzzolilo
0

Untuk menjawab pertanyaan Anda dalam tanda kurung, karena sistem file adalah pengganti untuk file, maka pengguna dapat berpotensi melakukan operasi berbahaya pada sistem file tersebut, seperti menghapus file.

Meringkas 2 pertanyaan lain saya akan mengatakan ini:

  • fstabsangat bagus untuk pemasangan pada penyimpanan permanen saat booting . Tidak begitu bagus ketika Anda ingin mencolokkan drive usb atau sesekali mount beberapa jaringan.

  • sudo mountjuga tidak masalah jika Anda menggunakan sistem ubuntu *. Anda masih harus mengetikkan kata sandi.

  • udev akan menangani pemasangan hal-hal seperti stik usb, kamera dan kartu flash di sistem ubuntu * (tetapi tidak dalam distro yang kurang ramah pengguna seperti debian, slackware, dll)

Saya akan menambahkan bahwa, secara historis, cara unix untuk memberikan otoritas kepada beberapa pengguna (atau grup) untuk melakukan hal-hal adalah melalui sudoersfile.

Ada banyak panduan untuk menggunakannya di luar sana jadi saya tidak akan menyarankan yang khusus. Saya akan mengatakan bahwa saya menggunakan situs web proyek dokumentasi Linux untuk mempelajarinya.

Yang lebih penting sudoersadalah Anda dapat memasang perangkat dan berbagi secara transparan - bahkan tanpa memberikan kata sandi jika Anda memilih untuk melakukannya (ekstra hati-hati tentang hal itu).

Apa yang biasanya saya lakukan dalam lingkungan kontrol adalah saya menggunakan sudoersfile untuk memungkinkan pengguna grup tertentu untuk me-mount berbagi jaringan secara transparan. Jadi saya menambahkan perintah mount.nfsdan mount.cifsdalam file sudoers yang memungkinkan operasi seperti "me-mount folder home pengguna dari server file jaringan, ketika pengguna log on ke terminal klien" dan belajar seperti itu.

tidak
sumber
1
Jika Anda menggunakan sudo untuk memungkinkan pengguna memasang folder beranda saat login, Anda harus melihat autofs.
derobert
Saya menggunakan ini bersama-sama; Saya tidak tahu bagaimana cara menggunakannya autofssendiri untuk me-mount /home/$USERdari fileserver, ke lokasi /home/$USER/fromFS/di pc klien.
nass
0

guestmount tipu daya 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

Bergantung pada:

  • implementasi userland dari sistem file
  • SEKERING

Documents: http://libguestfs.org/guestmount.1.html

Diuji pada Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber