Komendy omówione w poprzednich artykułach nie pozwalają niestety na nadawanie uprawnień na danym pliku więcej niż jednemu użytkownikowi lub grupie. Umożliwiają to listy kontroli dostępu (ACL – Access Control List), które zapewniają możliwość ustawienia na plikach i katalogach rozszerzonej grupy uprawnień. Pozwalają administratorom ustawiać w taki sposób uprawnienia , że różnią się one na poszczególnych katalogach. Aby możliwe było użycie ACL system plików musi być podmontowany z włączonym wsparciem dla ACL, opcja acl musi być dodana do montowanego systemu plików w pliku /etc/fstab. W systemie plików XFS takie wsparcie jest domyślnie włączone, w systemach plików EXT wsparcie ACL musi być aktywowane. Listy kontroli dostępu mogą być także używane w systemach plików NFS i CIFS.
ACL podzielone są na dwie kategorie:
- access ACL – dostępowe listy kontroli dostępu, ustawiane na plikach i katalogach.
- default ACL – domyślne listy kontroli dostępu, ustawiane tylko na poziomie katalogu. Pliki i podkatalogi wchodzące w skład katalogu z ustawionymi domyślnymi ACL dziedziczą domyślne ACL katalogu nadrzędnego.
Komendy zarządzania ACL
Komenda | Opis |
# getfacl |
Wyświetla ustawienia ACL dla pliku i katalogu. |
# setfacl |
Ustawia, modyfikuje i kasuje ACL dla pliku lub katalogu. |
# chacl |
Zmienia ustawienia ACL na pliku lub katalogu. Komenda z systemu IRIX UNIX. |
Jeżeli będziemy chcieli zrobić backup plików lub katalogów z ACL musimy zwrócić uwagę na fakt, że tar nie wspiera ACL. W takim wypadku należy użyć star, który pracuje z tymi samymi opcjami co tar a dodatkowo wspiera ACL. Można także wykonać backup ACL używając polecenia getfacl:
1 |
# getfacl -R /directory > file.acls |
Przywracanie ACL:
1 |
# setfacl --restore=file.acl |
Rozważmy następujący przykład:
1 2 3 4 5 6 7 8 9 10 11 12 |
# pwd /root # touch file1 # ll file1 -rw-r--r-- 1 root root 0 03-14 19:28 file1 # getfacl file1 file: file1 owner: root group: root <strong>user::rw-</strong> <strong>group::r--</strong> <strong>other::r--</strong> |
Zwróć uwagę na wiersze związane z uprawnieniami (pogrubione) i dwukropki. W przypadku użycia ACL pomiędzy tymi dwukropkami znajdą się rozszerzone uprawnienia.
Np. ACL: user:1000:r--
na pliku oznacza, że użytkownik user z UID 1000, który nie jest właścicielem pliku ani członkiem grupy, która jest jego właścicielem, ma uprawnienia tylko do odczytu tego pliku.
Podobnie ACL: group:dba:rw-
przyzna grupie dba prawo odczytu i zapisu pliku.
Komenda setfacl zawiera wiele opcji:
Opcja | Opis |
-m | Ustawia lub modyfikuje ACL |
-x | Usuwa konkretne ACL |
-d | Ustawia domyślne ACL |
-k | Usuwa wszystkie domyślne ACL |
-b | Usuwa wszystkie ACL |
-R | Ustawia ACL rekursywnie na wszystkich plikach i podkatalogach |
Zasada ACL | Opis |
u[ser]:UID:perms | Uprawnienia przypisywane do konkretnego użytkownika (nazwa użytkownika lub UID). Użytkownik musi się znajdować w pliku /etc/passwd. |
g[roup]:GID:perms | Uprawnienia przypisywane do konkretnej grupy (nazwa użytkownika lub GID). Użytkownik musi się znajdować w pliku /etc/group. |
m[ask]:perms | Maksymalne uprawnienia jakie konkretny użytkownik lub grupa może mieć mieć na pliku lub katalogu. Np. rw- oznacza, że żaden użytkownik lub grupa nie będzie miał większych uprawnień niż odczyt i zapis. |
o[ther]:perms | Uprawnienia przypisane użytkownikom nie należącym do grupy będącej właścicielem. |
Znaczenie maski w ACL
Maska ACL determinuje maksymalne możliwe uprawnienia przyznane konkretnemu użytkownikowi bądź grupie do pliku lub folderu. Jeżeli maska na przykład ustawiona jest na rw to żaden użytkownik czy grupa nie przekroczy tych uprawnień. Opcja –c powoduje, że getfacl nie wyświetla nagłówka:
1 2 3 4 |
# getfacl –c file1 user::rw group::r-- other::r-- |
Jeżeli przyznamy użytkownikowi user1 prawo do zapisu i odczytu i zmienimy maskę na tylko do odczytu w tym samym czasie to efektywnymi uprawnieniami dla user1 będzie tylko odczyt:
1 2 3 4 5 6 7 |
# setfacl –m u:user1:rw,m:r file1 # getfacl –c file1 user::rw user:user1:rw- #effective:r-- group::r-- mask::r-- other::r-- |
Czyli użytkownik user1 nie będzie mógł modyfikować tego pliku mimo, że wydaje się, że ma uprawnienia do zapisu. Po zmianie maski jak poniżej użytkownik user1 będzie mógł modyfikować plik file1.
1 2 3 4 5 6 7 |
# setfacl –m m:rw file1 # getfacl –c file1 user::rw user:user1:rw group::r-- mask::rw other::r-- |
Ćwiczenie 1. Określ, ustaw i wykasuj ACL.
1. Zaloguj się jako user1 i utwórz plik file1. Uruchom polecenia ll (ls -l) i getfacl na pliku file1 i sprawdź czy na pliku są ustawione jakieś ACL.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ pwd /home/user1 $ touch file1 $ ll file1 -rw-rw-r--. 1 user1 user1 0 Nov 4 21:12 file1 $ getfacl file1 file: file1 owner: user1 group: user1 user::rw group::rw other::r-- |
Wyjście wskazuje na to, że na pliku nie ma żadnych ACL.
2. Przełącz się teraz na konto root i sprawdź system plików. Jeżeli jest to system plików extended to odpal mount | grep home
aby sprawdzić czy wsparcie dla ACL jest włączone. Jeżeli nie to wydaj komendę:
1 |
# mount –o remount,acl /home |
Wskazówka na egzamin: Jeżeli system plików, na którym używasz ACL to extended, zmodyfikuj plik /etc/fstab
i zastąp ‘defaults
’ with ‘acl
’ (lub dodaj ‘acl
’ jeżeli są dodane inne opcje) w polu opcji montowania.
3. Jako użytkownik user1 przyznaj użytkownikowi user3 uprawnienia rwx komendą setfacl. Użyj notacji oktalnej
1 |
$ setfacl –m u:user3:7 file1 |
4. Komendą ll zweryfikuj czy przy ustawieniach uprawnień pojawił się znaczek +. Komendą getfacl zweryfikuj ustawienia ACL pliku.
1 2 3 4 5 6 7 8 9 |
$ ll -rw-rwxr--+ 1 user1 user1 0 Nov 4 21:12 file1 $ getfacl –c file1 user::rw <strong>user:user3:rwx</strong> group::rw <strong>mask::rwx</strong> other::r-- |
Dla użytkownika user3 dodany jest nowy wiersz z uprawnieniami rwx. Wiersz z maską rwx także jest dodany.
5. Dodaj użytkownika user4 z uprawnieniami odczyt/zapis do pliku file1 używając notacji symbolicznej:
1 2 3 4 5 6 7 8 |
$ setfacl –m u:user4:rw file1 $ getfacl file1 user::rw user:user3:rwx user:user4:rw group::rw mask::rwx other::r-- |
6. Usuń wpis ACL dla użytkownika user3 i potwierdź:
1 2 3 4 5 6 7 |
$ setfacl –x u:user3 file1 $ getfacl file1 user::rw user:user4:rw group::rw mask::rw other::r-- |
Wartość maski została zredukowana do odczyt/zapis co odnosi się do maksymalnych uprawnień przyznanych użytkownikowi user4.
7. Usuń wszystkie wpisy ACL na pliku file1 zweryfikuj poleceniem getfacl:
1 2 |
$ setfacl –b file1 $ getfacl –c file1 |
Domyślne ACL
Czasami zachodzi potrzeba aby wielu użytkowników, którzy należą do różnych grup, współdzieliło jeden katalog. Potrzebują oni tak ustawionych uprawnień aby pliki i podkatalogi utworzone w katalogu nadrzędnym dziedziczyły te uprawnienia. W taki sposób użytkownicy nie muszą ustawiać uprawnień, które ustawili na katalogu nadrzędnym, na każdym pliku i podkatalogu z osobna. Takie wymaganie spełnia domyślne ACL.
ACL | Opis |
d[efault]:u:perms | Domyślne standardowe uprawnienia dla właściciela. |
d[efault]:u:UID:perms | Domyślne uprawnienia dla konkretnego użytkownika (jego nazwa lub UID). |
d[efault]:g:perms | Domyślne standardowe uprawnienia dla grupy. |
d[efault]:g:GID:perms | Domyślne uprawnienia dla konkretnej grupy (jego nazwa lub GID). |
d[efault]:o:perms | Domyślne uprawnienia dla innych. |
d[efault]:m:perms | Domyślne maksymalne uprawnienia, które może mieć użytkownik lub grupa gdy tworzy plik lub katalog z domyślnymi ACL. |
Ćwiczenie 2. Ustaw, potwierdź i usuń domyślne ACL.
1. Zaloguj się jako użytkownik user4 i utwórz katalog projects. Poleceniem getfacl sprawdź domyślne uprawnienia.
1 2 3 4 5 6 7 8 9 10 11 |
$ pwd /home/user4 $ mkdir projects $ getfacl projects # file: project # owner: user4 # group: user4 user::rwx group::rwx other::r-x |
2. Komendą setfacl przyznaj uprawnienia do odczytu i zapisu użytkownikom user1 i user3. Uruchom to polecenie jako user4 i korzystaj z notacji oktalnej.
1 2 3 4 5 6 7 8 9 10 11 |
$ setfacl –m d:u:user1:6,d:u:user3:6 projects $ getfacl –c projects user::rwx group::rwx other::r-x default:user::rwx default:user:user1:rw default:user:user3:rw default:group::rwx default:mask::rwx default:other::r-x |
3. W katalogu projects utwórz podkatalog prj1 i sprawdź czy odziedziczył ustawienia ACL z katalogu nadrzędnego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ cd projects ; mkdir prj1 $ getfacl –c prj1 user::rwx user:user1:rw user:user3:rw group::rwx mask::rwx other::r-x default:user::rwx default:user:user1:rw default:user:user3:rw default:group::rwx default:mask::rwx default:other::r-x |
4. Utwórz plik file1 w katalogu projects i sprawdź czy odziedziczył ACL z katalogu nadrzędnego.
1 2 3 4 5 6 7 8 |
$ touch file1 $ getfacl –c file1 user::rw user:user1:rw user:user3:rw group::rwx ;#160; #effective:rw mask::rw other::r-- |
Wynika stąd, że maksymalne uprawnienia dla członków grupy to odczyt i zapis. Prawo do wykonywania jest nieefektywne ze względu na ustawienia maski.
5. Skasuj wszystkie domyślne ustawienia ACL dla katalogu i potwierdź.
1 2 3 4 5 |
$ setfacl –k project $ getfacl –c project user::rwx group::rwx other::r-x |