Czy ustawić domyślne uprawnienia dla nowo utworzonych plików i podkatalogów w katalogu w systemie Linux?

99

Mam kilka długo działających skryptów i aplikacji, które przechowują wyniki w katalogu udostępnionym kilku użytkownikom. Chciałbym mieć pewność, że każdy plik i katalog utworzony w tym katalogu współdzielonym ma automatycznie u=rwxg=rwxo=ruprawnienia.

Wiem, że mógłbym używać umask 006na czele różnych moich skryptów, ale nie podoba mi się to podejście, ponieważ wielu użytkowników pisze własne skrypty i może zapomnieć o samodzielnym ustawieniu umask.

Naprawdę chcę, aby system plików ustawiał nowo utworzone pliki i katalogi z określonymi uprawnieniami, jeśli znajdują się w określonym folderze. Czy to w ogóle możliwe?

Aktualizacja : Myślę , że można to zrobić za pomocą list ACL POSIX , używając funkcji domyślnej listy ACL, ale w tej chwili to wszystko jest trochę ponad moją głową. Jeśli ktoś mógłby wyjaśnić, jak używać domyślnych list ACL, prawdopodobnie ładnie odpowiedziałby na to pytanie.

David Dean
źródło
1
Listy ACL POSIX są fajne, jednak dobre 60% napotkanych maszyn nie będzie ich włączać dla niektórych systemów plików, w zależności od dystrybucji. Oto bardzo dobre wprowadzenie i przykład: suse.de/~agruen/acl/linux-acls/online
Tim Post
1
Masz na myśli ten sam dokument, który połączyłem :) Nie miałem jeszcze zmiany, żeby go przeczytać, ale dzięki za szefową w sprawie problemu z dostępnością.
David Dean
1
Link w komentarzu Tima Posta wygląda na martwy, ale dzięki Internet Archive mogłem go wyświetlić i sprawdzić, czy vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html zawiera dokładnie ten sam dokument. Zmienię pytanie, aby zaktualizować łącze.
rmunn

Odpowiedzi:

78

Aby uzyskać prawo własności, możesz ustawić bit setuid grupy w katalogu za pomocą

chmod g+rwxs dirname

Zapewni to, że pliki utworzone w katalogu należą do grupy. Powinieneś wtedy upewnić się, że każdy pracuje z umask 002 lub 007 lub czymś w tym rodzaju - dlatego Debian i wiele innych systemów linuxowych jest domyślnie skonfigurowanych z grupami na użytkownika.

Nie znam sposobu na wymuszenie żądanych uprawnień, jeśli umask użytkownika jest zbyt silna.

Norman Ramsey
źródło
23
To naprawdę nie zapewniają Roztwór podstawowy Pyta o nie uprawnień właścicielskich, a jedynym sposobem na to jest z ACL
Yarin
3
„... upewnij się, że wszyscy biegają z umask 002 lub 007 lub czymś w tym rodzaju” - to trochę naciągane… Jak sprawić, by Postfix, Dovecot, Clam i Spam Assassin robili to wszystko?
jww
2
Co robi ta +sczęść? Dzięki.
tommy.carstensen
1
W tym przypadku oznacza to ustawienie ID grupy. To znaczy, że używamy g + s do ustawienia bitu SGID. Mówię „w tym przypadku”, ponieważ + s zostało połączone z g dla grupy. + s można również użyć do ustawienia bitu SUID (setuid).
Bastion
57

Oto jak to zrobić przy użyciu domyślnych list ACL, przynajmniej w Linuksie.

Po pierwsze, może być konieczne włączenie obsługi ACL w systemie plików. Jeśli używasz ext4, to jest już włączony. Inne systemy plików (np. Ext3) muszą być montowane z aclopcją. W takim przypadku dodaj opcję do swojego /etc/fstab. Na przykład, jeśli katalog znajduje się w głównym systemie plików:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Następnie zamontuj go ponownie:

mount -oremount /

