objaśnienie specyfikacji chown (1) POSIX


18

Specyfikacja POSIX chownnarzędzia wspomina w sekcji uzasadnienia o chown user:groupskładni (dawniej chown user.group) (moje wyróżnienie):

Metoda 4.3 BSD określająca zarówno właściciela, jak i grupę została uwzględniona w tym tomie POSIX.1-2008, ponieważ:

  • Są przypadki, w których pożądany warunek końcowy nie mógł zostać osiągnięty za pomocą narzędzi chgrp i chown (które tylko zmieniły identyfikator użytkownika). (Jeśli bieżący właściciel nie jest członkiem żądanej grupy, a żądany właściciel nie jest członkiem bieżącej grupy, funkcja chown () może się nie powieść, chyba że zarówno właściciel, jak i grupa zostaną zmienione w tym samym czasie).

Myślałem, że user:groupskładnia jest wygodna. Teraz powyższe implikuje, że są rzeczy, które możesz zrobić, z chown user:groupktórymi nie możeszchgrp group; chown user

Teraz ten tekst nie ma dla mnie sensu. W 4.3BSD tylko root może zmienić właściciela pliku, więc w żadnym wypadku nie ma ograniczeń co do tego, co może zrobić.

SysV i kilka innych systemów zezwala (lub pozwala) właścicielowi pliku na zmianę użytkownika i grupy plików na cokolwiek, ale nawet w tych systemach ten tekst powyżej nie ma dla mnie sensu. OK, jeśli ktoś to zrobi chown someone-else the-file, nie da się tego zrobić chgrp something-else the-filepóźniej, ponieważ nie jest już właścicielem pliku, ale nic nie stoi na przeszkodzie, aby zrobił to chgrppierwszy (pozostając właścicielem pliku) i chownpóźniej, i to nie jest to powyższy tekst dokładnie mówi.

Nie rozumiem, co ten i pożądany właściciel nie jest członkiem bieżącej grupy, ma związek z tym problemem.

Więc jakie są warunki, dla których funkcja chown () może zawieść, chyba że zarówno właściciel, jak i grupa zostaną zmienione w tym samym czasie i w jakim systemie?


1
@Robert, w jakim systemie obowiązywałyby te zasady? W systemach, które znam, albo jesteś rootem i możesz robić, co chcesz, lub nie jesteś użytkownikiem1 i nie możesz nic zrobić. Jeśli jesteś użytkownikiem 1, w zależności od systemu, albo nie możesz zmienić właściciela, albo, jeśli możesz, możesz zmienić grupę na cokolwiek zechcesz, a następnie użytkownika na cokolwiek zechcesz.
Stéphane Chazelas

Jeśli mam w katalogu, którego jestem właścicielem, plik należący do kogoś innego i grupy, do której nie należę, ale mogę czytać z powodu innych uprawnień. Następnie mogę skopiować go, aby uczynić mnie właścicielem, i ma on nową grupę (do której należę). Dlatego musi być tak samo bezpieczne dla systemu operacyjnego, aby zezwalać mi na to, że nie jestem rootem, chown me:my-group filejeśli plik znajduje się w lokalizacji, w której mam dostęp do odczytu / zapisu (nie jest lepki). Najpierw nie mogłem chgrp jako nie właściciela. Nie mogłem pierwszy zrobić, ponieważ spowodowałoby to utworzenie pliku, którego nie mogłem utworzyć: jestem właścicielem pliku z grupą, do której nie należę.
ctrl-alt-delor

@richard, nie, to nie byłoby tak bezpieczne . Ten plik może być dowiązany do innego katalogu, do którego nie masz dostępu. W systemach, w których możesz łączyć pliki, których nie jesteś właścicielem (domyślnie Linux), oznacza to, że możesz rościć sobie prawo własności do dowolnego pliku, łącząc go z katalogiem, do którego masz prawa zapisu.
Stéphane Chazelas

