Sieci Komputerowe Laboratorium 5 - usługi sieciowe cz. 1 Maciej Szymański 28 kwietnia 2014 1. SSH SSH (Secure Shell) jest protokołem umożliwiającym zdalną pracę terminalową oraz transfer plików. Zapewnia on poufność transmisji (poprzez szyfrowanie), integralność (kontrola poprawności) i autoryzację (np. poprzez hasło lub certyfikat). SSH jest odporny na podsłuchiwanie i przejmowanie połączeń, natomiast nie gwarantuje bezpieczeństwa w przypadku prób łamania hasła, ataków na poziomie protokołów IP i TCP oraz statystyczną analizę ruchu. Schemat działania protokołu przebiega następująco: klient otwiera połączenie (TCP, domyślnie na porcie 22) wykonując polecenie ssh login@host (opcja -v pozwala zapoznać się z komunikatami wysyłanymi podczas transmisji) ustalenie numeru wersji protokołu (istnieją dwie główne wersję, różniące się przede wszystkim wykorzystywanymi algorytmami kryptograficzmymi) następuje identyfikacja serwera (np. poprzez algorytm RSA), wysyła on do klienta swój klucz, a także listę obsługiwanych metod autoryzacji oraz parametry sesji klient wybiera szyfr i przesyła zaszyfrowany klucz sesji na podstawie wymienionego na tym etapie klucza oraz hash a obliczane są klucze szyfrujące oraz podpisujące, są one zmieniane co pewien czas (np. co 1 GB przesłanych danych) serwer przesyła potwierdzenie zaszyfrowane na podstawie klucza otrzymanego od klienta połączenie w tym momencie zostaje zestawione, serwer jest zautoryzowany następnym etapem jest autoryzacja klienta, na podstawie np. hasła lub klucza publicznego (a) Ćwiczenie: Należy wyszukać i zainstalować klient i serwer SSH (pakiety openssh-server i opensshclient) (b) Ćwiczenie: Proszę zalogować się z konta na maszynie wirtualnej na konto na maszynie głównej. Spróbować uruchomić aplikację graficzną. (c) Ćwiczenie: Konfiguracja serwera ssh: plik /etc/ssh/sshd_config Proszę umożliwić zdalne uruchamianie aplikacji graficznych i uniemożliwić logowanie jako root (opcje X11forwarding i PermitRootLogin) (d) Ćwiczenie: Proszę ponownie zalogować się z konta na maszynie wirtualnej na konto na maszynie głównej (z opcją pozwalającą na zaufany X11forwarding) i spróbować uruchomić aplikację graficzną. (e) Ćwiczenie: Konfiguracja klienta ssh: plik /etc/ssh/ssh_config Proszę umożliwić, aby klient mógł automatycznie dodawać hosty do pliku ~/.ssh/known_hosts (opcja StrictHostKeyChecking) (f) Ćwiczenie: Konfiguracja logowania przy użyciu klucza (tak aby użytkownik user1 na komputerze host1 mógł się zalogować na konto użytkownika user2 na komputerze host2 przez ssh bez podawania hasła) stworzyć pliki id_rsa i id_rsa.pub w katalogu ~/.ssh/ za pomocą polecenia ssh-keygen -t rsa (na koncie użytkownika user1 na komputerze host1) plik ~/.ssh/id_rsa jest kluczem prywatnym, zatem nie należy go nikomu udostępniać plik ~/.ssh/id_rsa.pub kopiujemy (za pomocą polecenia scp - - składnia scp path/file user2@host2:path) na konto użytkownika user2 na komputerze host2 i dodajemy go do pliku ~/.ssh/authorized_keys2 1
folder ~/.ssh/ musi mieć tylko prawa odczytu i zapisu dla właścicela, a plik ~/.ssh/authorized_keys2 dodatkowo prawa odczytu dla innych W razie problemów proszę uruchomić ssh w trybie verbose. 2. WWW (APACHE) + PHP + MySQL Apache jest to jeden z najpopularniejszych serwerów HTTP. PHP to jeden z najpopularniejszych języków programowania używany do tworzenia stron WWW. MySQL to system zarządzania bazami danych za pomocą języka SQL. Schemat działania powyższego zestawu oprogramowania przebiega następująco: uruchamiając przeglądarkę i wpisując adres szukanego serwisu WWW, przeglądarka nawiązuje połączenie z serwerem na którym są uruchomione usługi umożliwiające dostęp do strony żądanie otrzymane od przeglądarki jest przechwytywane przez serwer Apache, który przetwarzając je uruchamia kod strony napisany w języku PHP PHP komunikuje się z bazą danych, pobiera dane, przetwarza je i zamienia na kod HTML, który zwraca serwerowi Apache serwer Apache wysyła kod HTML razem z obrazami umieszczonymi na stronie i stylami do przeglądarki, która wyświetla stronę (a) Ćwiczenie: Należy wyszukać i zainstalować serwer WWW (apache2), moduł PHP (libapache2- mod-php5) oraz serwer SQL (mysql-server libapache2-mod-auth-mysql php5-mysql) Test działania poprzez otwarcie w przeglądarce strony http://localhost/ (b) Ćwiczenie: Utworzyć skrypt PHP i zapisać go jako /var/www/phpinfo.php <?php phpinfo(); Test działania poprzez otwarcie w przeglądarce strony http://localhost/phpinfo.php (c) Ćwiczenie: Proszę skonfigurować serwer tak, aby wykorzystywał on protokół SSL, zapewniający poufność transmisji danych oraz uwierzytelnienie serwera utworzyć linki symboliczne w /etc/apache2/mods-enabled: ln -s../mods-available/ssl.load ln -s../mods-available/ssl.conf utworzyć link symboliczny w /etc/apache2/sites-enabled: ln -s../sites-available/default-ssl zrestartować serwer WWW sudo /etc/init.d/apache2 restart test: https://localhost/ (d) Ćwiczenie: Proszę stworzyć wirtualny serwer WWW utworzyć katalog serwera wirtualnego i plik index.html w nim mkdir /var/www/moja-strona dodać do pliku w /etc/apache2/sites-enabled/000-default: <VirtualHost *:80> DocumentRoot /var/www/moja-strona ServerName moja-strona </VirtualHost> zrestartować serwer WWW sudo /etc/init.d/apache2 restart dodać do pliku w /etc/hosts: 127.0.1.1 moja-strona test: http://moja-strona/ 3. Prosty serwis CMS 1 Poniższy przykład pozwoli stworzyć prosty system zarządzania treścią. Bazuje on na następującej klasie: 1 na podstawie: http://css-tricks.com/php-for-beginners-building-your-first-simple-cms/ 2
<?php class simplecms { var $host; var $username; var $password; var $table; public function display_public() {... public function display_admin() {... public function write() {... public function connect() {... private function builddb() {...?> Poniżej omówienie metod klasy: stworzenie tabeli w bazie danych private function builddb() { $sql = <<<MySQL_QUERY CREATE TABLE IF NOT EXISTS testdb ( title VARCHAR(150), bodytext TEXT, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) MySQL_QUERY; return mysql_query($sql); połączenie z bazą danych public function connect() { mysql_connect($this->host,$this->username,$this->password) or die("could not connect. ". mysql_error()); mysql_select_db($this->table) or die("could not select database. ". mysql_error()); return $this->builddb(); wyświetlenie formy z polem tekstowym public function display_admin() { return <<<ADMIN_FORM <form action="{$_server[ PHP_SELF ]" method="post"> <label for="title">title:</label> <input name="title" id="title" type="text" maxlength="150" /> <label for="bodytext">body Text:</label> <textarea name="bodytext" id="bodytext"></textarea> <input type="submit" value="create This Entry!" /> </form> ADMIN_FORM; zapisanie wpisanych danych w bazie danych public function write($p) { if ( $p[ title ] ) 3
$title = mysql_real_escape_string($p[ title ]); if ( $p[ bodytext ]) $bodytext = mysql_real_escape_string($p[ bodytext ]); if ( $title && $bodytext ) { $created = time(); $sql = "INSERT INTO testdb VALUES( $title, $bodytext, $created )"; return mysql_query($sql); else { return false; wyświetlenie danych z bazy danych public function display_public() { $q = "SELECT * FROM testdb ORDER BY created DESC LIMIT 3"; $r = mysql_query($q); if ( $r!== false && mysql_num_rows($r) > 0 ) { while ( $a = mysql_fetch_assoc($r) ) { $title = stripslashes($a[ title ]); $bodytext = stripslashes($a[ bodytext ]); $entry_display.= <<<ENTRY_DISPLAY <h2>$title</h2> <p> $bodytext ENTRY_DISPLAY; else { $entry_display = <<<ENTRY_DISPLAY <h2>this Page Is Under Construction</h2> <p> No entries have been made on this page. Please check back soon, or click the link below to add an entry! ENTRY_DISPLAY; $entry_display.= <<<ADMIN_OPTION <p class="admin_link"> <a href="{$_server[ PHP_SELF ]?admin=1">add a New Entry</a> ADMIN_OPTION; return $entry_display; Powyższą klasę można wykorzystać następująco (tworząc plik np. display.php, który będzie uruchamianą stroną): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 4
<head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>simple CMS with PHP</title> </head> <body> <div id="page-wrap"> <?php require_once( simplecms.php ); $obj = new simplecms(); /* CHANGE THESE SETTINGS FOR YOUR OWN DATABASE */ $obj->host = localhost ; $obj->username = root ; $obj->password = pass ; $obj->table = asd ; $obj->connect(); if ( $_POST ) $obj->write($_post); echo ( $_GET[ admin ] == 1 )? $obj->display_admin() : $obj->display_public();?> </div> </body> </html> $obj->display_public(); Ćwiczenie: na podstawie powyższego kodu, proszę utworzyć serwis CMS. Kod źródłowy znajduje się na stronie: fizyka.pw.edu.pl/~maszyman/dydaktyka/sk14l/ Powodzenia 5