Laboratorium 1 i 2: acl, syslog

Mechanizmy lokalnej kontroli dostępu

Listy kontroli dostępu (ang. Access Control List, ACL) rozszerzają standardowy mechanizm uprawnień, kontrolujący dostęp do plików (a także katalogów, urządzeń, gniazd i innych obiektów systemu plików).

Standardowe uprawnienia definiują prawo do odczytu (r), zapisu (w) i wykonania (x) dla:

  • właściciela pliku (lub innego obiektu reprezentowanego przez plik, od tego momentu nie będziemy już tego powtarzać),
  • grupy, do której należy właściciel,
  • pozostałych użytkowników.

ACL pozwalają na bardziej rozbudowaną kontrolę - dają możliwość przydzielania trzech wymienionych uprawnień (rwx) nie tylko dla właściciela pliku, ale dla dowolnie wskazanego użytkownika, nie tylko dla grupy pliku, ale dla dowolnie wskazanej grupy.

ACL są wspierane przez różne linuksowe systemy plików, mi.in.: xfs, ext2, ext3, ext4, reiserfs, nfs, jfs.
Co ciekawe spośród znanych systemów plików nie obsługują ACL: FAT16, FAT32, zaś system plików exFAT w jednej z wersji systemu Windows je obsługiwał, ale współczesne wersje tego systemu list ACL w exFAT nie obsługują.

Uważa się, że ACL są zgodne ze standardem POSIX. W rzeczywistości opisujące je standardy POSIX 1003.1e i 1003.2c draft 17 nie zostały oficjalnie przyjęte. ACL są również wspierane w systemach firmy Microsoft, jednak nie zachowują one pełnej zgodności ze standardem i są wspierane jedynie przez system plików NTFS.

Linux

1. Lista Kontroli Dostępu

Minimalna lista kontroli dostępu pokrywa się ze standardowymi uprawnieniami, natomiast lista rozszerzona zawiera dodatkową pozycję - maskę i może zawierać także pozycje dla poszczególnych użytkowników i grup.

W liście ACL wyróżniamy następujące typy pozycji (w nawiasach słowa kluczowe):

  • właściciel (user:: lub u::)
  • nazwany użytkownik (user:nazwa_użytkownika: lub u:nazwa_użytkownika:)
  • grupa właściciela (group:: lub g::)
  • nazwana grupa (group:nazwa_grupy: lub g:nazwa_grupy:)
  • maska (mask::)
  • pozostali (other::)

(Uwaga: obecna w literaturze frazeologia nazwany użytkownik czy nazwana grupa ma to do siebie, że dobrze kojarzy się z angielską terminologią, jednak spośród wielu znaczeń angielskiego słowa name najbardziej pasujące tutaj to to mention explicitly : specify).

2. Maska

Rozszerzone listy kontroli dostępu oferują możliwość maskowania uprawnień, co oznacza, że podczas obliczania efektywnych uprawnień, oprócz uprawnień zdefiniowanych dla danego użytkownika, brana jest pod uwagę także maska. Z dwoma wyjątkami: uprawnienia zdefiniowane dla właściciela i dla tzw. pozostałych (other) są zawsze efektywne (maska nie ma na nie wpływu).

Efektywne uprawnienia do pliku są koniunkcją bitową maski i uprawnień zdefiniowanych w odpowiedniej pozycji (dla nazwanego użytkownika, grupy właściciela lub nazwanej grupy).

Przykład

Jeżeli prawa do pliku zdefiniowane są w następujący sposób:

user:testowy:r-x
mask::rw-

to efektywne uprawnienia użytkownika "testowy" to: r--

Uwaga: domyślnie maska jest aktualizowana automatycznie i określa maksymalne uprawnienia dla użytkowników należących do nazwanych użytkowników, grupy właściciela lub grup nazwanych.

3. Algorytm sprawdzania uprawnień dostępu

Rozszerzone uprawnienia są stosowane wg następującego algorytmu:

  • jeżeli użytkownik jest właścicielem pliku - zastosuj uprawnienia właściciela,
  • jeżeli użytkownik jest na liście nazwanych użytkowników - zastosuj efektywne (patrz punkt 2) uprawnienia nazwanego użytkownika,
  • jeżeli jedna z grup użytkownika jest grupą właściciela i posiada odpowiednie efektywne prawa - zezwól na dostęp,
  • jeżeli jedna z grup użytkownika występuje jako grupa nazwana i posiada odpowiednie efektywne prawa - zezwól na dostęp,
  • jeżeli jedna z grup użytkownika jest grupą właściciela lub należy do grup nazwanych, ale nie posiada dostatecznych efektywnych uprawnień - dostęp jest zabroniony,
  • jeżeli nie zachodzi żadne z powyższych - uprawnienia tzw. pozostałych określają możliwość dostępu.

