This shows you the differences between two versions of the page.
|
gsr:laboratoare:laborator-03 [2015/10/29 03:03] alexandru.carp [Alti clienti HTTP] |
gsr:laboratoare:laborator-03 [2016/10/27 13:21] (current) alexandru.carp |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Laborator 03: Servicii web ====== | + | ~~SHOWSOLUTION~~ |
| + | |||
| + | ====== Laborator 03: Serviciile de DHCP si SSH ====== | ||
| + | |||
| + | ===== 01. Pregatirea infrastructurii virtuale (OpenStack) ===== | ||
| + | |||
| + | Incepand cu acest laborator vom lucra si pe topologia virtuala OpenStack. Aceeasi topologie va fi folosita si la proiect. | ||
| + | Acest task are ca scop crearea infrastructurii virtuale. | ||
| + | |||
| + | <note> | ||
| + | Fiecare student va avea propriul subnet, din care va aloca adrese pentru masinile virtuale. Puteti gasi alocarea aici: | ||
| + | https://docs.google.com/spreadsheets/d/14QgTyn41hzinWqHaUQ16kf9_UeUcwXNQ__MR5C6Q70U/pubhtml | ||
| + | </note> | ||
| + | |||
| + | <note> | ||
| + | Pentru crearea contului, a masinilor virtuale si a legaturilor dintre ele, urmati pasii de aici: | ||
| + | http://ocw.cs.pub.ro/courses/gsr/resurse/proiect | ||
| + | </note> | ||
| + | |||
| + | ===== 02. DHCP ===== | ||
| + | |||
| + | ==== a) Demo: Funcționarea dhclient ==== | ||
| + | |||
| + | <note> | ||
| + | Executati acest demo pe masina fizica din laborator. | ||
| + | </note> | ||
| + | |||
| + | Clientul de DHCP este reprezentat în Linux de comanda ''dhclient''. La o rulare a comenzii ''dhclient'' este interogat serverul DHCP pentru transmiterea unei adrese. | ||
| + | |||
| + | Pentru a testa această funcționalitate, vom dezactiva configurația curentă și apoi vom face o nouă configurație. | ||
| + | |||
| + | Pentru dezactivare identificăm interfața activă prin rularea comenzii<code> | ||
| + | ip a s | ||
| + | </code> | ||
| + | |||
| + | Apoi dezactivăm configurația interfeței:<code> | ||
| + | sudo ip a f dev <interface> | ||
| + | </code> | ||
| + | unde ''<interface>'' este numele interfeței. | ||
| + | |||
| + | Apoi solicităm o nouă adresă IP pentru interfață folosind comanda<code> | ||
| + | sudo dhclient <interface> | ||
| + | </code> | ||
| + | unde ''<interface>'' este numele interfeței. | ||
| + | |||
| + | Putem urmări în ''/var/log/syslog'' mesajele afișate de clientul ''DHCP''. | ||
| + | |||
| + | Dacă dorim să dăm release la configurație, putem folosi comanda<code> | ||
| + | sudo dhclient -r <interace> | ||
| + | </code> | ||
| + | unde ''<interface>'' este numele interfeței. | ||
| + | |||
| + | ==== b) Configurare server de DHCP ==== | ||
| + | |||
| + | <note> | ||
| + | Acest task se va executa pe infrastructura virtuala. | ||
| + | Masina ''Sn-R'' va are rol de server DHCP, iar masina ''D'' va avea rol de client DHCP. | ||
| + | </note> | ||
| + | |||
| + | Instalati serverul ''isc-dhcp-server'' pe masina ''Sn-R''. | ||
| + | |||
| + | Creati configurația serverului de DHCP în ''/etc/default/isc-dhcp-server'' și în ''/etc/dhcp/dhcpd.conf''. Verificați că serverul este pornit și ascultă conexiuni pe portul ''68'' UDP. | ||
| + | |||
| + | Urmăriți în fișierele de tip jurnal de pe fiecare sistem (''/var/log/syslog'') mesaje afișate de clientul și serverul DHCP. | ||
| + | |||
| + | Folosiți, pe client, comanda | ||
| + | <code> | ||
| + | sudo dhclient eth0 | ||
| + | </code> | ||
| + | pentru reinterogarea serverului DHCP, care duce la conduce la generarea de noi mesaje de jurnalizare. | ||
| + | |||
| + | ===== 03. SSH ===== | ||
| + | |||
| + | ==== a) Conectare prin SSH între mașina virtuală ''Sn-R'' și ''D'' === | ||
| + | |||
| + | Încercați să vă conectați prin SSH de pe mașina virtuală ''Sn-R'' pe masina virtuala ''D'' folosind o comandă de forma<code> | ||
| + | ssh student@192.168.N.X | ||
| + | </code> | ||
| + | |||
| + | Acum încercați și invers, să vă conectați de pe mașina virtuală ''D'' pe masina virtuala ''Sn-R'' | ||
| + | |||
| + | Apoi configurați autentificarea fără parolă (pe bază de chei) de la utilizatorul ''student'' de pe mașina virtuală ''Sn-R'' la utilizatorul ''student'' și la utilizatorul ''root'' de pe mașina virtuală ''D''. Va trebui să ajungă cheia publică a utilizatorului ''student'' de pe masina virtuala ''Sn-R'' în fișierul ''~/.ssh/authorized_keys'' din directorul home al utilizatorilor ''student'' și ''root'' pe mașina virtuală ''D''. | ||
| + | |||
| + | <note tip> | ||
| + | Dacă simțiți că "scârțâiți", pentru documentare despre folosirea SSH recomandăm să urmariți [[:rl:labs:08|laboratorul 8 de RL: Securizarea unui server]]. | ||
| + | </note> | ||
| + | |||
| + | /* | ||
| + | ==== Adăugarea cheii asistentului pentru conectare la mașina virtuală ==== | ||
| + | |||
| + | Obiectivul acestui exercițiu este ca asistentul să ajungă pe mașina voastră virtuală de pe laptop-ul său. Pentru aceasta trebuie să faceți două lucruri: | ||
| + | - Să adăugați cheia publică a asistentului (vă va da el link la cheie) în contul utilizatorului ''student'' de pe mașina virtuală. | ||
| + | - Să folosiți DNAT (//port forwarding//) pe **sistemul fizic** astfel încât conexiunile pe portul ''2222'' pe sistemul fizic să ajungă pe portul ''22'' pe mașina virtuală. | ||
| + | |||
| + | Pentru pasul 2, pe **sistemul fizic** folosiți o comandă de forma<code> | ||
| + | sudo iptables -t nat -A PREROUTING -i ethX -p tcp --dport 2222 -j DNAT --to-destination <IP-vm>:22 | ||
| + | sudo sysctl -w net.ipv4.ip_forward=1 | ||
| + | </code> | ||
| + | unde: | ||
| + | * ''ethX'' este ''eth0'' sau ''eth1'' sau ''eth2'' este interfața de Internet a sistemului fizic, cu o adresă din spațiul ''172.16.4.0/22'' | ||
| + | * ''<IP-vm>'' este adresa IP a mașinii virtuale (adresa din rețeaua ''192.168.56.0/24'' | ||
| + | |||
| + | Iar pe **mașina virtuală** rulați comanda de mai jos pentru a crea o rută din mașina virtuală către rețeaua fizică<code> | ||
| + | sudo ip route add 172.16.4.0/22 via 192.168.56.1 | ||
| + | </code> | ||
| + | Cu această rută veți permite pachetelor să se întoarcă din mașina virtuală către cheia SSH a asistentului. | ||
| + | |||
| + | Asistentul va încerca conexiunea la adresa IP a sistemului vostru fizic pe portul ''2222'' și, dacă e totul bine, va ajunge pe mașina voastră virtuală. | ||
| + | |||
| + | <note tip> | ||
| + | Dacă simțiți că scârțâiți legat de NAT/DNAR, informații despre folosirea ''iptables'' pentru DNAT găsiți în [[:rl:labs:09|laboratorul 9 de RL: Translatarea de adrese]]. | ||
| + | </note> | ||
| + | |||
| + | <note tip> | ||
| + | Dacă greșiți ceva în configurarea iptables, curățați regulile folosind comanda<code> | ||
| + | sudo iptables -t nat -F | ||
| + | </code> | ||
| + | </note> | ||
| + | */ | ||
| + | |||
| + | ==== b) Configurare remote logging pentru SSH ==== | ||
| + | |||
| + | Configurați daemon-ul syslog de pe mașina virtuală ''D'' să livreze mesajele de jurnalizare emise de SSH (de facilitatea ''auth'') către daemonul de syslog de pe masina virtuala ''Sn-R''. Adică daemonul de syslog de pe masina virtuala ''Sn-R'' va fi listener pentru mesajele livrate de pe mașina virtuală ''D''. | ||
| + | |||
| + | Realizați conexiuni SSH de pe mașina virtuala ''Sn-R'' spre mașina virtuală ''D'' pentru a declanșa mesaje de jurnalizare. | ||
| + | |||
| + | /* | ||
| + | ==== Bonus: Conectare cu X Forwarding ==== | ||
| + | |||
| + | Realizați o conexiune SSH care folosește X Forwarding **de la sistemul fizic** la mașina virtuală. Porniți utilitarul ''xterm''. Instalați orice pachete sunt necesare pentru a permite rularea utilitarului ''xterm''. | ||
| + | */ | ||
| + | |||
| + | ==== Bonus: Pornirea manuală a sshd === | ||
| + | |||
| + | Porniți serviciul SSH manual, pe mașina virtuală ''D'', folosind executabilul ''/usr/sbin/sshd'' astfel incat să asculte conexiuni pe portul ''22''. Încercați conexiuni către masina virtuala ''D'' de pe masina virtuala ''Sn-R''. | ||
| + | |||
| + | Rulați serverul de SSH sub ''strace'' (eventual folosind opțiunea ''-f'') și urmăriți ce se întâmplă atunci când se încearcă noi conexiuni. | ||
| + | /* | ||
| ===== Demo ===== | ===== Demo ===== | ||
| Line 7: | Line 144: | ||
| ==== Instalare Apache si configurari de baza ==== | ==== Instalare Apache si configurari de baza ==== | ||
| - | * Pe masina virtuala, instalati serverul Apache (pachetul **apache2**). | + | * Instalati serverul Apache (pachetul **apache2**). |
| - | * Apoi, verificati functionarea acestuia folosind un browser web. Va veti conecta de pe masina fizica pe adresa IP a masinii virtuale. | + | * Apoi, verificati functionarea acestuia folosind un browser web. Va veti conecta pe URL-ul http://localhost |
| === Site default === | === Site default === | ||
| Line 15: | Line 152: | ||
| * Asa cum ati observat anterior, serverul Apache serveste in mod implicit un fisier HTML. | * Asa cum ati observat anterior, serverul Apache serveste in mod implicit un fisier HTML. | ||
| - | * Gasiti fisierul **index.html** servit de server-ul Apache in ierarhia de fisiere de pe masina virtuala. | + | * Gasiti fisierul **index.html** servit de server-ul Apache in ierarhia de fisiere. |
| - | * Hint: Configuratia site-ului default se afla in ''/etc/apache2/sites-available/default'' | + | * Hint: Configuratia site-ului default se afla in ''/etc/apache2/sites-available/000-default.conf'' |
| * Hint: Observati directiva ''DocumentRoot'' | * Hint: Observati directiva ''DocumentRoot'' | ||
| Line 42: | Line 179: | ||
| Un astfel de client in mod text, non-interactiv, este **wget**. | Un astfel de client in mod text, non-interactiv, este **wget**. | ||
| - | * Folositi ''wget'' pentru a descarca fisierul ''index.html'' servit de server-ul de pe masina virtuala. Ca parametru pentru ''wget'' veti folosi acelasi URL ca si in browser. | + | * Folositi ''wget'' pentru a descarca fisierul ''index.html'' servit de Apache. Ca parametru pentru ''wget'' veti folosi acelasi URL ca si in browser. |
| == Descarcare recursiva == | == Descarcare recursiva == | ||
| - | * Creati urmatoarea ierarhie de fisiere in ''/var/www'' pe masina virtuala: | + | * Creati urmatoarea ierarhie de fisiere in ''/var/www/html'': |
| <code> | <code> | ||
| test/ | test/ | ||
| Line 60: | Line 197: | ||
| * Folosind un browser in mod grafic, verificati ca puteti naviga prin acea ierarhie. | * Folosind un browser in mod grafic, verificati ca puteti naviga prin acea ierarhie. | ||
| - | * Folosind ''wget'', descarcati in mod recursiv tot ce este sub ''/var/www/test''. | + | * Folosind ''wget'', descarcati in mod recursiv tot ce este sub ''/var/www/html/test''. |
| * Hint: ''man wget'', ''/recursive'' | * Hint: ''man wget'', ''/recursive'' | ||
| * Specificati sa NU fie descarcate fisierele ale caror nume incepe cu ''index.html''. Hint: ''man wget'', ''/reject''. | * Specificati sa NU fie descarcate fisierele ale caror nume incepe cu ''index.html''. Hint: ''man wget'', ''/reject''. | ||
| Line 79: | Line 216: | ||
| Acesta deschide o conexiune catre un host, pe un port specificat (TCP sau UDP), apoi va trimite catre server toate datele primite pe standard input. | Acesta deschide o conexiune catre un host, pe un port specificat (TCP sau UDP), apoi va trimite catre server toate datele primite pe standard input. | ||
| - | * Folosind ''nc'', conectati-va pe adresa IP a masinii virtuale, portul 80. | + | * Folosind ''nc'', conectati-va pe localhost, portul 80. |
| * Apoi, introduceti manual o cerere HTTP pentru fisierul ''index.html''. Veti folosi protocolul HTTP 1.0: | * Apoi, introduceti manual o cerere HTTP pentru fisierul ''index.html''. Veti folosi protocolul HTTP 1.0: | ||
| Line 93: | Line 230: | ||
| Server-ul Apache permite utilizatorilor sa serveasca fisiere din propriile directoare home. Fisierele trebuie stocate in ''/home/username/public_html'', iar acestea vor fi accesate folosind un URL de forma ''http://server/~username''. | Server-ul Apache permite utilizatorilor sa serveasca fisiere din propriile directoare home. Fisierele trebuie stocate in ''/home/username/public_html'', iar acestea vor fi accesate folosind un URL de forma ''http://server/~username''. | ||
| - | * Pe masina virtuala, creati utilizatorul ''gsr''. | + | * Creati utilizatorul ''gsr''. |
| * Creati directorul ''public_html'' si mai multe fisiere in interiorul acestuia. | * Creati directorul ''public_html'' si mai multe fisiere in interiorul acestuia. | ||
| Line 102: | Line 239: | ||
| * Incercati din nou sa accesati URL-ul. | * Incercati din nou sa accesati URL-ul. | ||
| - | /* | + | ==== PHP === |
| + | |||
| + | * Creati in ''/var/www/html'' un fisier cu numele ''index.php'' care sa contina un cod PHP simplu (de exemplu, sa afiseze un mesaj): | ||
| + | <code> | ||
| + | <?php echo "Hello, world!"; ?> | ||
| + | </code> | ||
| + | |||
| + | * Apoi, dintr-un browser in mod grafic incercati sa accesati fisierul ''index.php'' de pe server. Ce observati? Script-ul PHP se ruleaza pe server? De ce? | ||
| + | |||
| + | * Instalati pachetul corespunzator modulului PHP pentru Apache (''libapache2-mod-php5''). | ||
| + | * Verificati ca modulul a fost activat. Hint: ''/etc/apache2/mods-enabled''. | ||
| + | * Accesati din nou fisierul ''index.php''. Ce observati acum? | ||
| + | |||
| + | ==== Autentificare basic ==== | ||
| + | |||
| + | In anumite cazuri, este util sa restrictionam accesul catre anumite directoare ale site-ului. O modalitate este folosind feature-ul de autentificare din protocolul HTTP. | ||
| + | |||
| + | * Creati subdirectorul ''secret'' in ''/var/www/html''. | ||
| + | * In acest subdirector, creati un fisier cu numele ''.htaccess'', care sa specifice ca se doreste autentificare: | ||
| + | <code> | ||
| + | AuthName "restricted" | ||
| + | AuthType Basic | ||
| + | AuthUserFile /usr/local/my.htpasswd | ||
| + | Require valid-user | ||
| + | </code> | ||
| + | * Apoi, folosind comanda ''htpasswd'', creati un user ''bob'' in fisierul ''/usr/local/my.htpasswd'' | ||
| + | * In fisierul ''apache2.conf'', setati directiva ''AllowOverride'' la ''All'' | ||
| + | * Restartati serviciul Apache si verificati ca incercand sa accesati, din browser, directorul ''secret'', se cere autentificare. | ||
| + | |||
| ~~SHOWSOLUTION~~ | ~~SHOWSOLUTION~~ | ||