Jak ustawić domyślne uprawnienia dla plików przeniesionych lub skopiowanych do katalogu?

9

Moje pytanie jest podobne do sposobu ustawiania domyślnych uprawnień do plików dla WSZYSTKICH nowo utworzonych plików w systemie Linux - różni się jednak w istotny sposób:

Chcę, aby wszystkie pliki utworzone w (lub skopiowane lub przeniesione) określonego katalogu odziedziczyły zestaw domyślnych uprawnień, które różnią się od domyślnych uprawnień systemowych.

Uzasadnienie: katalog, o którym mowa, to „lej zasysający” dla aplikacji. Użytkownicy w grupie umieszczają pliki w katalogu, a aplikacja (działająca pod innym identyfikatorem użytkownika w tej samej grupie) bierze je i przetwarza. Problem polega na tym, że właścicielem każdego pliku umieszczonego w katalogu jest użytkownik, który go tam umieścił, a uprawnienia są domyślnie ustawione na „rw-r - r--”; Chcę to zmienić na „rw-rw ----”. Aplikacja wykonująca pobieranie nie może tego zrobić jawnie, ponieważ identyfikator użytkownika, pod którym aplikacja jest uruchomiona, nie jest właścicielem danego pliku, a domyślne uprawnienia nie pozwalają aplikacji na chmod na pliku! Oczywiście użytkownik może zrobić chmod po umieszczeniu tam pliku - ale chcę, aby „upuszczenie” przez użytkownika było jak najprostsze. (Ci ludzie nie znają systemu Linux,

umask wydaje się zbyt potężny: nie chcę ustawiać domyślnych uprawnień dla każdego pliku utworzonego w dowolnym miejscu przez tych użytkowników - tylko tych utworzonych (lub umieszczonych) w tym katalogu.

Proszę doradź, dzięki!

Obrabować
źródło

Odpowiedzi:

5

Możesz użyć listy kontroli dostępu (ACL), aby ustawić domyślne uprawnienia dla plików w katalogu.

Od man 5 acl:

Jeśli domyślna lista ACL jest powiązana z katalogiem, parametr trybu do funkcji tworzących obiekty plików oraz domyślna lista ACL katalogu są używane do ustalenia listy ACL nowego obiektu:

  1. Nowy obiekt dziedziczy domyślną listę ACL zawierającego katalog jako swoją listę dostępu ACL.

  2. Wpisy ACL dostępu odpowiadające bitom uprawnień do pliku są modyfikowane, aby nie zawierały uprawnień, które nie są zawarte w uprawnieniach określonych przez parametr mode.

Aby go skonfigurować (odpowiednio zmień urządzenie, katalogi itp.):

Edytuj /etc/fstabplik i dodaj aclopcję montowania.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Zamontuj ponownie ( stronę podręcznika Sambymount.cifs ) system plików, uruchamiając ponownie komputer lub użyj:

mount -o remount,acl /home

Upewnij się, że masz narzędzia setfacli getfaclnarzędzia.

Ustaw domyślną listę ACL w katalogu (może być również konieczne ustawienie listy ACL dla istniejących plików):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Więcej informacji można znaleźć w połączonym samouczku.

Źródło: samouczek część 1 i część 2

Odniesienia: Listy kontroli dostępu POSIX w systemie Linux

Wstrzymano do odwołania.
źródło
Nie sądzę, że powinieneś dodawać acljako opcję w mountpoleceniu, kiedy masz to dodane /etc/fstab. Będzie redundantne, a kiedy uruchomisz mountpolecenie w odpowiedzi, otrzymasz wynik w następujący sposób: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(patrz acl,aclna końcu). Popraw to, jeśli się nie mylę.
its_me
1

Mogę zaproponować obejście: Utwórz osobny katalog „upuść”, uruchom tam osobny minijob, który naprawia uprawnienia, a następnie przenosi pliki do katalogu danych aplikacji. Możesz do tego użyć incron, aby praktycznie nie było zauważalnego opóźnienia.

Peter Eisentraut
źródło
1

Mogę wymyślić cztery możliwe metody:

  • umask, którego nie chcesz używać
  • opakowanie programu, które ustawia umask aplikacji, a nie użytkownika
  • cron, jak opisał @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;, różne systemy mają ulepszenia w tym zakresie (jak -exec+opcja)
  • ustawienia oparte na katalogach, które wymagają trochę programowania powłoki, ale w zasadzie powłoka po ustawieniu znaku zachęty lub wywołaniu cd zmieniłaby umask, jeśli w tym katalogu znajduje się plik kropki (lub katalog przodka); dla bash PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"byłoby najprostsze.
Arcege
źródło