Süper kullanıcı olmayanların herhangi bir dosya sistemini bağlamalarına nasıl izin verilir?


47

Bazı kullanıcıların (örneğin bir grubun üyeleri gibi) Linux'ta süper kullanıcı ayrıcalıkları olmadan herhangi bir dosya sistemini bağlamasına izin vermek mümkün mü ?

Başka bir soru da "bir kullanıcının dosya sistemlerini monte ederek bir sisteme nasıl zarar verebileceği" olabilir


Belkigvfs-mount-d /dev/sdX
KrisWebDev

Yanıtlar:


44

Bazıları çoğunlukla güvenli, bazıları olmayan, birkaç yaklaşım vardır.

Güvensiz yol

Herhangi bir kullanımın mountörneğin sudo aracılığıyla çalışmasına izin verin . Onlara kök verebilirsin; aynı şey. Kullanıcı bash, anında kök veren ( mountçalıştırılan gerçekliğin ötesinde herhangi bir günlüğe kaydetmeden büyük olasılıkla) günlük bir derinlikli kopya kopyası içeren bir dosya sistemini bağlayabilir .

Alternatif olarak, bir kullanıcı kendi dosya sistemini üstüne kurabilir /etc, kendi kopyasını içeren /etc/shadowveya /etc/sudoersdaha sonra suveya ile root elde edebilir sudo. Ya da muhtemelen mount --bindbu iki dosyadan birinin üzerine bağla ( ). Veya içine yeni bir dosya /etc/sudoers.d.

Benzer saldırılar /etc/pam.dbaşka yerlere de çekilebilirdi .

Dosya sistemlerinin bir cihazda bile olması gerekmediğini -o loop, kullanıcının sahip olduğu (ve dolayısıyla değiştirilebilen) bir dosyayı monte edeceğini unutmayın.

En güvenli yol: udisks veya benzeri

Çeşitli masaüstü ortamları, kullanıcıların çıkarılabilir medyayı monte etmelerini sağlamak için zaten buna çözümler üretti. /mediaYalnızca bir alt dizine monte ederek ve set seçenekleri / grup kimliği desteğini çekirdek seçenekleri aracılığıyla kapatarak çalışırlar . Burada Seçenekler şunlardır udisks, udisks2, pmount, usbmount,

Gerekirse, benzer bir şey yapmak için kendi betiğinizi yazabilir ve onu sudo aracılığıyla çağırabilirsiniz - ancak kök istismarlar bırakmamak için bu betiği yazarken çok dikkatli olmalısınız. Kullanıcılarınızın sudo'yu hatırlamalarını istemiyorsanız, bir komut dosyasında böyle bir şey yapabilirsiniz:

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

# rest of script goes here 

Güvende olacak bir gün yol: kullanıcı ad alanları

Linux ad alanları, çok hafif bir sanallaştırma biçimidir (daha belirgin olmak üzere kapsayıcılar). Özellikle, kullanıcı ad alanları ile sistemdeki herhangi bir kullanıcı, kendi köklerini oluşturduğu kendi ortamını oluşturabilir. Bu, birkaç sanal dosya sistemi dışında açıkça engellenmiş olması dışında dosya sistemlerini monte etmelerini sağlar. Sonunda, FUSE dosya sistemlerine muhtemelen izin verilecek, ancak bulabildiğim en son yamalar blok cihazlarını, sadece sshfs gibi şeyleri kapsamıyor.

Ayrıca, birçok dağıtım çekirdeği (güvenlik nedeniyle) imtiyazsız kullanıcıların kullanıcı ad alanlarını kullanmalarına izin vermemek için varsayılanlara sahiptir; örneğin Debian , kernel.unprivileged_userns_clonevarsayılan olarak 0'dır. Diğer dağıtımlar, genellikle biraz farklı adlarla olsa da, benzer ayarlara sahiptir.

Kullanıcı ad alanları hakkında bildiğim en iyi dokümantasyon işlemdeki Ad Alanları adlı bir LWN makalesidir , bölüm 5: Kullanıcı ad alanları .

Şimdilik udisks2 ile giderdim.


Cevabınız için teşekkürler! BTW, gruptaki kullanıcıların mountroot gibi dosya sistemlerini bağlayabilmelerinin güvenli olduğunu düşünüyor musunuz? Bağladığınız ad alanları belgesini okuyacağım ve bu mount grup olayını, en azından bir alıştırma olarak uygulamaya çalışacağım.

