Watchdogs / Guardians czyli operacje na plikach kontrolowane przez u ż ytkownika
Watchdog (powtórka) Watchdog to demon w trybie użytkownika Implementacja wybranych wywołań systemowych na i-węźle. Jeśli i-węzeł jest katalogiem, to także na całym katalogu. Korzysta z funkcji systemowych, ale to jego wyniki są zwracane do użytkownika ACL, kompresja, biff, [dir|file]view, date, logowanie Kanały komunikatów jako interfejs
Ostrzezenie ! Proszę nie pytać o prędkość rozwiązania ! Będą jakieś wyniki... Prędkość rozwiązania nie jest najistotniejsza. Główne cele to: Użyteczność Bezpieczeństwo Możliwości
Pomysł Jest bardzo stary (1988r.) Brian Bershad & Brian Pinkerton Watchdogs – Extending the UNIX FileSystem Pierwowzór, na którym będę się opierał pisząc swoją pracę Podobno jest nawet gdzieś implementacja dla 4.3BSD
Strażnik - wprowadzenie Tradycyjne systemy plików – obsługa w jądrze OS Nikłe (jeśli w ogóle) możliwości rozszerzenia funkcjonalności i zachowań plików. Strażnik – wyprowadzenie obsługi plików poza jądro OS Nieuprzywilejowane programy mogą obsługiwać pliki (lub katalogi) Więcej kosztują tylko podmienione funkcje na metryczkach (przełączenia kontekstu, kopiowanie, szeregowanie, opóźnienia w czytaniu z dysku). Rozwiązanie transparentne dla programów!
Strażnik – jak ? Komunikacja nadal za pomocą jądra systemu Jeśli plik jest pilnowany, to watchdog jest proszony o wykonanie operacji w imieniu jądra. Odpowiedź również przechodzi przez jądro. Tak uzyskujemy transparencję dla klientów Kernel User processes Requests Open, read etc... FS interface FS implementation File 1 File 2 Watchdog
Strażnik – komunikaty Żądanie od procesu Przekierowanie do strażnika = komunikat 1. Wykonanie operacji (może korzystać z usług jądra, nie ma bezpośredniego dostępu do systemu plików) 2. Zakazanie operacji = kod błędu 3. Zanotować operację, i poprosić jądro o wykonanie w standardowy sposób Odpowiedź do OS = komunikat Jeden strażnik może pilnować wiele plików. Proces wysyłający żądanie nie wie czy plik jest pilnowany.
Strażnik – implementacja Nowa funkcja systemowa wd_link(char *file, char *watchdog) Mechanizm komunikacji proces-jądro Implementacja takiego mechanizmu ? Wykorzystanie netlinka ? Nowy typ plików – wmc ? Kolejna funkcja createwmc() Nowy typ deskryptora pliku DTYPE_WDCHANNEL Zarządca strażników (?)
Strażnik – wmc Komunikat zawiera: typ, id_sesji, wiadomość Uwaga dla operacji read/write Strażnik może mieć ograniczony bufor, może odczytać mniej bajtów niż żądano ! W jądrze dwie dodatkowe tablice Tablica sesji Tablica otwartych wmc.
Strażnik – wmc Struktura Proces Strażnik systemowa tablica otwartych plików WMC STRZEŻONY PLIK systemowa tablica sesji SESJA systemowa tablica WMC STRUKTURA WMC Komunikaty
Strażnik – Zarządca Rola jądra – minimalna Znajdowanie WMC na podstawie nazwy strażnika Pamiętamy numery i-node i rdev strażnika. Rola zarządcy – uruchamiać i zabijać. Wiadomość do jadra – IAmChief Jądro w przypadku braku WMC wysyła żądanie do zarządcy, ten uruchamia właściwego strażnika. Może nie zabijać często używanych strażników Strażników można łatwo debugować Zupełnie jak normalne programy !
Strażnik – Aplikacje Wdacl – listy dostępu Wdcompact – kompresja w locie Wdbiff – reagujący na zmiany pliku Wdview – rożne zawartości dla różnych użytkowników (również katalogu) Wddate – aktualna data z pliku podmiana funkcji systemowych na pliki Wdvfs – wirtualny system plików
Strażnik – Wydajność Średnie czasy dla read/write na dużych plikach (ms) Bez strażnika Strażnik deffered Strażnik Not deffered Strażnik z cachem Read 1K read-ahead Read 1K no read-ahead Write 1K Średnie czasy dla open (ms) Bez strażnika Strażnik żywy Strażnik martwy Absolutna nazwa Nazwa relatywna Średnie czasy dla read(strażnik) vs read(pipe) (ms) Dane z cacheuplik 1K, pipe K, strażnik
Strażnik – Główne pomysły zmiany Przeniesienie zarządcy (lub części) do jądra przyspieszy przypadek, gdy strażnik martwy brak możliwości manipulowania regułami zabijania strażników. Brak funkcji createwmc() jako systemowej. Strażnicy używają stdin i stdout do komunikacji. Zamiast tablic hashe lub drzewa (?) Pamięć dzielona między procesami zarządcy i klienta, lub remapowanie pamięci (buforów na operacje r/w) (?) Przeniesienie całości do jądra ?! (moduły)
Inny pomysł - TRON Tylko prawa dostępu ! Oparty na zasadzie domen wykonywania się programu Dodatkowe prawa dostępu dla domeny. Prawa są przyznawane dla procesu, nie pliku lub użytkownika !. Cele Obrona przed trojanami, wirusami, pomyłkami, suidami, powrotami z chroota itp.
TRON – prawa dostępu init = pełne prawa dostępu zwykłe prawa UNIXowe (również użytkownik po zalogowaniu) Prawa do plików maja typy read, write exec, del, chmod. Dla katalogów dodatkowo create i link. Pełne prawa oznaczają wszystkie prawa do /, czyli rwedmcl Prawa są nadawane do obiektów nazwanych np.: /bin/bash(ale /bin/sh nie jest tym objęty) Najpierw są sprawdzane prawa dostępu domeny, potem zwykłe UNIXowe. Obowiązują wszystkie procesy !
TRON – działanie Jądro Dodatkowa struktura dla domen wykonywania. Proces Dodatkowe dowiązanie do domeny w jakiej jest uruchomiony Fork nie zmienia domeny, dziecko jest w tej samej. Tron_fork, w razie potrzeby tworzy nową domenę. Dlaczego nie set_domain/create_domain ??? Przestrzeganie praw Funkcje sprawdzające prawa dostępu są otoczone kodem TRONu. W razie próby złamania praw jest wołana funkcja porażki.
TRON – nadawanie praw Funkcje systemowe tron_grant i tron_revoke Nasze prawa możemy przekazać komuś innemu, trzeba je również odwołać – nie dzieje się to automatycznie. Funkcja tron_get_cap_list Zmiany w jądrze zatem niewielkie ! Polecenia Tron, tron_loan Przykłady.plan Tron –p / -p all ~ftp(jakiekolwiek prawa tylko w katalogu ~ftp) Tron –p rw ~/Mailbox –c pine(pine tylko do poczty)
TRON – podsumowanie Prosty, dobry i efektyny !!! without full test TRON rights capab capab capab Forktest Filetest Average in microseconds over tries
Modify-on-Access File System Kolejne podejście – modyfikacja funkcji systemowych w locie. Transformacje danych (strumieni) Rejestracja nowych funkcji w systemie Funkcje te działają tak jak pipey, np. read() Można transformować wszystkie file_operations Jest to nowy system plików, ale np. ext2 można zamountować jako MonAFS.
MonA FS - VFS VFS na pliku.tar.gz ? Dokładnie tak ja w mc, tylko ze funkcje gunzip i untar ładowane do jądra jako moduły. Chronienie /etc/passwd Tak samo, potrzebna tylko kolejna funkcja. I tak dalej – takie same możliwości jak dla strażników. Sprawa uprzywilejowanego kodu Bezpieczeństwo i czasochłonność
MonA FS jak Stuktura tansformacji Umiejscowienie przed pulą buforów
MonA FS - interfejs Ograniczenia: Transformacje nie są zapamiętywane permanentnie. Operacje nie są uprzywilejowane fd = open(``empty_heap'', O_RDWR); /* Open empty ``heap'' file */ ioctl(fd, PUSH_INPUT, ``extract_max_heap'') /* Push transformations */ ioctl(fd, PUSH_OUTPUT, ``insert_heap'') Linki transformacji – nowość w systemie plików Tym razem permanentne lnx raw_heap heap -i extract_max_heap -o insert_heap
MonA FS - wyniki Open() + ioctl()s
MonA FS - wyniki Read() Identyczne transformacje w aplikacji są wolniejsze !