Bezpieczeństwo interoperacyjnego hostingu Gerard Frankowski, Zespół Bezpieczeństwa PCSS 4. Konferencja MIC Nowoczesne technologie bliżej nas Poznań, 04.03.2010 1
Agenda Wprowadzenie Zespół Bezpieczeństwa PCSS Bezpieczeństwo w MIC Sesja internetowa mechanizm i zagrożenia Implementacja sesji PHP w mieszanymśrodowisku hostingowym Pytania, dyskusja 2
Zespół Bezpieczeństwa PCSS Zespół Bezpieczeństwa PCSS istnieje od 1996r. Zabezpieczanie infrastruktury PCSS Bezpieczeństwo w projektach R&D Szkolenia, transfer wiedzy Badania własne Usługi zewnętrzne Ciekawsze badania z ostatnich lat Sieci bezprzewodowe w Poznaniu Raport nt. bezpieczeństwa bankowości elektronicznej Bezpieczeństwo serwerów WWW (Apache, MS IIS) Bezpieczeństwo sklepów internetowych http://security.psnc.pl 3
Bezpieczeństwow MIC Ochrona infrastruktury MIC Szkolenia bezpieczeństwa Więcej informacji w programie szkoleń http://mic.psnc.pl/szkolenia Badania poziomu bezpieczeństwa technologii Microsoft (2007-08) Audyty bezpieczeństwa dla administracji i MŚP (2007) Konferencje, MS Speaker Biuro Interoperacyjny hosting 4
Dlaczego interoperacyjnyhosting? Dlaczego zajmujemy się interoperacyjnym hostingiem? Odchodzenie od jedynie słusznych zestawów Sytuacje, w których wygodnie jest stosować np. PHP na Windows (dostępność / cena pracowników czy oprogramowania) Zawsze lepiej mieć wybór! Jak używać takich mieszanych systemów bezpiecznie? Temat na dziś: sesja internetowa PHP w bazie danych MS SQL Server 5
Sesja internetowa Protokół HTTP(s) jest bezstanowy, tj. nie umożliwia kojarzenia połączenia z użytkownikiem Sesja wyodrębnione połączenie konkretnego użytkownika z serwerem Identyfikowana przez session_id Wymaga zastosowania dodatkowych mechanizmów Możliwości przesłania danych sesji Ukryte pola formularzy Ciąg adresowy (URL) Ciasteczka (cookies) 6
Możliwości przechowywania stanu sesji PHP Pliki w specjalnym katalogu Baza danych ASP.NET Pamięć procesu serwera Baza danych Ciekawe pytanie: czy można zaimplementować mechanizm sesji wspólny dla obu języków? Więcej na szkoleniu jeszcze w tym półroczu! 7
Możliwości przechowywania stanu sesji PHP Pliki w specjalnym katalogu Baza danych ASP.NET Pamięć procesu serwera Baza danych Ciekawe pytanie: czy można zaimplementować mechanizm sesji wspólny dla obu języków? Więcej na szkoleniu jeszcze w tym półroczu! 8
PHP domyślna konfiguracja Katalog wskazywany przez session.save_path Domyślnie podkatalog instalacji PHP, np. D:\php\sessions Sposób na zmianę/odczyt: edycja pliku konfiguracyjnego lub funkcja session_save_path() Jak to działa? Kod PHP: session_start(); $_SESSION['parametr'] = "MIC"; 9
PHP domyślny magazyn sesji Identyfikator sesji: np. ocnttnh1mk2klm22tqj1q6ge84 Plik sesji Zawartość 10
Dlaczego sesje są takie ważne? Rozróżnianie użytkowników (logowanie) Wykradając identyfikator sesji można podszyć się pod innego użytkownika Kradzież ciasteczek z identyfikatorem sesji jest możliwa np. przy pomocy powszechnych dziś ataków XSS Zagrożenia dla identyfikatora sesji Przewidzenie Wymuszenie (fixation) Kradzież 11
Plik czy baza danych? Specyfika Możliwość odczytu obiektu przy pomocy przeglądania systemu plików (także z poziomu aplikacji webowej) Ważne jest odpowiednie zlokalizowanie repozytorium danych sesji (np. inna partycja niż aplikacje webowe) Większy problem przy współdzielonym hostingu lub wielu usługach (np. hosting i konta shellowe) Przechowywanie danych sesji w bazie jest nie mniej bezpieczne, a umożliwia lepszą kontrolę nad tymi danymi Można oprzeć się na bezpieczeństwie silnika bazy danych (ale nie tylko!) 12
Konfiguracja PHP Jak zmusić PHP, aby przechowywał stan sesji we wskazanej bazie danych? Funkcja boolsession_set_save_handler( callback$open, callback $close, callback $read, callback $write, callback $destroy, callback $gc) Możliwość napisania własnego, całkowicie dedykowanego systemu obsługi sesji! Wiele możliwości (także popełnienia błędów) 13
Funkcje zwrotne open wykonywana podczas otwarcia sesji close podczas zamknięcia sesji read podczas czytania danych sesji write podczas pisania danych sesji destroy w przypadku niszczenia sesji gc uruchamiana przez odśmiecaczmechanizmu sesji 14
Pytanie konkursowe To jeszcze nie koniec! O czym jeszcze, oprócz zdefiniowania funkcji zwrotnych i wywołania session_set_save_handler, musimy pamiętać? 15
16
Podłączenie do bazy danych MS SQL Przygotowanie tabeli Definicja funkcji zwrotnych Wywołanie funkcji sesji w pliku PHP Wynikiem powinny być nowe rekordy dodane do tabeli bazy danych MSSQL Poniższy przykład jest maksymalnie uproszczony i nie uwzględnia wielu istotnych aspektów! 17
Przygotowanie tabeli W tabeli dla prostoty przechowywać będziemy tylko identyfikator sesji oraz pojedynczy parametr tekstowy CREATE DATABASE mic_test; USE mic_test; CREATE TABLE mic_sessions (sess_id varchar(30) NOT NULL, parametr varchar(30), PRIMARY KEY(sess_id)); 18
Funkcja zwrotna mic_open() function mic_open($save_path, $session_name) { global $dbconn; $dbconn= mssql_connect(servername, DB_USER, DB_PASS); if($dbconn == NULL) die('polaczenie z MS SQL niemozliwe'); if(!mssql_select_db("mic_test")) die('niemozliwy wybor bazy danych); return TRUE; } 19
Funkcja zwrotna mic_close() function mic_close() { global $dbconn; $closed = mssql_close($dbconn); $dbconn = NULL; } return $closed; 20
Funkcja zwrotna mic_read() function mic_read($id) { global $dbconn; //filtrowanie! $strquery= "SELECT parametr FROM mic_sessionswhere sess_id='". $id. "';"; $res = mssql_query($strquery, $dbconn); if($res&& ssql_num_rows($res)) { $arrecord = mssql_fetch_assoc($res); return $arrecord['parametr']; } return ''; } } 21
Funkcja zwrotna mic_write() function mic_write($id, $data) { global $dbconn; //filtrowanie! $strquery= "INSERT INTO mic_sessionsvalues('". $id. "','". $data. "');"; } return mssql_query($strquery, $dbconn); 22
Sesje są już w bazie danych 23
Jak rozbudować mechanizm sesji? Filtrowanie danych Bardziej zaawansowana obsługa błędów Implementacja znaczników czasowych oraz wygaszanie sesji po odpowiednio krótkim czasie Mechanizm ekspercki rozpoznawanie unikalnego użytkownika na podstawie nagłówków HTML I wiele innych Zachęcamy do testów! 24
Podsumowanie Mechanizm sesji pozwala na ominięcie ograniczeń protokołu HTTP Dane sesji można przechowywać na różne sposoby Język PHP umożliwia utworzenie własnego, zaawansowanego mechanizmu obsługi sesji z wykorzystaniem serwera baz danych (także MSSQL) Wdrożenie najprostszej wersji tego mechanizmu jest wręcz trywialne ale to dopiero początek 25
Więcej informacji PHP Security Guide: Sessions http://phpsec.org/projects/guide/4.html Guru Speak: Storing Sessions in a Database http://shiflett.org/articles/storing-sessions-in-a-database Funkcje MS SQL Server w PHP http://php.net/manual/en/book.mssql.php Książka: Ch. Shiflett PHP Bezpieczne programowanie, Helion, 2006 http://helion.pl/ksiazki/phpbep.htm 26
Informacje kontaktowe Autor prezentacji gerard.frankowski@man.poznan.pl Centrum Innowacji Microsoft: http://mic.psnc.pl mic@man.poznan.pl PCSS http://www.pcss.pl Zespół Bezpieczeństwa PCSS http://security.psnc.pl security@man.poznan.pl 27
Pytania i dyskusja Dziękujęzauwagę! 28