Znalazłem ten tekst, wyjaśnia również, dlaczego się mylę (nie jest tak bezpieczny): „Jeśli pozwolono Ci przywłaszczyć plik, byłaby to dziura w zabezpieczeniach. Na przykład użytkownik może otworzyć plik, a następnie zweryfikować jego własność i uprawnienia (wywołując fstat na uchwycie otwartego pliku) i stwierdzić, że tylko program działający jako ktoś mógł wygenerować te dane. Jeśli uda ci się przywrócić
ctrl-alt-delor

Odpowiedzi:


5

Microsoft Interix podsystem Unix (obecnie na emeryturze) do jej jądra NT traktowane trochę inaczej z uprawnieniami użytkowników i grup niż niektórzy inni:

Informacje o użytkownikach i grupach są przechowywane w bazie danych Security Access . Zarówno użytkownicy, jak i grupy są przechowywane w tej samej bazie danych, ale nazwy grup i użytkowników muszą być unikalne; żadna grupa nie może mieć nazwy użytkownika i odwrotnie. (Ta baza danych zastępuje pliki /etc/passwdi /etc/groupsw systemie UNIX.) Użytkownicy i grupy są tworzone przy użyciu odpowiedniej metodologii Windows (Menedżer użytkowników, Użytkownicy i komputery usługi Active Directory lub Użytkownicy i grupy lokalne) lub za pomocą net userpolecenia Win32 . (Przykładowe skrypty powłoki do tworzenia i usuwania użytkowników znajdują się w katalogu /usr/examples/admin.) Użytkownicy mogą należeć do wielu grup.

Oto kilka bardziej szczegółowych fragmentów instrukcji:

W systemie Windows użytkownik lub grupa może być właścicielem obiektu. Różni się to od systemu UNIX, w którym tylko użytkownik jest właścicielem obiektu.

Windows wewnętrznie identyfikuje wszystkich użytkowników i grupy za pomocą identyfikatora bezpieczeństwa (SID) . Algorytm mieszający generuje unikalne wartości SID; żaden z dwóch użytkowników lub grup nie będzie miał tego samego identyfikatora SID.

Użytkownicy i grupy, które mają uprawnienia dostępu do obiektu, są identyfikowane przez SID. Wszystkie obiekty, które można zabezpieczyć przez system Windows, mają dowolną listę kontroli dostępu (DACL), która składa się z oddzielnych pozycji zwanych pozycjami kontroli dostępu (ACE). Lista ACE zawiera dwie ważne informacje: identyfikator SID użytkownika lub grupy oraz opis, jaki dostęp do obiektu ma dany użytkownik lub grupa.

CHGRP

... Zmień identyfikator grupy dla pliku ... użytkownik wywołujący chgrp (1) musi należeć do określonej grupy i być właścicielem pliku lub mieć odpowiednie uprawnienia.

CHOWN

... Operandy właściciela i grupy są opcjonalne; należy jednak podać jedno. Jeśli operand grupy jest określony, musi być poprzedzony dwukropkiem (:).

Właściciel może być określony przez numeryczny identyfikator użytkownika lub nazwę użytkownika. Jeśli nazwa użytkownika jest również numerycznym identyfikatorem użytkownika, operand jest używany jako nazwa użytkownika. Grupa może być numerycznym identyfikatorem grupy lub nazwą grupy. Jeśli nazwa grupy jest także numerycznym identyfikatorem grupy, operand jest używany jako nazwa grupy.

Ze względów bezpieczeństwa własność pliku można zmienić tylko przez proces z odpowiednimi uprawnieniami.

Jak czytam, oznacza to, że jeśli twoje konto użytkownika należy do grupy Windows z wystarczającymi uprawnieniami do modyfikowania uprawnień do pliku, który jest własnością tej grupy, możliwe jest skuteczne działanie chgrptego pliku poza kontrolą konta użytkownika. Sprowadza się to do mniejszej kontroli niż możesz przy chownwyraźnych user:groupparametrach. W tym kontekście bez możliwości zadeklarowania user: i :group nigdy nie można osiągnąć takich samych wyników, jak w innym przypadku.

