Niektóre systemy plików na Linux obsługują rozszerzone atrybuty i ACL. Dzięki ACL temu, nie jesteśmy ograniczeni do standardowych uprawnień w stylu user-grupa-reszta i możemy tworzyć bardziej zaawansowane scenariusze z uprawnieniami użytkowników. Dzięki temu, odpada nam tworzenie i utrzymywanie dodatkowych grup w systemie. Z kolei dzięki dodatkowym atrybutom dostajemy dodatkowe możliwości pracy z naszymi plikami/katalogami.

Rozszerzone atrybuty plików, ACL, setfacl, getfacl



Film z rozszerzonych atrybutów plików i ACL w systemach plików na Linux



Wymagania

Aby móc korzystać z ACLi należy korzystać z systemu plików, który je obsługuje (np. ext*, xfs) i jest zamontowany z odpowiednimi opcjami (domyślnie włączone np. dla ext4 - acl). Należy również posiadać zainstalowany pakiet, który dostarcza komendy setfacl oraz getfacl, zazwyczaj powinien mieć acl w nazwie. Ponadto, do skorzystania z rozszerzonych atrybutów i polecenia chattr oraz lsattr potrzebujemy pakietu e2fsprogs.

Obecnie większość dystrybucji dostarcza to domyślnie, czyli instalujemy dystrybucję i możemy od razu korzystać. Jeżeli istnieją jakieś problemy, to wtedy szukamy paczek o nazwach acl i e2fsprogs lub sprawdzamy, czy nasz system plików jest zamontowany z odpowiednią opcją, np dla ext4 można to sprawdzić komendą: tune2fs -l /dev/part1, gdzie /dev/part1 to przykładowa partycja.

ACL

ACL rozszerzają możliwości naszych uprawnień i możemy tworzyć bardziej zaawansowane scenariusze uprawnień niż w przypadku “standardowym”. Czyli na podstawie samych tylko ACLi możemy wielu użytkownikom dać specyficzne uprawnienia (odczytu, zapisu, wejścia do katalogu/wykonania pliku lub łączone).

Np jeśli wykonamy poniższe polecenia (zakładając, że istnieją w systemie użytkownicy user1, user2, user3, user4, user5, user6, user7, user8):

setfacl -m "u:user1:---" /home/exampledir

setfacl -m "u:user2:r--" /home/exampledir

setfacl -m "u:user3:-w-" /home/exampledir

setfacl -m "u:user4:--x" /home/exampledir

setfacl -m "u:user5:rw-" /home/exampledir

setfacl -m "u:user6:r-x" /home/exampledir

setfacl -m "u:user7:-wx" /home/exampledir

setfacl -m "u:user8:rwx" /home/exampledir

Wówczas do katalogu /home/exampledir każdy użytkownik ma swoje unikalne uprawnienie, co nie byłoby możliwe w standardowym przypadku bez uciekania się do tworzenia dużej ilości grup w systemie. Do pobrania informacji o uprawnieniach używamy polecenia getfacl:

getfacl /home/exampledir

Większość outputu tej komendy nie wymaga specjalnego wyjaśnienia, poza jedną: mask, bo to jest trochę tricky. W dużym skrócie uprawnienia wyświetlane w mask:::

  • 1) Określają górny limit maksymalnych możliwych uprawnień dla grupy

  • 2) Przy ustawionym uprawnieniu mask i zmianie uprawnień dla grupy, uprawnienie mask przyjmuje maksymalne możliwe uprawnienie dla grupy, które jest dostępne we wszystkich dostępnych grupach

  • 3) Przy ustawionym uprawnieniu mask, grupowe uprawnienie dla read, write oraz execute są obliczane na jego podstawie)

To w związku z tym, iż pole mask, w dużym uproszczeniu, jest mapowane na pole uprawnień grupy w “standardowym” modelu uprawnień.

Zobacz tutaj dokładny opis o co chodzi

Warto dodać, że jeśli następuje zmiana ownera, grupy lub uprawnienia dla other np. za pomocą polecenia chmod, odpowiadające wpisy w ACL też ulegają zmianie (i vice versa). Po prostu uprawnienia standardowe (“zwykłe” ACL) i te tutaj omawiane (extended ACL) starają się być maksymalnie ze sobą kompatybilne.

Użycie polecenia chmod może nadpisać ACLe lub je unieważnić - w sensie, że uprawnienia nie będą działać tak, jak chcielibyśmy. Dlatego należy raczej unikać ustawiania uprawnień za pomocą chmod, jeżeli wcześniej ustawialiśmy już za pomocą setfacl. Warto jeszcze sprawdzać komendą getfacl, czy nie ma informacji o efektywnych uprawnieniach, która zaczyna się #effective - to znak, że nasze aktualne ustawienie w rzeczywistości spowoduje taki efekt, który właśnie jest opisywany przez tę informację (zazwyczaj uprawnienie mask doprowadziło do tej sytuacji)

Więcej informacji znajdziesz na tej stronie



Rozszerzone atrybuty

Na systemach plików ext2/ext4/ext4 i xfs (przynajmniej) mamy jeszcze do dyspozycji mechanizm rozszerzonych atrybutów dla plików i katalogów, którymi możemy zarządzać za pomocą narzędzia e2fsprogs i komend lsattr oraz chattr

Domyślnie rozszerzone atrybuty mogą być używane przez użytkownika root, chyba, że partycja, gdzie będą/są stosowane jest zamontowana z opcją user_xattr. Należy pamiętać, że nie wszystkie rozszerzone atrybuty mogą być obslugiwane na różnych systemach plików (w sensie identycznie lub w ogóle).

Attrybuty nadaje się polecenie chattr +litera /sciezka/do/pliku/lub/katalogu, gdzie litera reprezentuje jedną literę oznaczającą jeden atrybut. Zabieranie atrybutu ma prawie identyczną składnie, tylko zamiast znaku + mamy -, który oznacza usunięcie attrybuty, np: chattr -litera /sciezka/do/pliku/lub/katalogu

Z kolei listę atrybutów możemy wyświetlić komendą: lsattr /sciezka/do/pliku/lub/katalogu

Najciekawsze atrybuty moich zdaniem:

  • a: (append only): można tylko dopisywać do takiego pliku, lub dodawać nowe pliki i katalogi do takiego katalogu
  • i: (immutable): nie można w ogóle zmieniać zawartości pliku/katalogu,
  • u: (undeletable): nie można usunąć pliku z takim atrybutem

Czyli aby nadać attrybut i dla /etc/resolv.conf używamy polecenia: chattr +i /etc/resolv.conf

Pełną listę atrybutów można znaleźć na niezawodnej jak zawsze ArchLinux Wiki.

Na filmie nie wspomniałem jeszcze o narzędziach getfattr i setfattr, który pozwalają np. dodawać komentarze do plików jako metadane.

Uwagi

Rozszerzone atrybuty i ACL nie są “za darmo”. Wprowadzają pewne opóźnienia i w pewnych rzadkich scenariuszach, przy częstym dostępie do dużej ilości takich plików/katalogów, bez używania cache, czas odczytu może dać się we znaki. Ale dla pojedynczych plików/katalogów jest to kwestia pomijalna.

Pamiętaj, że warto znać te tematy, zwłaszcza chcąc być inżynierem DevOps - zobacz co to za stanowisko jeśli jeszcze nie wiesz. Rozszerzone atrybuty oraz ACL mogą się pojawić w rozmowie rekrutacyjnej na stanowisko DevOpsa, jako osobne pytanie lub jako jeden ze sposobów rozwiązania innego problemu.