4. Polecenia

Do zarządzania listami ACL służą dwa polecenia:

  • getfacl
  • setfacl

Polecenie "getfacl" wypisuje rozszerzone uprawnienia do plików.

Przykład

% touch plik-testowy
% ls -l plik-testowy
-rw-r--r-- 1 janek bsk 0 2016-10-05 14:46 plik-testowy
% getfacl plik-testowy
# file: plik-testowy
# owner: janek
# group: bsk
user::rw-
group::r--
other::r--
% getfacl plik-testowy –-omit-header
user::rw-
group::r--
other::r--

Polecenie "setfacl" pozwala modyfikować uprawnienia.

a) Zmiana uprawnień - opcja -m

Jeżeli chcemy dodać lub zmienić uprawnienia używamy opcji -m (jak modify), a następnie podajemy: pozycję z listy (patrz punkt 1), jakie uprawnienia chcemy nadać (rwx) i jakiemu plikowi.

Przykład

% setfacl -m u:ala:rwx plik-testowy
% getfacl plik-testowy
# file: plik-testowy
# owner: janek
# group: bsk
user::rw-
user:ala:rwx
group::r--
mask::rwx
other::r--
% ls -l plik-testowy
-rw-rwxr--+ 1 janek bsk 0 2016-10-05 14:46 plik-testowy

Zwróćmy uwagę na wiersz powyżej. Znak + oznacza, że plik posiada rozszerzone uprawnienia, a zamiast uprawnień grupy widzimy maskę (co nie powinno dziwić, bo maska opisuje maksymalne uprawnienia dla wszelkich grup).

Maskę możemy zmieniać korzystając z setfacl (mask::), a także poprzez chmod (zmiana praw dla grupy powoduje zmianę maski).

b) Usunięcie uprawnień - opcja -x

Opcji -x (jak exclude) używa się tak:

% setfacl -x u:ala plik-testowy
% getfacl plik.txt –-omit-header
user::rw-
group::r--
mask::r--
other::r--
% ls -l plik.txt
rw-r--r--+ 1 janek bsk 0 2016-10-05 14:46 plik-testowy

Inne opcje pozwalają na przykład na usunięcie uprawnień dotyczących wszystkich pozycji (-b, jak blank), czy modyfikację uprawnień rekurencyjnie w drzewie katalogów (-R).

5. Domyślne prawa dostępu

Uprawnienia domyślne dotyczą tylko katalogów. Jeżeli katalogowi nadamy domyślne uprawnienia rozszerzone, to nowo utworzone pozycje w tym katalogu będą je dziedziczyć.

Do modyfikowania uprawnień domyślnych służy opcja -d (jak default) polecenia setfacl, po której następują znane już -m, -x itd.

Przykład dodania uprawnień domyślnych

% setfacl -d -m group:testowa:wx bsk-lab1
% getfacl bsk-lab1 –-omit-header
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:testowa:-wx
default:mask::rwx
default:other::r-x

Opcja -k kasuje domyślne uprawnienia.

Windows

Poniższe obrazki ilustrują działanie ACL w systemie Windows XP.

System plików NTFS umożliwia związanie z każdym plikiem (lub katalogiem) list kontroli dostępu. Dostęp do prostych ustawień ACL pliku jest możliwy z poziomu np. Eksploratora Windows w opcji Właściwości (menu Plik lub kontekstowe). Rozszerzone listy ACL są dostępne po wyborze uprawnień Zaawansowanych.


System Windows nie zapewniał obsługi ACL dla swoich pierwotnych systemów plików FAT (FAT16 i FAT32). W Windows CE 6 wprowadzono obsługę ACL dla systemu plików exFAT, jednak w późniejszych wersjach systemu Windows nie została ona wprowadzona.

Podsumowanie

Zalety ACL:

  • Elastyczność, możliwość nadawania dowolnie skomplikowanych uprawnień bez konieczności tworzenia dużej liczby grup.
  • Ułatwienie migracji, tworzenia i konfigurowania heterogenicznych środowisk z systemami operacyjnymi Windows i Linux (oprogramowanie Samba wspiera ACL).