Oto link do szczegółowego spojrzenia na interakcję Interixa z listami ACL systemu Windows, z naciskiem na to, jak taka wiedza może mieć zastosowanie do systemów plików Samby w innych wariantach Uniksa.

Oto link do przestarzałego dokumentu Solaris opisującego przestrajanie, rstchownktóre ...

Wskazuje, czy semantyka POSIX dla chown(2)wywołania systemowego obowiązuje ...

Najwyraźniej jeśli parametr jest ustawiony na wartość 0...

... wyłączenie semantyki POSIX otwiera potencjał dla różnych luk bezpieczeństwa. Otwiera to również możliwość zmiany właściciela pliku na innego użytkownika i niemożności odzyskania pliku bez interwencji użytkownika lub administratora systemu.

Taka opcja nie unieważnia zgodności POSIX z Solaris . Tylko to, że jest to opcja, kwalifikuje ją jako zgodną :

Chociaż wszystkie implementacje zgodne z POSIX.1-2008 obsługują wszystkie funkcje opisane poniżej, mogą istnieć procedury konfiguracyjne zależne od systemu lub systemu plików, które mogą usuwać lub modyfikować dowolne lub wszystkie z tych funkcji. Takich konfiguracji nie należy wykonywać, jeśli wymagana jest ścisła zgodność.

Następujące stałe symboliczne należy zdefiniować za pomocą wartości innej niż -1. Jeśli stała jest zdefiniowana z wartością zero, aplikacje powinny używać sysconf(), pathconf()lub fpathconf()funkcje lub getconfnarzędzia, aby określić, które cechy są obecne w systemie w tym czasie lub dla danej ścieżki w pytaniu.

_POSIX_CHOWN_RESTRICTED

Użycie chown()ogranicza się do procesu z odpowiednimi uprawnieniami oraz do zmiany identyfikatora grupy pliku tylko na efektywny identyfikator grupy procesu lub na jeden z jego dodatkowych identyfikatorów grupy.

Funkcja chown()systemowa - która jest udokumentowanym wywołaniem systemowym wykonanym zarówno przez narzędzia, jak chowni chgrpnarzędzia powłoki - jest uznawana za nieudaną z wielu powodów. Pomiędzy nimi:

EACCES Brak uprawnień do wyszukiwania w komponencie prefiksu ścieżki.

ELOOP Pętla istnieje w dowiązaniach symbolicznych napotkanych podczas rozwiązywania argumentu ścieżki.

EPERM Efektywny identyfikator użytkownika nie jest zgodny z właścicielem pliku lub proces wywołujący nie ma odpowiednich uprawnień, a _POSIX_CHOWN_RESTRICTED wskazuje, że takie uprawnienia są wymagane.

Zachowanie polegające na przyznawaniu uprawnień do modyfikacji uprawnień użytkownikom innym niż root nigdy nie było jednak unikalne w systemie Solaris. W tym wpisie na forum jest bardzo doskonałe - choć nieco przestarzałe - pokrycie uprawnień do plików systemu Unix :

Pierwotnie Unix pozwalał właścicielowi pliku na rozdawanie plików. Właściciel pliku może zmienić właściciela na kogoś innego. Użytkownik inny niż root nie mógł cofnąć tej operacji ... BSD [później] usunięto chownz użytkowników innych niż root ... [częściowo dlatego, że] ... zaimplementowano przydziały dysku, które mogłyby ograniczyć ilość miejsca na dysku użytkownik może mieć w systemie plików ... Niegrzeczni użytkownicy mogą rozdawać duże pliki, aby wymknąć się limitom.

Dzisiaj nie jest łatwo stwierdzić, czy plik inny niż root może chownplik. Wiele wersji Uniksa pozwala na oba zachowania ...

Kolejny dobry - i nowszy - post na liście mailowej cytuje to i kontynuuje:

Domyślnie w większości systemów operacyjnych chownogranicza się tylko do rootowania. I istnieje konsensus, że tak powinno pozostać ze względów bezpieczeństwa. Jeśli użytkownik inny niż root nie zmieni właściciela pliku, a dowolny bit wykonania jest włączony, bity SUIDi SGIDmuszą zostać wyczyszczone. To może się zdarzyć lub nie root.

