Jak zezwolić użytkownikom na przesyłanie plików do innych użytkowników w systemie Linux

10

Mamy środowisko kilku tysięcy użytkowników uruchamiających aplikacje na około 40 klastrach o wielkości od 20 węzłów obliczeniowych do 98 000 węzłów obliczeniowych. Użytkownicy tych systemów generują ogromne pliki (czasami> 1PB) kontrolowane przez tradycyjne uprawnienia uniksowe (listy ACL zwykle nie są dostępne lub praktyczne ze względu na specjalistyczny charakter systemu plików).

Obecnie mamy program o nazwie „daj”, który jest programem typu suid-root, który pozwala użytkownikowi „dać” plik innemu użytkownikowi, gdy uprawnienia grupy są niewystarczające. Tak więc użytkownik wpisałby coś takiego jak poniższy, aby przekazać plik innemu użytkownikowi:

> give username-to-give-to filename-to-give ...

Odbiorca może następnie użyć polecenia o nazwie „take” (część programu podającego), aby otrzymać plik:

> take filename-to-receive

Uprawnienia do pliku są następnie skutecznie przekazywane do użytkownika odbierającego.

Ten program istnieje od lat i chcielibyśmy ponownie przyjrzeć się rzeczom z punktu widzenia bezpieczeństwa i funkcjonalności.

Nasz obecny plan działania polega na usunięciu zgnilizny w naszej obecnej implementacji „daj” i spakowaniu jej jako aplikacji typu open source, zanim ponownie wdrożymy ją do produkcji.

Czy ktoś stosuje inną metodę przesyłania bardzo dużych plików między użytkownikami, gdy dostępne są tylko tradycyjne uprawnienia uniksowe?

Jon Bringhurst
źródło
1
Czy istnieje jakiś powód, dla którego nie można po prostu utworzyć katalogu udostępnionego, do którego wszyscy użytkownicy mają dostęp?
Zoredache,
1
Jeśli istnieje katalog z dostępem współdzielonym, użytkownicy bez pozwolenia mieliby dostęp do plików podczas ich udostępniania. W tym środowisku czasami nazwy plików również są wrażliwe. Niestety, udostępniony katalog nie jest opcją. Dzięki udostępnionemu katalogowi istnieje również możliwość manipulowania plikiem przez trzeciego użytkownika.
Jon Bringhurst,
Czy nie byłoby wystarczające, aby zadanie crona kopiowało same pliki? Przykład: użytkownik foo chce nadać pasek plików szczeniakowi użytkownika. tworzy więc wyspecjalizowany katalog, który jest skanowany przez zadanie crona z plikiem „kontrolnym” zawierającym odbieranie nazwy użytkownika. Zadania cron odczytałyby ten plik „kontrolny”, jeśli użytkownik ma OK, w katalogu docelowym jest miejsce, OK, kopia. Nadal możesz utworzyć opakowanie dla opcji „daj”, aby po prostu utworzyć plik „kontrolny” w celu zapewnienia zgodności historycznej. Nie potrzebujesz suid-root, możesz skopiować ten plik jako użytkownik inny niż root, a następnie sudo w celu zmiany właściciela.
jirib,
Jeśli chcesz tylko zmienić uprawnienia, chownzrób to. Wygląda na to, że chcesz również skopiować plik, gdy obie zaangażowane strony wyrażą na to zgodę.
zebediah49
@JiriXichtkniha Podoba mi się pomysł pliku kontrolnego i zadania cron. Pliki są jednak zbyt duże, aby je skopiować.
Jon Bringhurst

Odpowiedzi:

1

Jeśli emiter naprawdę chce oddać plik, możesz użyć pliku binarnego SUID, który przenosi plik do katalogu, w którym wszyscy mogą zapisywać i ma lepki bit (jak /tmp), a następnie zmienia właściciela na nowego właściciela. chown(3)już dba o usunięcie set-user-IDi set-group-IDbitów dla ciebie. W ten sposób nowy właściciel może robić, co chce, z plikiem, w tym przenosić go.

