Rozszerzone atrybuty niektórych systemów plików w Linux i ACL
Niektóre systemy plików na Linux obsługują rozszerzone atrybuty i ACL, co sprawia, że 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. Ten artykuł
wraz z filmem na moim kanale na YouTube stara się pokazać tę tematykę bardziej.
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 posiada ich obsługę (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::
:
-
- Określają górny limit maksymalnych możliwych uprawnień dla grupy
-
- Przy ustawionym uprawnieniu
mask
i zmianie uprawnień dla grupy, uprawnieniemask
przyjmuje maksymalne możliwe uprawnienie dla grupy, które jest dostępne we wszystkich dostępnych grupach
- Przy ustawionym uprawnieniu
-
- Przy ustawionym uprawnieniu
mask
, grupowe uprawnienie dla read, write oraz execute są obliczane na jego podstawie)
- Przy ustawionym uprawnieniu
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.