Jak zezwolić nie-superużytkownikom na zamontowanie dowolnego systemu plików?

47

Czy można zezwolić niektórym określonym użytkownikom (np. Członkom grupy) na montowanie dowolnego systemu plików bez uprawnień administratora w systemie Linux?

Innym pytaniem mogło być: „w jaki sposób użytkownik może uszkodzić system, montując systemy plików?”

Ciro Santilli
źródło
Możegvfs-mount-d /dev/sdX
KrisWebDev
powiązane unix.stackexchange.com/questions/20838/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

44

Istnieje kilka podejść, niektóre z nich są w większości bezpieczne, inne wcale.

Niebezpieczny sposób

Niech każde użycie będzie działać mount, np. Przez sudo. Równie dobrze możesz dać im korzeń; to jest to samo. Użytkownik może zamontować system plików z bashsuidową kopią root- run, która natychmiast daje root (prawdopodobnie bez żadnego logowania, poza faktem, że mountzostał uruchomiony).

Alternatywnie, użytkownik może zamontować swój własny system plików na nim /etc, zawierający własną kopię /etc/shadowlub /etc/sudoers, a następnie uzyskać root za pomocą sulub sudo. Lub ewentualnie bind-mount ( mount --bind) na jednym z tych dwóch plików. Lub nowy plik do /etc/sudoers.d.

Podobne ataki można było przeprowadzić w /etc/pam.dwielu innych miejscach.

Pamiętaj, że systemy plików nie muszą nawet znajdować się na urządzeniu, -o loopzamontuje plik, który jest własnością (a zatem może być modyfikowany) przez użytkownika.

Najbardziej bezpieczny sposób: udisk lub podobny

Różne środowiska pulpitu mają już wbudowane rozwiązania tego problemu, aby umożliwić użytkownikom montowanie nośników wymiennych. Działają one poprzez montowanie w podkatalogu /mediaonly i przez wyłączenie obsługi set-user / group-id poprzez opcje jądra. Opcje tu m.in. udisks, udisks2, pmount, usbmount,

Jeśli musisz, możesz napisać własny skrypt, aby zrobić coś podobnego i wywołać go przez sudo - ale musisz bardzo uważnie pisać ten skrypt, aby nie pozostawić exploitów root. Jeśli nie chcesz, aby użytkownicy pamiętali sudo, możesz zrobić coś takiego w skrypcie:

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

# rest of script goes here 

Pewnego dnia będzie bezpieczny: przestrzenie nazw użytkowników

Przestrzenie nazw systemu Linux są bardzo lekką formą wirtualizacji (ściślej mówiąc, kontenerami). W szczególności dzięki przestrzeniom nazw użytkowników każdy użytkownik w systemie może stworzyć własne środowisko, w którym jest rootem. Umożliwiłoby to im montowanie systemów plików, z wyjątkiem tego, że zostało wyraźnie zablokowane, z wyjątkiem kilku wirtualnych systemów plików. W końcu systemy plików FUSE prawdopodobnie będą dozwolone, ale najnowsze łatki, które mogłem znaleźć , nie obejmują urządzeń blokowych, tylko takie rzeczy jak sshfs.

Ponadto wiele jąder dystrybucji domyślnie (ze względów bezpieczeństwa) nie zezwala nieuprzywilejowanym użytkownikom na używanie przestrzeni nazw użytkowników; na przykład Debian ma wartość kernel.unprivileged_userns_clonedomyślną 0. Inne dystrybucje mają podobne ustawienia, choć często o nieco innych nazwach.

Najlepsza dokumentacja, jaką znam na temat przestrzeni nazw użytkowników, to artykuł LWN Działające przestrzenie nazw, część 5: Przestrzenie nazw użytkowników .

Na razie wybrałbym udisks2.