Myślę, że ostatni akapit mówi to ładnie.

Ten artykuł zawiera także odniesienia CAP_CHOWNdo kontrolowania tego narzędzia w systemie Linux (które powinno tylko wpływać na POSIX_CHOWN_RESTRICTEDzachowanie) . Istnieje również CAP_FOWNERmożliwość, która jest nieco inna w zachowaniu.

I jak zauważyłeś w 2003 roku :

Pamiętaj, że przynajmniej w HPUX możesz zmienić właściciela swoich plików ( rootna przykład), nawet jeśli nie jesteś uprzywilejowanym użytkownikiem ...

... które zależały od setprivgroupparametru konfiguracyjnego .

W każdym przypadku, w którym użytkownik inny niż root może manipulować uprawnieniami do plików, można sobie wyobrazić, jak wspomniano w uzasadnieniu cytowanym w pytaniu, że użytkownik może chownmieć plik, który jest właścicielem tego użytkownika, tak że jest on własnością innego użytkownika. Jeśli własność grupy pliku i grupy chownużytkownika ing nie zostaną wyrównane, użytkownik nie będzie już mógł modyfikować tego pliku.

W tym scenariuszu chown następnie chgrp zawiedzie jako użytkownik nie będzie już mieć uprawnień do zmiany uprawnień w tym pliku, podczas gdy chown user:group- tak długo, jak grupa jest jednym z użytkownikiem własnego - uda.

Prawdopodobnie istnieje wiele innych niszowych sytuacji, które mogą wynikać podobnie, na przykład bity lepkie i / lub bity setgid , listy systemów plików i / lub listy kontroli dostępu specyficzne dla implementacji. Ten wątek jest na przykład interesujący. Niezliczone permutacje są daleko poza moim słabym zasięgiem - dlatego ta odpowiedź jest opublikowana w Wikipedii. Jeśli to czytasz, uważasz, że warto to poprawić i wierzysz, że wiesz jak - zrób to .

Istnieje również obszerna dokumentacja na temat różnych możliwych skutków uprawnień do plików, przechodzenia przez drzewa i dowiązań symbolicznych, które mogą powodować podobną awarię w odniesieniu do aplikacji -Recursive chown:

Z nagłówków sekcji POSIX XRAT Trzecia i czwarta domena :

Zasadniczo użytkownicy określający opcję przejścia hierarchii plików chcą działać na pojedynczej, fizycznej hierarchii, dlatego też dowiązania symboliczne, które mogą odnosić się do plików poza hierarchią, są ignorowane. Na przykład plik właściciela właściciela jest inną operacją niż to samo polecenie z podaną opcją -R. W tym przykładzie chown owner fileopisano zachowanie polecenia , a zachowanie chown -Rpliku właściciela polecenia opisano w trzeciej i czwartej domenie.

... Wystąpił problem bezpieczeństwa związany z domyślnym przejściem logicznym. Historycznie chown -Rplik użytkownika polecenia był bezpieczny dla superużytkownika, ponieważ bity setuid i setgid zostały utracone po zmianie własności pliku. Gdyby przejście było logiczne, zmiana własności nie byłaby już bezpieczna, ponieważ użytkownik mógł wstawić symboliczne łącze wskazujące dowolny plik w drzewie. Ponownie wymagałoby to dodania opcji do poleceń przechodzących hierarchię, aby nie pośrednio poprzez dowiązania symboliczne, a skrypty historyczne wykonujące rekurencyjne spacery natychmiast stałyby się problemami bezpieczeństwa. Chociaż jest to głównie problem dla administratorów systemu, lepiej nie mieć różnych ustawień domyślnych dla różnych klas użytkowników.

...

W 4.3 BSD chgrppodczas przechodzenia drzewa zmieniono grupę dowiązania symbolicznego, a nie cel. Dowiązania symboliczne w 4.4 BSD nie miały właściciela, grupy, trybu ani innych standardowych atrybutów plików systemowych UNIX.

