Jak umask wpływa na listy ACL?

12

Czy ktoś może mi wyjaśnić, jak umaskwpływa na domyślną maskę nowo utworzonych plików, jeśli ACL są aktywowane? Czy jest na to jakaś dokumentacja?

Przykład:

$ mkdir test_dir && cd test_dir
$ setfacl -m d:someuser:rwx -m u:someuser:rwx .  # give access to some user
$ getfacl .
# file: .
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:someuser:rwx
default:group::---
default:mask::rwx
default:other::---
$ umask # show my umask
077
$ echo "main(){}" > x.c # minimal C program
$ make x # build it
cc     x.c   -o x
$ getfacl x
# file: x
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx           #effective:rw-
group::---
mask::rw-
other::---

Oczekiwałbym mask:rwx. Właściwie po ustawieniu umasknp. 027Dostaję oczekiwane zachowanie.

Jofel
źródło
Z umaską 077 otrzymasz mask::rw-. Ale to nie jest twoje pytanie, prawda?
slm
@slm To jest część mojego pytania. Chcę wiedzieć, jak maska ​​nowych plików zależy od umask. Byłem dość zaskoczony, że z 077 dostaję, mask::rw-a mask::rwxktóra nie była domyślną maską katalogu.
jofel
OK, aktualizuję teraz swoją odpowiedź o przykłady, które powinny pomóc to wyjaśnić. Daj mi kilka minut.
slm
To pytanie jest ściśle powiązane.
jofel

Odpowiedzi:

10

Znalazłem ten przykład, zatytułowany: ACL i MASK w systemie Linux . W tym artykule pokazano następujące przykłady, które moim zdaniem pomagają zrozumieć, w jaki sposób listy ACL i umaskinterakcja między nimi.

tło

Gdy plik jest tworzony w systemie Linux, 0666stosowane są uprawnienia domyślne, a podczas tworzenia katalogu - uprawnienia domyślne 0777.

przykład 1 - plik

Załóżmy, że ustawiliśmy nasz umask na 077 i dotknij pliku. Możemy użyć, straceaby zobaczyć, co się właściwie dzieje, gdy to robimy:

$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile

W tym przykładzie widzimy, że wywołanie systemowe open()jest wykonywane z uprawnieniami 0666, jednak gdy umask 077jest ono następnie stosowane przez jądro, następujące uprawnienia są usuwane ( ---rwxrwx) i zostajemy z rw-------aka 0600.

przykład - katalog 2

Tę samą koncepcję można zastosować do katalogów, z tą różnicą, że zamiast domyślnych uprawnień 0666, są to 0777.

$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777)                  = 0
drwxr-xr-x 2 saml saml 4096 Jul  9 10:55 testdir

Tym razem używamy mkdirpolecenia. Następnie mkdirpolecenie wywołało wywołanie systemowe mkdir(). W powyższym przykładzie widzimy, że mkdirpolecenie mkdir()wywołało wywołanie systemowe z domyślnymi uprawnieniami 0777( rwxrwxrwx). Tym razem z zestawem 022następujących uprawnień są usuwane ( ----w--w-), więc pozostaje nam 0755 ( rwxr-xr-x) podczas tworzenia katalogów.

przykład 3 (Stosowanie domyślnej listy ACL)

Teraz utwórzmy katalog i pokażmy, co się stanie, gdy zostanie do niego zastosowana domyślna lista ACL wraz z plikiem w niej zawartym.

$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir

$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx          #effective:rwx
group::r-x          #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx      #effective:rwx
default:group::r-x      #effective:r-x
default:mask::rwx
default:other::r-x

Teraz utwórzmy plik aclfile:

$ strace -s 128 -fvTttto luvly touch acldir/aclfile

# view the results of this command in the log file "luvly"
$ less luvly

Teraz uzyskaj uprawnienia do nowo utworzonego pliku:

$ getfacl --all-effective acldir/aclfile 
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx          #effective:rw-
group::r-x          #effective:r--
mask::rw-
other::r--

Zwróć uwagę na maskę mask::rw-. Dlaczego nie jest mask::rwxtak, jak podczas tworzenia katalogu?

Sprawdź luvlyplik dziennika, aby zobaczyć, jakie domyślne uprawnienia zostały użyte do utworzenia pliku:

$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>

To jest trochę mylące. Gdy maska ​​jest ustawiona na rwxczas tworzenia katalogu, można oczekiwać takiego samego zachowania podczas tworzenia pliku, ale to nie działa w ten sposób. Jest tak, ponieważ jądro wywołuje open()funkcję z domyślnymi uprawnieniami 0666.

Podsumowując

  • Pliki nie otrzymają uprawnień do wykonania (maskowania lub skutecznego). Nie ma znaczenia, której metody użyjemy: ACL, umask lub mask & ACL.
  • Katalogi mogą uzyskać uprawnienia do wykonywania, ale zależy to od ustawienia pola maskowania.
  • Jedynym sposobem na ustawienie uprawnień do wykonania dla pliku, który ma uprawnienia ACL, jest ręczne ustawienie ich za pomocą chmod.

Bibliografia

slm
źródło
@ jofel - daj mi znać, czy to ma sens.
slm
@sIm bardzo dziękuję za szczegółową odpowiedź. Zbliża mnie to do mojego rzeczywistego problemu: Zezwolenie na grupę w wywołaniu systemowym chmod wpływa na maskę pliku ( chmod("file",0760)-> mask:rw, chmod("file",0770)-> mask:rwx). Może powinienem zacząć nowe pytanie na ten temat ...
jofel
@jofel - tak, to brzmi jak kolejne pytanie.
slm
@sIm i tutaj już udzielono odpowiedzi .
jofel
„Kiedy plik jest tworzony w systemie Linux, stosowane są domyślne uprawnienia 0666 ...” - cóż, to nie do końca prawda, ponieważ to zależy od aplikacji tworzącej.
ilkkachu
2

ze względów bezpieczeństwa system operacyjny Linux nie pozwala na automatyczne tworzenie pliku z bitem wykonania. Ma to na celu zapobieganie cyberatakom pisania programów do takich plików i wykonywania ich, jeśli uzyskają dostęp do twojego serwera. To tylko środek ostrożności. Na zawsze będziesz musiał ręcznie ustawić bit wykonania dla plików po utworzeniu ich za pomocą narzędzia chmod

Arni
źródło