derobert
źródło
Dzięki za odpowiedź! BTW, czy uważasz, że bezpieczne jest umożliwienie użytkownikom w grupie mountmontowania systemów plików tak jak root? Przeczytam dokument przestrzeni nazw, który podłączyłeś, i spróbuję zaimplementować tę grupę montowania, przynajmniej jako ćwiczenie.
@gkya Mam nadzieję, że moja pierwsza sekcja wyjaśniła, że ​​zezwalając na (a) montowanie systemu plików bez wymuszania nosuid [a także nodev]; lub (b) w dowolnym miejscu zasadniczo daje root. Jeśli dasz komuś pozwolenie na uruchamianie dowolnych mountpoleceń, będzie to równoznaczne z udzieleniem roota.
derobert
@ gkya z twoich „wielu dysków wymiennych z wieloma partycjami na każdym” komentuje inną odpowiedź, domyślam się, że chcesz podejścia „udisk lub podobnego”.
derobert
1
@derobert, skoro mówisz o przestrzeniach nazw użytkowników, możesz wypróbować Plan 9 z Bell Labs (to następca UNIX, stworzony przez te same osoby). modeluje drzewo plików jako przestrzeń nazw dla poszczególnych procesów (i nie ma czegoś takiego jak root). fascynujące rzeczy.
strugee
1
@malan OK, zaktualizowałem to. Jeśli już, to myślę, że korzystanie z przestrzeni nazw użytkowników jest jeszcze bardziej przyszłościowe.
derobert
16

Możesz to zrobić, ale musisz zmodyfikować wpis w /etc/fstabsystemie plików, który chcesz zamontować, dodając flagę userdo tego wpisu. Użytkownicy nieuprzywilejowani mogliby wtedy go zamontować.

Zobacz man mountpo więcej szczegółów.

MBR
źródło
1
To jedyna odpowiedź, jaką mogę znaleźć w google. Dowiedziałem się, że we FreeBSD można zezwolić użytkownikom na montowanie systemów plików poprzez ustawienie zmiennej (mianowicie vfs.usermount). Chcę czegoś analogicznie do tego. Używam wielu dysków wymiennych z wieloma partycjami na każdej i byłoby kłopotliwe, aby dodać kilkanaście lub dwa wpisy do fstab dla każdej z nich.
Brzydkim obejściem może być udevzarządzanie wpisami, gdy nowe urządzenia pojawiają się i znikają.
Jester
nie znalazłem tego do pracy na Mint lub Ubuntu. Tak, domyślne konto użytkownika może zostać zamontowane bez roota, ale zwykli użytkownicy / użytkownicy komputerów nie mogą go zamontować.
John, dlaczego
6

Oto wiki do konfigurowania reguł polkit dla udisks / udisks2 w celu montowania partycji przez grupę inną niż root (np. Użytkownicy).

Zapisz poniższy kod do /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];
  }
});

Załóżmy, że należysz do grupy „users”, korzystając z następującego polecenia, aby zamontować partycję (nie trzeba sudo).

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

# udisks
udisks --mount /dev/sda1
Miauczeć
źródło
2
Wygląda na to, jak iść, ale nie działało dla mnie.
Stéphane Gourichon
5

1 Zobacz, gdzie to działa

Na Xubuntu działa od razu po zainstalowaniu i wysunięciu pamięci masowej USB, partycji dysku twardego, płyt CD / DVD i prawdopodobnie więcej.

Załóżmy, że rozwiązanie, które wybrał Ubuntu, używając policyKit, jest wystarczająco bezpieczne.

2 Wybierz odpowiednią część

W XFCE na Debianie 8.3 musiałem pozwolić użytkownikowi na montowanie i usuwanie systemów plików z Thunara bez hasła. To, co zadziałało, to wybranie pliku uprawnień z Ubuntu.

Dodanie poniższych wierszy jako katalogu głównego do pliku o nazwie /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pklapowinno załatwić sprawę:

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

(To, co zrobiłem, to wybrałem trochę więcej z pliku o tej samej nazwie na Ubuntu 16.04 i zadziałało to dla mnie. Jeśli potrzebujesz, wygląda to raczej na zawartość https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )

Stéphane Gourichon
źródło
Tylko to działa w systemach podobnych do Debiana, nie wiem, dlaczego umieszczanie reguł w / etc / nie działało.
Anwar
Nie działa na odcinku debian.
Philipp Ludwig
1
Działa w Debian Buster na XFCE! Dzięki!
Maxwel Leite
3

Można skonfigurować, sudoaby zezwolić zestawowi użytkowników na uruchamianie mountpolecenia.

Aktualizacja : w jaki sposób możesz uszkodzić system przez montaż? Na przykład możesz utworzyć setuid root shell w systemie plików, który możesz następnie zamontować i wykonać, aby uzyskać uprawnienia roota.

Błazen
źródło
Myślałem o tym, ale czy nie będzie to wymagało od użytkownika uruchomienia polecenia sudo? Czyż nie jest to użytkownik root instalujący system plików, tylko za kulisami, za pomocą tej metody?
Tak, potrzebowaliby sudo i tak, to działałoby w nazwie roota. Aby rozwiązać ten pierwszy numer, można alias mountdo sudo mountlub użyć skryptu wrapper.
Jester
Chciałbym zamontować system plików bez pośrednictwa użytkownika root. Maskowanie tej agencji czymkolwiek nie jest wcale tym, czym jestem.
Zauważ, że nawet dodawanie userdo fstab działa tylko dlatego, że mountjest to root setuid. Jądro sprawdza rootowanie lub CAP_SYS_ADMINmożliwości, więc tak naprawdę nie można się obejść z udziałem roota.
Jester
Możesz skonfigurować, jak? To nie pomaga.
Nuzzolilo
0

Aby odpowiedzieć na twoje pytanie w nawiasie, ponieważ system plików jest symbolem zastępczym dla plików, użytkownik może potencjalnie wykonać szkodliwe operacje na tym systemie plików, takie jak usuwanie plików.

Podsumowując pozostałe 2 pytania, powiem to:

  • fstabdoskonale nadaje się do montażu w czasie rozruchu trwałego przechowywania. Nie jest to świetne, gdy chcesz podłączyć dyski USB lub od czasu do czasu zamontować niektóre udziały sieciowe.

  • sudo mountjest również w porządku, jeśli korzystasz z systemów Ubuntu *. Jednak nadal będziesz musiał wpisać hasło.

  • udev zajmie się montowaniem takich elementów jak pamięci USB, aparaty i karty flash w systemach Ubuntu * (ale nie w mniej przyjaznych dla użytkownika dystrybucjach, takich jak debian, slackware itp.)

Dodam, że historycznie, uniksowy sposób nadawania uprawnień niektórym użytkownikom (lub grupom) do robienia rzeczy odbywa się poprzez sudoersplik.

Istnieje WIELE poradników, jak go używać, więc nie będę sugerował żadnych szczegółów. Powiem, że skorzystałem z witryny projektu dokumentacji Linuksa, aby się o tym dowiedzieć.

Co więcej sudoers, możesz montować urządzenia i udostępniać w przejrzysty sposób - nawet bez podania hasła, jeśli zdecydujesz się to zrobić (bądź bardzo ostrożny).

To, co zwykle robię w środowisku kontrolnym, to użycie sudoerspliku, aby umożliwić użytkownikom określonej grupy przezroczyste montowanie udziałów sieciowych. Dodałem więc polecenia mount.nfsi mount.cifsplik sudoers, które zezwalają na takie operacje, jak „zamontowanie folderu domowego użytkownika z sieciowego serwera plików, gdy użytkownik loguje się na terminalu klienta” i tak dalej.

nass
źródło
1
Jeśli używasz sudo, aby umożliwić użytkownikowi montowanie folderów domowych podczas logowania, powinieneś spojrzeć na autofs.
derobert
Używam ich razem; Nie mogłem wymyślić, jak autofssamemu użyć do zamontowania /home/$USERserwera plików w lokalizacji /home/$USER/fromFS/na komputerze klienckim.
nass 18.10.13
0

guestmount oszustwo 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

Polega na:

  • implementacja systemów plików dla użytkowników
  • BEZPIECZNIK

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

Testowany na Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3.

Ciro Santilli
źródło