A na chgrpwłaściwej stronie POSIX znajduje się ta, która wskazuje na możliwe niekompletne -Rdziałanie ekursywne, a przynajmniej na to, co kiedyś :

Wersje System V i BSD używają różnych kodów statusu wyjścia. Niektóre implementacje wykorzystywały status wyjścia jako liczbę błędów, które wystąpiły; ta praktyka jest niewykonalna, ponieważ może przepełnić zakres prawidłowych wartości statusu wyjścia. Standardowi programiści postanowili je maskować, określając tylko 0 i> 0 jako wartości wyjściowe.


1
@StephaneChazelas - cieszę się, że rozumiesz. ∆to kind to trochę bałagan, ponieważ nie jestem zbyt dobry w kwestii uprawnień - szczególnie, gdy w grę wchodzą atrybuty SE. Połączenie jest luźne - linki! = Ch {grp, own}, ale pomyślałem, że jeśli faceci z POSIX będą mieli tyle kłopotów z jego przeliterowaniem (jest też duży wykres na stronie), to z tego samego powodu link może powodować problemy, więc mogą też wystąpić dwie akcje -R. Nic by się nie zepsuło, jeśli masz obie nogi - użytkownika i grupę - jak mówisz, ale jeśli masz już 1 off .. W każdym razie, opublikowałem to na wiki z jakiegoś powodu. Nie bardzo moja mocna strona. Przepraszam.
mikeserv

1
Dobrze, że nie myślałem o -R. Można sobie wyobrazić, że możesz stracić wyszukiwanie lub dostęp do odczytu katalogu na chgrp, co uniemożliwiłoby ci zmianę uprawnień do plików w nim zawartych, ale z drugiej strony dzięki tradycyjnym uniksowym sposobom zarządzania własnością lub uprawnieniami, nie widzę, jak to zrobić sprawić, aby się wydarzyło. Innym obszarem wartym zbadania, moim zdaniem, byłyby listy ACL NFSv4 w systemach, które go obsługują (Solaris, FreeBSD, SUSE ...)
Stéphane Chazelas

@ StéphaneChazelas - czy jest jakiś aspekt pytania, na które nie ma odpowiedzi w tym poście?
mikeserv

wielkie dzięki za te dokładne badania. Byłoby miło, gdybyś mógł dodać przykład z podsystemem NT Unix, w którym obowiązuje tekst POSIX. Nie jestem jednak pewien, jak działają nagrody za odpowiedzi na wiki społeczności. Dam temu szansę.
Stéphane Chazelas,

@ StéphaneChazelas - Nie dbałem o punkty i nigdy nie miałem. Miałem tylko nadzieję, że tego nie spieprzyłem. Nie jestem pewien, że rozumiem, że to byłaby miła część - masz na myśli NT Unix 4? Oficjalne dokumenty Microsoftu twierdzą, że jest zgodny z POSIX, przynajmniej gdy był jeszcze Interix, ja i ja stwierdzamy trochę dziwnie chgrp chown... może nie zachowywać się tak, jak się spodziewasz ...
mikeserv

1

Założenie 1: zasady określania, czy się chownpowiedzie, sprawdzają niezależnie docelowego użytkownika i grupy części, tj. Mają one formę user_condition(target_uid, other_environment_parameters) && group_condition(target_gid, other_environment_parameters).

Założenie 2: chown(file, -1, -1)udane.

Założenie 3: zasady określania, czy się chownpowiedzie, nie zależą od grupy, do której plik należy obecnie.

Następstwo: jeśli chown(file, uid, gid)to się powiedzie, to i tak się stanie chown(file, -1, gid) && chown(file, uid, -1).

Nie znam wariantu Uniksa, który naruszyłby którekolwiek z tych założeń, wydają się one całkiem bezpieczne.

To zdanie ma wygląd czegoś, co ktoś w komisji powiedział, gdy byli zmęczeni godzinami debatowania, ile opcji może zmieścić się na czele psrozmowy - lub że sekretarka źle przepisała - i których nikt nie złapał podczas przeglądu. W końcu istnieją inne dobre powody, aby zezwolić na automatyczną zmianę użytkownika i grupy, w tym powód wydajności wymieniony również w uzasadnieniu POSIX, a także atomowość (ah, gdyby tylko było jedno wezwanie do zmiany własności i uprawnień ).


