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?
źródło
chown
zrób to. Wygląda na to, że chcesz również skopiować plik, gdy obie zaangażowane strony wyrażą na to zgodę.Odpowiedzi:
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ęcieset-user-ID
iset-group-ID
bitó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/profile
listy nowo dostarczonych plików. Dodano bonus, jeśli oferujesz tę funkcję za pomocąpam_echo
( np. Za pomocąfile=/tmp/deliveries/%u
, zobaczpam_echo(8)
). Podobnie jak w przypadku wszystkich elementów związanych z PAM, należy najpierw sprawdzić, czy wszystkie implementacje oferują taki moduł.źródło
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.tar
na przykład). Daj sprawia, że plik ichowns
to 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
chown
metoda.mv
,chown
/mv
.źródło
Jak mówi xryl669, możesz używać katalogu do faktycznego udostępniania plików. To powinno wyglądać tak:
Komenda daje
Polecenie take wygląda mniej więcej tak:
źródło
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.
źródło
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.
źródło