160 likes | 312 Views
FileGuards czyli implementacja operacji na plikach przez użytkownika. Rafal@Wijata.com. 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.
E N D
FileGuardsczyli implementacja operacji na plikach przez użytkownika Rafal@Wijata.com
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, itp). • Rozwiązanie transparentne dla programów!
Strażnik – jak ? • Dodatkowa funkcja systemowa fglink. • Funkcje rejestracji strażników [un]register_fgfunc • Parametry = nazwa + file_operations • W strukturze file dodatkowa file_operations • Funkcja open() podmienia f_ops jeśli plik pilnowany. • Tak uzyskujemy transparencję dla klientów User process sys_open Request Open() If (guarded & module_registered) { remember orig f_ops; f_ops = our_f_ops; }; Requests Read(), Write(), etc. Calls our wrappers !
Strażnik – właściwości • Minimalna modyfikacja jądra • Tylko 16 nowych/zmodyfikowanych linii kodu ! • Na razie całość ma 2000 linii. • Włączanie w konfiguracji jądra. • Automatyczne ładowanie modułów • Flaga fg_allow (/proc/fs)
Strażnik – akcje • Co może podmieniona funkcja ? • Wykonać operację i zwrócić wynik. • Zwrócić błąd. • Wykonać jakąś czynność, wywołać oryginalną funkcję z jądra, zmodyfikować wynik. • Poprosić jądro o wykonanie funkcji jak zwykle. • [ Jeśli brak funkcji , jądro wykonuje standardowy kod ]
Strażnik – moduł użytkownika • Osobne struktury (działa jako moduł) • Sam rejestruje procedury obsługi w jądrze w imieniu procesów użytkownika • Zajmuje się wymianą danych między jądrem i procesami
Strażnik – komunikacja z procesami • Komunikacja za pomocą urządzeń /dev/fguX • Restrykcyjny protokół = bezpieczeństwo ? • Komunikacja: żądanie – odpowiedź. • Jądro nie przyjmuje żądań – tylko odpowiedzi. • Ścisłe komunikaty • { magic, cmd, nr, sid, pid, datalen, data } • Dane również maja strukturę zależną od funkcji. • Kolejki komunikatów: do wysłania i do odebrania
Strażnik – proces Odczytaj MINOR z /dev/fgu0 Zarejestruj nazwę i obsługiwane funkcje poprzez /dev/fguMINOR Zamknij /dev/fgu0 While (true) { odczytaj komunikat sprawdź typ komunikatu, wykonaj odpowiednie akcje wygeneruj komunikat odpowiedzi i wyślij do jądra } • Cała komunikacja odbywa się przez urządzenie /dev/fguMINOR, Jądro nie zaakceptuje danych od innego procesu niż ten, który otworzył urządzenie.
Strażnik – moduł Strażnik systemowa tablica otwartych plików Proces /dev/fguX STRZEŻONY PLIK systemowa tablica sesji Struktura FGU_DATA Wygeneruj żądanie Komunikaty
Strażnik – moduł Strażnik systemowa tablica otwartych plików Proces /dev/fguX STRZEŻONY PLIK systemowa tablica sesji Struktura FGU_DATA Odczytaj odpowiedź Komunikaty
Strażnik – czego brak ? • Podmiany inode_operations, a przynajmniej permission() • W module użytkownika nie ma jak zaimplementować niektórych funkcji (mmap). • readv/writev – ale to nie jest brak !
Strażnik – Wydajność CPU = 572 743 000 Hz Przykładowo: 170 = 0.29 microsek, 426 = 0.74 microsek
Strażnik – Wydajność 170 = 0.29 microsek, 19305 = 33 microsek
Strażnik – Dalsze plany • Rozwijanie projektu • Utrzymywanie patchy • Może nawiązanie kontaktu z ludźmi od MonaFS • http://www.wijata.com/fileguard • Obrona pracy