FileGuards czyli implementacja operacji na plikach przez użytkownika

Post on 18-Jan-2016

28 views 0 download

description

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. - PowerPoint PPT Presentation

Transcript of FileGuards czyli implementacja operacji na plikach przez użytkownika

FileGuardsczyli implementacja operacji na plikach przez użytkownika

Rafal@Wijata.com

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