@gkya İlk bölümümün, (a) nosuid [ve ayrıca nodev] zorlamadan bir dosya sisteminin kurulmasına izin verdiğini açıkça ortaya koyduğunu umuyorum; veya (b) isteğe bağlı bir yerde temel olarak kök veriyor. Birine rastgele mountkomut çalıştırması için izin verirseniz , bu root kullanımıyla aynıdır.
derobert

Gkya'dan "her biri üzerinde birçok bölüme sahip olan çok sayıda çıkarılabilir sürücü" başka bir cevaba yorum yaptığında, "udisks veya benzeri" bir yaklaşım isteyeceğini tahmin ediyorum.
derobert

1
@derobert, kullanıcı ad alanlarından bahsettiğinden beri, Plan Lab'ı Bell Labs'tan (aynı kişiler tarafından yapılan UNIX'in halefi) kontrol etmek isteyebilirsin. dosya ağacını işlem başına bir ad alanı olarak modeller (ve root diye bir şey yoktur). büyüleyici şeyler.
strugee,

1
@ malan Tamam, ben güncelledik. Bir şey olursa, bunun için kullanıcı ad alanlarını kullanmanın daha da ileride göründüğünü düşünüyorum.
derobert,

16

Bunu yapabilirsiniz, ancak girişi /etc/fstab, eklemek istediğiniz dosya sistemine karşılık gelecek şekilde değiştirmeniz ve bayrağa userbu girişi eklemeniz gerekir . Ayrıcalıklı olmayan kullanıcılar daha sonra bunları bağlayabilecektir.

Daha man mountfazla ayrıntı için bakınız.


1
Bu googling ile bulabildiğim tek cevap. FreeBSD'de kullanıcıların bir değişken (yani vfs.usermount) ayarlayarak dosya sistemlerini bağlamalarına izin verebileceğini öğrendim . Sth istiyorum buna benzer. Her birinde birçok bölüm bulunan birçok çıkarılabilir sürücü kullanıyorum ve her biri için fstab'a bir düzine ya da iki giriş eklemek çok zor olurdu.

Çirkin geçici çözüm udev, yeni aygıtlar görünüp kaybolurken girişleri yönetmeye izin vermek olabilir .
Jester

Bunu Mint veya Ubuntu'da çalışacak şekilde bulamadım. Evet, varsayılan kullanıcı hesabı kök olmadan bağlanabilir, ancak 'standart' / 'masaüstü' kullanıcıları bunu bağlayamaz.
johny neden

6

Burada , root olmayan (örneğin kullanıcılar) bir gruba göre bölümleri monte etmek amacıyla udisks / udisks2 için polkit kurallarını yapılandırma wiki var .

Aşağıdaki kodu /etc/polkit-1/rules.d/50-udisks.rules dosyasına kaydedin.

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];
  }
});

Bir bölümü monte etmek için aşağıdaki komutu kullanarak (sudo gerektirmez), "users" grubunda olduğunuzu varsayalım.

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

# udisks
udisks --mount /dev/sda1

2
Gitmenin yolu gibi görünüyor ama benim için işe yaramadı.
Stéphane Gourichon

5

1 Nerede çalıştığına bakın

Xubuntu'da USB yığın depolama alanını, sabit disk bölümlerini, CD / DVD'leri ve muhtemelen daha fazlasını takmak ve çıkarmak için kutunun dışında çalışır.

Ubuntu'nun policyKit'i kullanarak seçtiği çözümün yeterince güvenli olduğunu varsayalım.

2 İlgili parçayı seçin

Debian 8.3'teki XFCE'de Kullanıcının dosya sistemlerini şifrelenmeden thunar'a takmasına ve çıkarmasına izin vermem gerekiyordu. Benim için işe yarayan şey Ubuntu'dan bir izin dosyası almak.

Aşağıdaki satırları root olarak adlandırılmış bir dosyaya eklemek /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pklahileyi yapmalıdır:

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