Teraz użyj następującego polecenia, aby ustawić domyślną listę ACL:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Wszystkie nowe pliki w programie /shared/directorypowinny teraz uzyskać żądane uprawnienia. Oczywiście zależy to również od aplikacji tworzącej plik. Na przykład, większość plików nie będzie wykonywana przez nikogo od początku (w zależności od argumentu mode wywołania open (2) lub creat (2)), tak jak przy użyciu umask. Niektóre narzędzia podoba cp, tari rsyncpostara się zachować uprawnienia pliku źródłowym (S), który maskuje swój domyślny ACL, jeśli plik źródłowy nie była grupa zapisu.

Mam nadzieję że to pomoże!

pelle
źródło
Wygląda na to, że nadal wymaga to odpowiedniego umaskdla wszystkich użytkowników. = / unix.stackexchange.com/questions/71743/ ...
anatoly techtonik
1
@techtonik Jak pisałem, zależy to od aplikacji tworzącej plik. Np. Jeśli używasz cp, spróbuje skopiować uprawnienia pliku źródłowego. Nawet nie umaskpomaga podczas używania cp. Widziałem ten sam problem z tar. Zobacz to pytanie .
pelle
@techtonik Dodałem teraz zdanie na ten temat w mojej odpowiedzi.
pelle
1
tak, wygląda na to, że problem występował w aplikacji na siłę ustawiając prawa na 644, podczas gdy moja prawidłowa konfiguracja ACL i POSIX była dla 664. Byłoby miło wyjaśnić ten mechanizm rezerwowy dla osób rozwiązujących problem. Wielu nawet o tym nie wie umask.
anatoly techtonik
Chodzi mi o to, że zmarnowałem trochę czasu próbując sprawdzić, czy nie mam poprawnie ustawionych flag montowania (a na ext4 nie można ich ustawić, ponieważ wygląda na to, że działają automatycznie). Brakuje informacji jak sprawdzić czy setfacl works correctly- zakładam, że powinno się nie udać, ale nie jestem pewien, bo odpowiedź mija się z tym punktem.
anatoly techtonik
4

Jest brzydki, ale możesz użyć polecenia setfacl, aby osiągnąć dokładnie to, co chcesz.

Na komputerze z systemem Solaris mam plik zawierający listy ACL dla użytkowników i grup. Niestety, musisz wymienić wszystkich użytkowników (przynajmniej nie mogłem znaleźć sposobu, aby to działało inaczej):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Nazwij plik acl.lst i wpisz swoje prawdziwe nazwy użytkowników zamiast user_X.

Możesz teraz ustawić te listy ACL w swoim katalogu, wydając następujące polecenie:

setfacl -f acl.lst /your/dir/here
innaM
źródło
czy możesz opuścić listę użytkowników, jeśli wszyscy są członkami tej samej grupy i po prostu użyć uprawnień grupy?
David Dean
Zadawałem sobie to samo pytanie. Minęło trochę czasu, odkąd to skonfigurowałem. Ale za każdym razem, gdy otrzymuję nowego użytkownika (w tej samej grupie co pozostali), zapominam o zaktualizowaniu listy i otrzymuję skargi, że nowy użytkownik nie może zapisywać / usuwać plików. Więc odpowiedź brzmi: nie, nie możesz.
innaM
4

w swoim skrypcie powłoki (lub .bashrc) możesz użyć czegoś takiego jak:

umask 022

umask to polecenie określające ustawienia maski kontrolującej sposób ustawiania uprawnień do nowo tworzonych plików.

user3270784
źródło
1
Nie jest to poprawne, ponieważ umask ogranicza uprawnienia, których nie może dodawać
ACV
@ACV czy możesz to rozwinąć? To działa dla mnie, nowo utworzone pliki pozwalają teraz członkom grupy mieć uprawnienia rw, gdy robię to umask 002w moim .bashrc.
Arthur Dent
3
@ArthurDent umask 002ogranicza dostęp do innych, pozostawiając grupę bez zmian. Pamiętaj, że to ugo- to jest grupa użytkowników innych. Pamiętaj też, że umask w zasadzie oznacza odejmowanie od wartości domyślnych. Dla plików: 666 - 002oznaczałoby 664, co oznacza, że ​​nie ma to wpływu na grupę.
ACV