Ten katalog do zapisu dla wszystkich może należeć do katalogu domowego użytkownika, na wypadek, gdybyś chciał używać wielu systemów plików dla katalogów domowych i chciałby się upewnić, że nie przekroczysz granic systemu plików, ponieważ wydajność byłaby natychmiast straszna. W takim przypadku prawdopodobnie będziesz chciał się upewnić, że odbiorca wie, kiedy oferowany jest nowy plik.

E-maile załatwiłyby sprawę. Bardziej uniksowym rozwiązaniem byłoby wyświetlenie /etc/profilelisty nowo dostarczonych plików. Dodano bonus, jeśli oferujesz tę funkcję za pomocą pam_echo( np. Za pomocą file=/tmp/deliveries/%u, zobacz pam_echo(8)). Podobnie jak w przypadku wszystkich elementów związanych z PAM, należy najpierw sprawdzić, czy wszystkie implementacje oferują taki moduł.

Pierre Carrier
źródło
0

Możesz użyć systemu ze wspólnym katalogiem (prawdopodobnie bez uprawnień do wykonywania), w którym rzeczy dla danego użytkownika są archiwizowane z określoną strukturą nazw plików ( to-$username_from-$username.tarna przykład). Daj sprawia, że ​​plik i chownsto do użytkownika docelowego; take wypakowuje plik i usuwa go.

Jeśli chcesz to zrobić jako ruch (IE, zmiana lokalizacji pliku i uprawnień; brak kopiowania ze względu na olbrzymi rozmiar pliku), możesz być w stanie uciec od przejścia do wspólnego katalogu z -x perms (więc nikt nie może lista plików) i ta sama chownmetoda. mv, chown/ mv.

zebediah49
źródło
0

Jak mówi xryl669, możesz używać katalogu do faktycznego udostępniania plików. To powinno wyglądać tak:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

Komenda daje

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

Polecenie take wygląda mniej więcej tak:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~
miniBill
źródło
0

Proponuję przepisać aplikację, aby naśladować „dawać” i „brać”, ale raczej „wypychać” i „wyciągać” ją z chronionego katalogu. Twój katalog może być dostępny tylko dla aplikacji push / pull, która obsługuje ruchy plików. Alternatywnie, twoja aplikacja / skrypt może utworzyć losowy, tymczasowy katalog z ustawieniami uprawnień tylko dla nadawcy i odbiorcy.

Chcesz mieć większe bezpieczeństwo? Możesz PGP zaszyfrować / podpisać plik (używając klucza publicznego odbiornika).

Jeśli chodzi o ponawianie go z „bezpieczeństwa i funkcjonalnego punktu widzenia”, zdecydowanie zalecam, aby nie tworzyć programów SUID. Jeśli nie upuścisz uprawnień we właściwy sposób, możesz wirtualnie uzyskać dostęp do dowolnego pliku w systemie. Jeśli twój program jest wadliwy (przepełnienie bufora itp.) - można to wykorzystać, aby uzyskać dostęp do roota w systemie.

ndrix
źródło
0

Prawdopodobnie nie przydaje ci się to, ale w celach informacyjnych cp - źródło źródłowe reflink wykonuje cienkie kopie plików przy użyciu funkcji kopiowania podczas zapisu.

Oznacza to, że możesz bezpośrednio skopiować plik i tylko zmienione bloki zostaną skopiowane. W odróżnieniu od twardego łącza nowy plik ma własną i-węzeł i metadane, co oznacza, że ​​możesz następnie dostarczyć kopię pliku nowemu użytkownikowi przy użyciu standardowych plików.

O ile mi wiadomo, jest to funkcja dostępna obecnie tylko w OCFS2 i btrfs. Myślę, że to rozwiązuje twój problem, ale ponieważ jego dostępność nie jest powszechna, prawdopodobnie nie będzie przydatna.

Matthew Ife
źródło