FileGuards czyli implementacja operacji na plikach przez użytkownika
description
Transcript of FileGuards czyli implementacja operacji na plikach przez użytkownika
FileGuardsczyli implementacja operacji na plikach przez użytkownika
Strażnik - wprowadzenie
Tradycyjne systemy plików – obsługa w jądrze OSNikł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 OSNieuprzywilejowane 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_operationsFunkcja open() podmienia f_ops jeśli plik pilnowany.Tak uzyskujemy transparencję dla klientów
sys_openUser process
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ądraTylko 16 nowych/zmodyfikowanych linii kodu !
Na razie całość ma 2000 linii.
Włączanie w konfiguracji jądra.Automatyczne ładowanie modułówFlaga 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ł
Proces
Strażniksystemowa tablica otwartych plików
/dev/fguX
STRZEŻONY PLIK
systemowa tablica sesji
Struktura FGU_DATA
KomunikatyWygeneruj żądanie
Strażnik – moduł
Proces
Strażniksystemowa tablica otwartych plików
/dev/fguX
STRZEŻONY PLIK
systemowa tablica sesji
Struktura FGU_DATA
KomunikatyOdczytaj odpowiedź
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
Open() in kernel_spaceBez
strażnikaStrażnik bez funkcji Strażnik z funkcją
pustą
Nazwa relatywna
125/111112
404(440)/261380
440(488)/380395
Nazwa absolutna
198/166170
430(460)/275399
472(499)/380426
Strażnik – Wydajność
170 = 0.29 microsek, 19305 = 33 microsek
Open() in user_spaceBez
strażnikabez funkcji funkcja
pustafunkcja z sesją
Nazwa absolutna
198166170
1086867918
240303218
19305
152880227
17441
Strażnik – Wydajność
Read() – czytanie datykernel user
388627093279
340433284433183
Strażnik – Wydajność
Read() – czytanie cryptnone kernel user
Max 4K 281782819(285)
6043
4192923532(313)
26338
720409395(835)
36900
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