Problemy: nie wszystkie narzędzia wspierają ACL:

  • Edytory, które automatycznie zapisują zawartość w nowym pliku, a następnie zmieniają jego nazwę na oryginalną, mogą tracić informację o rozszerzonych uprawnieniach.
  • Programy archiwizujące (np. tar) nie potrafią zapisywać informacji o listach kontroli dostępu.

Jedną z metod radzenia sobie z drugim problemem jest zapamiętywanie informacji ACL. Na przykład polecenie:

% getfacl -R --skip-base . >backup.acl

spowoduje zapisanie do pliku "backup.acl" informacji o ACL z całego drzewa systemu plików (opcja -R) z pominięciem domyślnych uprawnień (--skip-base). Używając polecenia setfacl z opcją --restore=backup.acl, można potem przywrócić rozszerzone uprawnienia.

Czytaj też

man 5 acl

man do poleceń: getfacl, setfacl, chmod, umask

Ćwiczenia

Ćwiczenie 1

1. Sprawdź czy istnieje użytkownik "testowy", a jeżeli nie to załóż konto o takim loginie.

2. Stwórz katalog "bsk1" z prawami 0755 i obejrzyj standardowe uprawnienia oraz listę rozszerzonych uprawnień do tego katalogu.

3. Dodaj (rozszerzone) uprawnienia do odczytu, zapisu i przeszukiwania do powyższego katalogu użytkownikowi "testowy". Ponownie sprawdź uprawnienia.

4. Zaloguj się jako "testowy" i sprawdź, czy możesz zapisać jakiś plik do katalogu "bsk1" stworzonego w poprzednim punkcie.

5. Zabierz grupie właściciela prawo do pisania dla katalogu "bsk1".

6. Zaloguj się jako "testowy" i sprawdź, czy możesz zapisać jakiś plik do katalogu "bsk1" stworzonego w poprzednim punkcie. Wyjaśnij powody zaistniałej sytuacji.

7. Po zakończeniu ćwiczenia usuń katalog "bsk1" wraz z zawartością.

Ćwiczenie 2

1. Stwórz katalog "bsk2" z prawami 0777 i obejrzyj standardowe uprawnienia oraz listę rozszerzonych uprawnień do tego katalogu.

2. Dodaj (rozszerzone) uprawnienia do odczytu i przeszukiwania do powyższego katalogu użytkownikowi "testowy".

3. Zaloguj się jako "testowy" i sprawdź, czy możesz zapisać jakiś plik do katalogu "bsk2" stworzonego w poprzednim punkcie. Wyjaśnij powody zaistniałej sytuacji.

4. Po zakończeniu ćwiczenia usuń katalog "bsk2" wraz z zawartością.

Ćwiczenie 3

1. Sprawdź, czy istnieje grupa "testowa", a jeżeli nie, to załóż grupę o takiej nazwie.

2. Stwórz katalog "bsk3" z prawami 0750. Jakie uprawnienia będą miały pliki założone w tym katalogu?

3. Stwórz plik "plik3a" w katalogu "bsk3".

4. Dodaj domyślne uprawnienia do katalogu "bsk3": do odczytu, zapisu i wykonywania dla grupy "testowa" oraz do odczytu i wykonywania dla pozostałych.

5. Stwórz plik "plik3b" oraz katalog "kat3" w katalogu "bsk3".

6. Porównaj uprawnienia obiektów z katalogu "bsk3".

7. Po zakończeniu ćwiczenia usuń katalog "bsk3" wraz z zawartością.


System rejestrujący - syslog

Jądro systemu, usługi systemowe i różne aplikacje zapisują informacje o swoim działaniu w dziennikach systemowych (logach). Dlatego pierwszym miejscem, do którego należy zajrzeć, kiedy jakaś usługa nie uruchamia się poprawnie, jest odpowiedni dziennik.

W systemach uniksowych i linuksowych dominującym systemem rejestracji zdarzeń jest syslog. Poznamy bliżej jedną z jego nowszych wersji o nazwie rsyslog.

Pliki dzienników

Pliki dzienników znajdują się z reguły w katalogu:

/var/log