Przypadek, w którym założenie 3 może być błędne, dotyczy systemu, w którym proces może uzyskać możliwość zmiany właścicieli plików, ale tylko wtedy, gdy mają oni uprawnienia do zapisu pliku. Choć nieco realistyczne, nie znam żadnego systemu, w którym tak jest. Następniechgrp do grupy z procesu, który nie działa ani jako root, ani jako użytkownik będący właścicielem pliku, może spowodować, że plik będzie później niedostępny chown.


W przypadku wywołania rekurencyjnego istnieją przypadki skrajne, w których całe przejście, chgrppo którym następuje całe przejście, chownmoże się nie powieść, gdy pojedyncze przejście zakończy się powodzeniem. Nie jest to zbyt przekonujący argument, ponieważ dotyczy katalogów, których właściciel nie ma uprawnień do przechodzenia, a aplikacja, która chciała chronić się przed wszystkimi takimi przypadkami, musiałaby i tak manipulować uprawnieniami. Niemniej jednak technicznie spełnia warunek tego uzasadnienia. Załóżmy, że działający proces ma efektywnego użytkownika alice, skuteczną grupę staffi możliwość arbitralnej zmiany właścicieli plików (nie tylko w celu ich rozdania; kilka wariantów uniksowych ma taką możliwość, chociaż rzadko jest to przyznawane procesom innym niż root).

$ ls -ld dir dir/file
d---rwx---  2 charlie  staff        1024 Apr  1  1970 dir
drw-rw----  2 charlie  staff          42 Apr  1  1970 file
$ chgrp -R students dir
$ chown -R bob dir
chown: dir: permission denied

Zauważ, że POSIX dotyczy nie tylko Uniksa. Istnieje wiele systemów operacyjnych innych niż Unix, które mają podsystem / interfejs POSIX (na przykład Microsoft Windows NT). Nie jestem pewien, czy te warunki są wystarczające, aby ubiegać się o następstwo. chgrpLub chownmoże mieć skutki uboczne, które wpływają na zdolność do drugiego. Na przykład chownusuwa możliwość chgrp, to fakt. chgrpusuwa bit setuid / setgid, może usunąć jakąś formę ACL lub inną formę kontekstu bezpieczeństwa ...
Stéphane Chazelas

@ StéphaneChazelas Zgadzamy się, że chownśledzenie chgrpmoże zakończyć się niepowodzeniem, ale pytanie dotyczy chgrpodpowiedzi chown. Hmmm, kontekst bezpieczeństwa… może w systemie z obowiązkową kontrolą dostępu chgrpmoże skazić plik i uniemożliwić jego przeglądanie? To wydaje się zbyt daleko idące.
Gilles „SO- przestań być zły”

Może nie do końca. Nie wiem wiele o listach ACL NFSv4 / WinNT, ale podejrzewam, że istnieje coś, co może sprawić, że coś takiego się wydarzy (i / lub unieważni twoje trzecie założenie). Mimo to ten tekst jest dość konkretny i ktokolwiek go napisał, miałby na myśli konkretny przykład. Może zostało napisane przez niektórych ludzi Microsoft.
Stéphane Chazelas

ponownie twoja najnowsza edycja. W przypadku chown -R bob: uczniowie, alicja nadal traciłaby uprawnienia do wyszukiwania dir, więc aby to zadziałało, chownmusiałoby najpierw przetworzyć głębokość plików i nie znam żadnej implementacji, która by to zrobiła. Jest to więc prawie prawidłowy przypadek, w którym chgrp + chown zawiódłby się tam, gdzie chmod u: g nie mógł, ale to tak naprawdę nie łączy się z tekstem uzasadnienia.
Stéphane Chazelas

Niesprawdzona błędna transkrypcja sekretarki i rekurencyjne chownteorie wydają się być w konflikcie.
mikeserv
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.