(Aslında yaptığım şey, Ubuntu 16.04'te aynı adı taşıyan dosyadan biraz daha fazla seçmek ve benim için işe yaradı. İhtiyacınız olursa, çoğunlukla https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 içeriğine benziyor. )


Sadece bu debian benzeri sistemlerde çalışır, neden / etc / 'ye kural koymanın işe yaramadığını bilmez.
Anwar

Debian streç üzerinde çalışmaz.
Philipp Ludwig

1
XFCE'de Debian Buster'da Çalışıyor! Teşekkürler!
Maxwel Leite

3

sudoBir dizi kullanıcının mountkomutu çalıştırmasına izin verecek şekilde yapılandırabilirsiniz .

Güncelleme : bir sisteme montaj yaparak nasıl zarar verebileceğinize dair Örneğin, kök ayrıcalıkları elde etmek için daha sonra bağlayıp uygulayabileceğiniz bir dosya sisteminde setuid kök kabuğu oluşturabilirsiniz.


Bunu düşündüm, ama bu kullanıcının komutu çalıştırmasını gerektirmiyor sudomu? Ayrıca, bu yöntemi kullanarak dosya sistemini sadece sahnelerin arkasına yerleştiren kök kullanıcı değil mi?

Evet, sudo'ya ihtiyaç duyacaklardı ve evet de root adına çalışacaktı. İlk sorunu çözmek için, bir sarmalayıcı komut dosyasının diğer adını mountkullanabilir sudo mountveya kullanabilirsiniz.
Jester

Sahip olduğum şey, dosya sistemini kök kullanıcının ajansı olmadan monte etmektir. Bu ajansı hiçbir şeyle maskelemek, peşinde olduğum şey değil.

userFstab'a eklemenin bile işe yaradığını unutmayın çünkü mountsetuid root. Çekirdek kök veya CAP_SYS_ADMINkabiliyeti kontrol eder, bu yüzden kök ile ilgili gerçekten bir şey yapamazsınız.
Jester

Yapılandırabilirsiniz nasıl? Bu yardımcı olmuyor.
Nuzzolilo

0

Sorunuzu parantez içinde cevaplamak için, bir dosya sistemi dosyalar için bir yer tutucu olduğundan, bir kullanıcı potansiyel olarak dosyaları silmek gibi dosya sistemleri üzerinde zararlı işlemler gerçekleştirebilir.

Diğer 2 soruyu özetleyerek şunu söyleyeceğim:

  • fstabÖnyükleme sırasında kalıcı depolama için montaj için mükemmeldir . USB sürücüleri takmak veya ara sıra bazı ağ paylaşımlarını bağlamak istediğinizde bu harika değildir.

  • sudo mountubuntu * sistemlerinde iseniz de yolunda. Yine de bir şifre girmeniz gerekecek.

  • udev ubuntu * sistemlerinde usb bellekler, kameralar ve flash kartlar gibi şeylerin montajına dikkat edecektir (ancak debian, slackware, vb. gibi daha az kullanıcı dostu dağıtımlarda değil)

Tarihsel olarak, bazı kullanıcılara (veya gruplara) bir şeyler yapma yetkisi vermenin unix yolunun sudoersdosya üzerinden geçtiğini ekleyeceğim .

Orada kullanmak için MANY kılavuzları vardır, bu yüzden herhangi bir özel önermeyeceğim. Bunu öğrenmek için Linux dokümantasyon projesi web sitesini kullandığımı söyleyeceğim.

Dahası, sudoersaygıtları ve paylaşımları şeffaf bir şekilde monte edebilmenizdir - eğer bir şifre belirtmeden bile (bunun için çok dikkatli olun).

Genelde kontrol ortamında yaptığım şey sudoers, belirli gruptaki kullanıcıların ağ paylaşımlarını şeffaf bir şekilde bağlamalarına izin vermek için dosya kullanmamdır . Bu yüzden "kullanıcı bir istemci terminalinde oturum açtığında kullanıcının ana klasörünü bir ağ dosya sunucusundan bağla" gibi işlemlere izin veren komutları mount.nfsve mount.cifssudoers dosyasına ekliyorum ve bunun gibi çalışıyorum.


1
Kullanıcının giriş klasörünü kullanıcının giriş klasörüne eklemesine izin vermek için sudo kullanıyorsanız, autofs dosyasına bakmalısınız.
derobert,

Bunları birlikte kullanırım; Dosya sunucusundan istemci bilgisayardaki konuma autofsmontaj yapmak için tek başına nasıl kullanılacağını çözemedim . /home/$USER/home/$USER/fromFS/
nass

0

guestmount libguestfs hile

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

Güveniyor:

  • dosya sistemlerinin kullanıcı uygulaması
  • SİGORTA

Dokümanlar: http://libguestfs.org/guestmount.1.html

Ubuntu 18.04'te test edilmiştir, libguestfs-tools 1: 1.36.13-1ubuntu3.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.