Ważniejsze pliki które możesz tam znaleźć to :

  • messages lub syslog - główny dziennik systemowy
  • dmesg - komunikaty o urządzeniach wykrytych w trakcie startu systemu i o ładowanych sterownikach do tych urządzeń, do ich obejrzenia można posłużyć się programem dmesg
  • boot.log - komunikaty skryptów startowych
  • daemon.log - komunikaty usług
  • kern.log - wszystkie komunikaty generowanie przez jądro
  • auth.log - komunikaty pochodzące z części systemu odpowiedzialnej za uwierzytelnianie użytkowników (np. informacje o poleceniach wykonanych przez sudo)
  • mail.log - komunikaty związane z obsługą poczty
  • wtmp - zapisy logowania użytkowników do systemu, do ich oglądania służy polecenie last
  • lastlog - informacja o ostatnich logowaniach, do jej oglądania służy polecenie lastlog

Wpis do dziennika jest najczęściej pojedynczym wierszem zawierającym datę i czas wystąpienia zdarzenia, a także jego rodzaj i poziom ważności.

Konfigurowanie demona (r)syslog - podstawowe reguły

Za zbieranie informacji o działaniu systemu i umieszczania ich w plikach odpowiada usługa systemowa syslogd (lub nowsza rsyslogd). Plikiem konfiguracyjnym dla syslogd jest /etc/syslog.conf a dla rsyslogd /etc/rsyslog.conf (zachowana jest zgodność wstecz).

(r)syslog umożliwia sortowanie komunikatów ze względu na źródło ich pochodzenia i stopień ważności oraz na kierowanie ich w różne miejsca: do plików, na terminale użytkowników a także na inne komputery.

Plik konfiguracyjny opisuje reguły systemu rejestrowania. Podstawowy format jest następujący:

usługa.poziom <co najmniej jeden znak tabulacji> 	przeznaczenie

Usługa określa z jakiej części systemu pochodzi informacja. Może przyjąć następujące wartości: auth, authpriv, cron, daemon, kern, ftp, local0-7, lpr, mail, mark, news, syslog, user, uucp.

Poziom określa priorytety komunikatów. Wszystkie wiadomości o tym lub wyższym priorytecie trafiają do dziennika. Poziomy ważności są następujące (w kolejności rosnącego znaczenia): debug, info, notice, warning (warn), error (err), crit, alert, emerg (panic).
Znak "=" przed nazwą poziomu wskazuje, że należy zbierać wiadomości o dokładnie takim poziomie, a "!" oznacza "oprócz tego i wyższych poziomów". Symbol "*" oznacza wszystkie usługi i poziomy a "none" - "żaden poziom". W pojedynczej regule może występować wiele usług oddzielonych przecinkami lub par usługa-poziom oddzielonych średnikami.

Przeznaczenie określa gdzie trafiają zebrane komunikaty. Może to być między innymi:

  • plik - należy podać pełną ścieżkę np. /var/log/messages
  • łącze nazwane (przydatne przy debugowaniu) - nazwa łącza jest poprzedzona znakiem |
  • terminal np. tty6
  • maszyna zdalna - nazwa maszyny poprzedzona jest znakiem @, np. @192.168.0.1
  • lista użytkowników np: root,admin (stara składnia) lub :omusrmsg:root,admin (składnia rsyslog); * lub :omusrmsg:* spowoduje wyświetlenie komunikatu wszystkim zalogowanym użytkownikom
  • śmietnik: ~

Nazwa pliku poprzedzona "-" oznacza, że system plików nie powinien być synchronizowany po zapisaniu każdego wpisu do dziennika (włączone buforowanie).

Przykład

mail.info		/var/log/mail.log

Powyższy wpis spowoduje, że komunikaty systemu pocztowego o poziomach info i wyższych będą trafiały do pliku /var/log/mail.log a następujący:

*.emerg;user.none	             *

że wszystkie komunikaty awaryjne oprócz takich, które są generowane przez procesy użytkownika, pojawią się na ekranach wszystkich zalogowanych użytkowników.

Przykładowy plik rsyslog.conf znajdziesz na końcu scenariusza.

Aby zmusić demona (r)syslog działającego nieprzerwanie do ponownego odczytania pliku konfiguracyjnego należy wysłać do niego sygnał HUP. Pid procesu demona jest zapisany w pliku /var/run/rsyslogd.pid, więc właściwe polecenie ma następującą postać:

% kill -HUP $(cat /var/run/(r)syslogd.pid)

Co można zrobić również w następujący sposób:

% /etc/init.d/rsyslog restart

Do sprawdzenia poprawności składniowej pliku konfiguracyjnego służy polecenie:

