Jak sprawić, aby nowe uprawnienia do plików dziedziczyły z katalogu nadrzędnego?

85

Mam katalog o nazwie data. Następnie uruchamiam skrypt pod identyfikatorem użytkownika „robot”. robot zapisuje do datakatalogu i aktualizuje pliki w środku. Pomysł jest dataotwarty zarówno dla mnie, jak i dla robota do aktualizacji.

Więc skonfigurowałem uprawnienia i grupę właścicieli w ten sposób

drwxrwxr-x  2 me robot-grp 4096 Jun 11 20:50 data

gdzie zarówno ja, jak i robot należy do „robota-grp”. Zmieniam uprawnienia i grupę właścicieli rekurencyjnie jak katalog nadrzędny.

Regularnie przesyłam nowe pliki do datakatalogu przy użyciu rsync. Niestety, przesłane nowe pliki nie dziedziczą uprawnień katalogu nadrzędnego, jak mam nadzieję. Zamiast tego wygląda to tak

-rw-r--r-- 1 me users       6 Jun 11 20:50 new-file.txt

Gdy robot próbuje zaktualizować new-file.txt, kończy się niepowodzeniem z powodu braku uprawnień do plików.

Nie jestem pewien, czy ustawienie umask pomaga. W zasadzie nowe pliki tak naprawdę nie podążają za nim.

$ umask -S
u=rwx,g=rx,o=rx

Często denerwuje mnie pozwolenie na plik Unix. Czy w ogóle mam odpowiedni plan? Używam Debian Lenny.

Wai Yip Tung
źródło

Odpowiedzi:

53

Nie chcesz zmieniać domyślnego umask systemu, ponieważ jest to zagrożenie bezpieczeństwa. Opcja lepkiego bitu będzie do pewnego stopnia działać, ale najlepszym rozwiązaniem jest używanie list ACL. To łatwiejsze niż myślisz. Problem z podstawowymi listami ACL polega na tym, że domyślnie nie są one rekurencyjne. Jeśli ustawisz listę ACL w katalogu, tylko pliki w tym katalogu odziedziczą listę ACL. Jeśli utworzysz podkatalog, nie będzie on otrzymywał nadrzędnej listy ACL, chyba że lista ACL jest ustawiona na ponawianie.

Po pierwsze, upewnij się, że ACL są włączone dla woluminu, w którym znajduje się katalog. Jeśli tak tune2fs, możesz wykonać następujące czynności:

# tune2fs -l /dev/sda1 | grep acl
Default mount options:    user_xattr acl

Jeśli nie masz tune2fs, sprawdź fstabs:

# cat /etc/fstab 
/dev/system/root        /                       ext3    defaults        1 1
/dev/system/home        /home                   ext3    defaults        1 2
/dev/storage/data       /data                   ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2

Czwarta kolumna z napisem „defaults” oznacza w moim systemie (CentOS 5.5), ACL są włączone. W razie wątpliwości pozostaw to ustawienie domyślne. Jeśli spróbujesz ustawić ACL i to błędy się, wrócić i dodać opcję acl do pliku / etc / fstab zaraz po domyślne: defaults,acl.

Z tego, co rozumiem, chcesz, aby wszyscy w grupie użytkowników mieli dostęp do zapisu do katalogu danych. Można to osiągnąć przez:

setfacl -Rm g:users:rwX,d:g:users:rwX data/
churnd
źródło
Użyłem tego polecenia, ale to nie rozwiązało mojego problemu. Jak mogę cofnąć to polecenie?
Itai Ganot,
Czy podstęp na Ubuntu z sudo setfacl -Rm g:users:rwX,d:g:users:rwX /var/www/logs_or_something. Miał problem z testami PHPUnit. Po utworzeniu plików dziennika z uruchomionych testów użytkownik Apache www-datanie mógł ich zapisać / odczytać.
s3m3n
2
@Itai Gannot - zgodnie ze setfaclstrony człowieka , -blub --remove-allusuwa rozszerzone ACL.
jww
Więc po prostu dołączysz setfacl -Rm g:users:rwX,d:g:users:rwX data/na końcu /etc/fstab?
425nesp
@ piña no. jedyną zmianą dokonaną w / etc / fstab jest zmiana defaultsna defaults,acl. setfaclto polecenie, które powinieneś uruchomić z terminala. data/należy zastąpić ścieżką do katalogu, który chcesz zmienić.
Segfault
32

Oznaczenie katalogu setgid ( g+s) spowoduje, że nowe pliki odziedziczą własność grupy w katalogu, ale -gopcja rsync spróbuje to zastąpić.

Ignacio Vazquez-Abrams
źródło
11
Bit setgid powoduje, że utworzone pliki dziedziczą tylko grupę / if / osoba tworząca nowy plik jest członkiem tej grupy; jeśli użytkownik tworzący jest właścicielem, ale nie jest członkiem grupy, lub w katalogu można zapisać świat, bit setgid nic nie zrobi. Należy również ustawić umask dla wszystkich użytkowników tworzących pliki, aby umożliwić odpowiedni dostęp do grupy.
dannysauer
1
@ dannysauer „jeśli użytkownik tworzący jest właścicielem, ale nie należy do grupy ... bit setgid nic nie zrobi” - dziękuję. Ma to teraz sens - ale bez opinii rsync zastanawiałem się, dlaczego to nie działa.
user12345
4

Inne odpowiedzi mają zastosowanie w ogólnym przypadku, ale jak wspominasz, że rsync jest źródłem problemu, może być konieczne dostrojenie jego wywołania.

Na początek popularna -aflaga określa uprawnienia do kopiowania rsync; użyj -ristead of -alub add -no-p(dla braku synchronizacji uprawnień) i -no-g(dla braku synchronizacji grupowej). Ponadto rsync obsługuje --chmodflagę do zmiany uprawnień do nowo tworzonych plików.

mbq
źródło
3

Twój umask jest niewłaściwy dla wymaganych uprawnień. Chcesz umask 002. Obecnie masz umask 022. Ponadto komentarz na temat ustawiania katalogu setgid jest poprawny, ale nie jestem pewien, czy własność grupy plików jest czymś, co chcesz zmienić, czy nie.

Uprawnienia do plików uniksowych są w rzeczywistości bardzo prostym modelem. Uważam, że listy ACL są całkowicie mylące. :-)

Wszelaki
źródło
4
„Uprawnienia do plików w systemie Unix są w rzeczywistości bardzo prostym modelem. Uważam, że listy ACL są całkowicie mylące”. - Czuję się odwrotnie (ale i tak +1). Listy ACL (i Allow / Deny ACE) są proste, a uprawnienia Unix nie mają sensu. Ale pochodzi od faceta, który cierpi na instalację Postfix / Dovecot / Clam / SpamAssassin.
jww