% rsyslogd -f /etc/rsyslog.conf -N1

Nowe możliwości rsyslog

System rejestrujący pozwala także na korzystanie z tzw. modułów - wtyczek zapewniających różnorodną funkcjonalność. Polecenia dołączenia odpowiednich modułów powinny znaleźć się na początku pliku konfiguracyjnego. Dzięki schematom (templates) można określić format logowanej wiadomości.

Rsyslog umożliwia także filtrowanie wiadomości na podstawie jej zawartości. Udostępnia operacje porównywania takie jak: contains, isequal, startswith, regex. Ogólna postać polecenia jest następująca:

:własność,[!]operacja, "wzorzec"

gdzie najczęściej wykorzystywaną własnością jest :msg (treść komunikatu).

Przykład

:msg,contains,"iptables"                     /var/log/iptables.log
:msg,regex,"fatal .* error"                   /var/log/fatal-error.log

Rsyslog może także zapisywać informacje do baz danych MySQL lub PostgreSQL (po instalacji pakietu rsyslog-mysql lub rsyslog-pgsql). Jako miejsce przeznaczenia można wtedy podać nazwę tabeli.

Kolejną możliwością rsyslog jest wybór protokołu TCP lub RELP zamiast UDP. Nazwę maszyny przeznaczenia należy poprzedzić znakiem @@ (TCP) lub :omrelp: (RELP). Wcześniej należy załadować odpowiedni moduł.

Po instalacji rsyslog domyślnie czas jest zapisywany w skróconej formie: np. 2016-10-05 14:17:42 odpowiada za to poniższa linia w pliku konfiguracyjnym (by włączyć dokładne zapisywanie czasu - trzeba zamienić ją na komentarz).

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Logger

Polecenie logger jest interfejsem do systemu syslog z poziomu interpretera poleceń (powłoki). Warto je wykorzystać do testowania zmian w pliku konfiguracyjnym. Na przykład aby sprawdzić regułę:

local2.info		/tmp/test.log

możesz wydać polecenie:

% logger -p local2.info "test local2 info"

Logrotate

Samo zbieranie i czytanie dzienników to nie wszystko o co powinien zadbać administrator - na maszynach z setką intensywnie pracujących użytkowników mogą one przyrastać bardzo szybko powodując przepełnienie systemu plików. Należy pamiętać, że samo skasowanie pliku nie rozwiązuje problemu (i-węzeł pliku nie zostanie zwolniony, dopóki plik nie zostanie zamknięty). Aby ułatwić zadania administratorowi system udostępnia polecenie logrotate, które umożliwia rotację plików z dziennikami, ich kompresję, przesyłanie pocztą do użytkowników i usuwanie. Jest zazwyczaj uruchamiany codziennie jako zadanie regularne przez podsystem cron. Jego plik konfiguracyjny to /etc/logrotate.conf

Analiza dzienników

Istnieją również narzędzia wspomagające analizowanie dzienników, tworzące odpowiednie raporty i przesyłające je pod wskazany adres. Przykładami takich narzędzi są swatch i logcheck.

Zobacz też

man rsyslog.conf
man rsyslogd
man logger
man logrotate

http://www.rsyslog.com/doc/rsyslog_conf.html

Alternatywa dla syslog: systemd

Ćwiczenia

1. Przejrzyj zawartość katalogu /var/log. Sprawdź czasy ostatniej modyfikacji plików. Czy znajdują się tam pliki skompresowane? Wyświetl ostatnie wpisy wybranych logów (skorzystaj z tail).

2. Wykonaj polecenie sudo su, a następnie sprawdź, w którym pliku pojawiła się informacja o tym (przydatne może okazać się polecenie ls -ltr).

3. Znajdź w plikach konfiguracyjnych logrotate zasady rotowania plików dla kern.log i syslog.

4. Wykonaj polecenia dmesg i last.

5. Przeczytaj /etc/rsyslog.conf i przy pomocy polecenia logger sprawdź kilka reguł. Spróbuj wskazać komunikaty, które trafiają do więcej niż jednego dziennika.

6. Zmodyfikuj plik konfiguracyjny i skorzystaj z polecenia logger do wysłania komunikatu do wszystkich użytkowników, wybranego użytkownika, na wybrany terminal, na inny komputer.

7. Zastosuj filtrowanie wiadomości na podstawie jej zawartości.

ZałącznikWielkość
rsyslog.conf_.txt2.56 KB