This shows you the differences between two versions of the page.
uso:teme:tema-3-evil-hidden-page [2017/11/23 11:26] dennis.plosceanu |
uso:teme:tema-3-evil-hidden-page [2017/11/23 20:43] (current) dennis.plosceanu |
||
---|---|---|---|
Line 22: | Line 22: | ||
<note important> | <note important> | ||
- | Deadline: **8 Decembrie, ora 23:55**\\ | + | Deadline: **29 Noiembrie, ora 23:55**\\ |
- | Timp de lucru: **9 zile**\\ | + | Timp de lucru: **6 zile**\\ |
- | Punctaj: **0.6 puncte** din nota finală\\ | + | Punctaj: **0.8 puncte** din nota finală\\ |
- | Formular pentru trimitere temă: https://goo.gl/39NdTB\\ | + | Formular pentru trimitere temă: https://goo.gl/forms/vjzVNNczk5A29uLI3\\ |
</note> | </note> | ||
<note> | <note> | ||
**Actualizări enunț:** | **Actualizări enunț:** | ||
- | * **Task04**: A fost adăugată o precizare referitor la ce înseamnă prima adresă IP de pe o interfață de rețea în contextul acestui exercițiu (prima adresă în ordinea în care le afișează comanda ''ip address show''). | ||
- | * **Task04**: A fost adăugată o precizare legată de interfața de loopback și adresa MAC a acesteia. | ||
- | **Actualizări utilitar ''uso'': <color red>versiunea v16 - "Gold Blackbird"</color>** | ||
- | * Nu există | ||
- | **Actualizări checker: <color red>versiunea 3</color>** | ||
- | * **Task04**: Înainte de versiunea 2, checkerul presupunea că pe fiecare mașină virtuală există interfața de rețea ''enp0s8''. | ||
- | * Înainte de versiunea 3, nu erau acceptate containerele care erau pornite cu ID-ul imaginii ''i386/ubuntu'', ci doar cu numele. | ||
</note> | </note> | ||
Line 46: | Line 39: | ||
* folosirea utilitarelor de lucru cu mașini aflate la distanță; | * folosirea utilitarelor de lucru cu mașini aflate la distanță; | ||
* noțiuni simple de shell scripting; | * noțiuni simple de shell scripting; | ||
- | * înlănțuiri de comenzi și comunicare eficientă interproces. | + | * stocarea și prelucrarea datelor |
===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ||
Line 81: | Line 74: | ||
* **[2p]** Creați o imagine a containerului ''dimension-c137'' cu numele ''dimension-c137/ubuntu''. **Hint**: ''docker commit'' | * **[2p]** Creați o imagine a containerului ''dimension-c137'' cu numele ''dimension-c137/ubuntu''. **Hint**: ''docker commit'' | ||
- | ==== Task 02 (25p) ==== | + | ==== Task 02 (15p) ==== |
Checkerul va genera la prima sa rulare 3 containere care folosesc imaginea creată la Task 1: | Checkerul va genera la prima sa rulare 3 containere care folosesc imaginea creată la Task 1: | ||
Line 93: | Line 86: | ||
* **[5p]** Configurați în mod static temporar, pe interfața ''eth1'' a containerului ''rick'', a 11-a adresă asignabilă din rețeaua ''192.168.137.0/24''. | * **[5p]** Configurați în mod static temporar, pe interfața ''eth1'' a containerului ''rick'', a 11-a adresă asignabilă din rețeaua ''192.168.137.0/24''. | ||
* **[5p]** Configurați în mod static temporar, pe interfeța ''eth1'' a containerului ''morty'', ultima adresă asignabilă din rețeaua ''192.168.137.0/24''. Testați conectivitatea între cele 2 containere prin intefețele ''eth1'' folosind comanda ''ping''. | * **[5p]** Configurați în mod static temporar, pe interfeța ''eth1'' a containerului ''morty'', ultima adresă asignabilă din rețeaua ''192.168.137.0/24''. Testați conectivitatea între cele 2 containere prin intefețele ''eth1'' folosind comanda ''ping''. | ||
- | * **[5p]** Configurați cele 2 containere astfel încât fiecare să se poată conecta la celălalt prin ''ssh'' cu credențialele de mai sus. Conexiunea va folosi adresa IP asignată intefețelor eth1, nu eth0. | + | * **[5p]** Configurați cele 2 containere astfel încât fiecare să se poată conecta la celălalt prin ''ssh'' cu credențialele de mai sus. Conexiunea va folosi adresa IP asignată intefețelor ''eth1'', nu ''eth0''. |
<note important> | <note important> | ||
Line 100: | Line 93: | ||
- | ==== Task 03 (20p) ==== | + | ==== Task 03 (25p) ==== |
- | * **[2p]** Opriți interfața eth0 de pe containerul ''rick''. | + | * **[2p]** Opriți interfața eth0 de pe containerul ''summer''. |
* **[6p]** Configurați în mod static permanent, pe interfața ''eth1'' a containerului ''summer'' o adresă astfel încât să poată da ping cu succes pe adresele setate pe containerele rick si morty (atenție și la adresa setată pe interfața ''usobridge'' de pe host).Un container nu poate fi rebootat, testați faptul că ați făcut configurările corecte folosind comanda ''service networking restart'' în containerul ''summer''. | * **[6p]** Configurați în mod static permanent, pe interfața ''eth1'' a containerului ''summer'' o adresă astfel încât să poată da ping cu succes pe adresele setate pe containerele rick si morty (atenție și la adresa setată pe interfața ''usobridge'' de pe host).Un container nu poate fi rebootat, testați faptul că ați făcut configurările corecte folosind comanda ''service networking restart'' în containerul ''summer''. | ||
* **[6p]** Faceți configurările necesare atfel încât containerul ''summer'' să aibă conexiune la internet. Testați folosind comanda ''ping -c 2 8.8.8.8''. Configurarea trebuie să fie permanentă. | * **[6p]** Faceți configurările necesare atfel încât containerul ''summer'' să aibă conexiune la internet. Testați folosind comanda ''ping -c 2 8.8.8.8''. Configurarea trebuie să fie permanentă. | ||
- | * **[6p]** Configurați containerul ''morty'' altfel încât comanda ''ping google.com'' să se execute cu succes. | + | * **[6p]** Configurați containerul ''morty'' astfel încât comanda ''ping google.com'' să se execute cu succes. |
- | * **[5p]** Faceți configurările necesare pe mașina virtuală de USO (''usovm'') astfel încât să fie posibilă conectarea la containerele ''rick'', ''mortyi'' și ''summer'' folosind numele lor. De exemplu: | + | * **[5p]** Faceți configurările necesare pe mașina virtuală de USO (''usovm'') astfel încât să fie posibilă conectarea la containerele ''rick'', ''morty'' și ''summer'' folosind numele lor. De exemplu: |
<code bash> | <code bash> | ||
student@usovm:~$ ping rick | student@usovm:~$ ping rick | ||
Line 114: | Line 107: | ||
==== Task 04 (15p) ==== | ==== Task 04 (15p) ==== | ||
- | * **[10p]** Scrieți un script aflat în directorul ''/home/student/tema3/'' de pe mașina virtuală de USO (''usovm''), cu numele ''iface-info.sh'' care afișează informații despre o interfață de rețea primită ca parametru. Rezultatul trebuie să respecte următorul format (exact 3 linii): | + | * **[5p]** Generați o pereche de chei [[https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm|ECDSA]] (id_ecdsa și id_ecdsa.pub) de lungime 384 biți în directorul ''/home/student/tema3/keys'' de pe mașina virtuală de USO (''usovm''). NU setați niciun passphrase pentru ele. |
- | <code bash> | + | * **[5p]** Faceți configurările necesare astfel încât userul ''student'' de pe host (''usovm'') să se poată conecta pe userii de pe cele 3 containere (''rick'', ''morty'', ''summer''), fără parolă, folosind cheile generate la subpunctul anterior (va trebui să faceți posibilă conexiunea prin ''ssh'' si pe containerul summer cum ați făcut și la task-ul 2 pentru ''rick'' și ''morty''). |
- | student@usovm:~$ /home/student/tema3/iface-info.sh enp0s8 | + | * **[5p]** Scrieți un script ''~/tema3/task4/send_to_all.sh'' (în home-ul userului ''student'' de pe mașina virtuală) care primește o cale către un fișier ca argument și trimite prin ssh (Hint: ''man scp'') fișierul primit ca argument în directoarele home ale utilizatorilor ''rick'', ''morty'' și ''summer'' de pe containerele asociate fără a cere parolă. Puteți să presupuneți că argumentul primit de script este tot timpul valid. |
- | MAC: 08:00:27:0E:C4:CA | + | |
- | IP: 172.28.128.4 | + | |
- | Netmask: 255.255.255.0 | + | |
- | </code> | + | |
- | Restricții și precizări: | + | |
- | * scriptul trebuie să scrie rezultatul la ''stdout''; | + | |
- | * în caz că nu primește niciun argument trebuie să afișeze mesajul ''Gimme more args'' la ''stderr''; | + | |
- | * în cazul în care primește un singur argument, îl va trata ca pe o interfață de pe host (mașina virtuală de USO); | + | |
- | * în cazul în care interafața oferită prin primul argument nu există, scriptul va afișa la ''stderr'' mesajul ''No such interface''; | + | |
- | * dacă intefața nu are IP/Netmask se va afișa 'N/A' în locul valorilor respective. | + | |
- | * în caz de eroare (nu primește niciun argument sau interfața nu există), scriptul va ieși cu valoarea de retur ''1''; | + | |
- | * în caz de succes, scriptul va ieși cu valoarea de retur ''0''; | + | |
- | * dacă interfața are mai multe adrese IP se va afișa doar prima (în ordinea dată de comanda ''ip address show''); | + | |
- | * adresa MAC trebuie afișată cu upper case, de exemplu ''08:00:27:0E:C4:CA'', nu ''08:00:27:0e:c4:ca''; | + | |
- | * în cazul în care interfața primită ca parametru este ''lo'' se va afișa MAC-ul acesteia ca fiind ''00:00:00:00:00:00'' (așa cum raportează ''ip address show''). | + | |
- | * **[5p]** Extindeți scriptul ''iface-info.sh'' pentru a putea primi două argumente. Primul argument este numele unei interfețe, iar al doilea este numele unui container pornit. **Hint**: ''docker exec'' | + | ==== Task 05 (25p) ==== |
- | Restricții și precizări suplimentare față de primul subpunct: | + | |
- | * în cazul în care scriptul primește două argumente, primul argument este numele unei interfețe, iar al doilea este numele unui container pornit. Scriptul va afișa informații despre interfața dată, aceasta fiind o interfață din container; | + | |
- | * în cazul în care containerul dat ca argument nu există sau nu este pornit, scriptul va afișa la ''stderr'' mesajul ''No such container''; | + | |
- | * dacă nici interfața, nici containerul nu există (sau nu rulează), prioritate are mesajul de eroare pentru container, afișându-se la ieșierea de eroare ''No such container''; | + | |
- | * dacă se primesc mai mult de două argumente, începând cu al treilea acestea vor fi ignorate. | + | |
+ | În urma primei rulări a checkerului pe acest task, pe cele 3 containere (''rick'', ''morty'', ''summer'') se va popula câte o bază de date folosind ''sqlite3''. | ||
+ | * **[5p]** Creați în mașina virtuala folosind ''sqlite3'' (o sa trebuiască instalat pachetul) o bază de date numită ''rickandmorty.db'' (în ''/home/student/tema3/task5'') și în ea o tabelă nouă numită ''characters'' cu 3 coloane: | ||
+ | * name - string de maxim 50 de caractere, nu poate fi null | ||
+ | * age - număr întreg | ||
+ | * episode - string de maxim 100 de caractere, nu poate fi null | ||
+ | * **[7p]** Scrieți un script ''select.sh'' în ''/home/student/tema3/task5'' de pe mașina virtuală care primește 2 argumente: | ||
+ | * numele unei baze de date (path către un fișier ''*.db'') | ||
+ | * numele unei tabele din baza de date | ||
+ | Scriptul va trebui: | ||
+ | * să selecteze din tabelă intrările care corespund utilizatorului curent (coloana name din tabelă conține numele utilizatorului care rulează scriptul) | ||
+ | * să scrie rezultatul selecției în format ''csv'' într-un fișier numit ''query.csv'' în directorul home al utilizatorului curent | ||
- | ==== Task 05 (20p) ==== | + | Pentru testare va trebui să aveți o tabelă în care să inserați date (preferabil creați o altă tabelă cu aceleași coloane ca și ''characters'' pentru că checker-ul va șterge la rulare toate datele din aceasta). |
- | În urma primei rulări a checkerului pentru acest task, pe mașina virtuală de USO (''usovm'') veți găsi fișierul ''/home/student/1024_gmail_passwords.txt''. | + | * **[7p]** Copiați scriptul ''select.sh'' pe toate cele 3 containerele în home-urile userilor asociați (scriptul trebuie să se numească tot ''select.sh''). |
- | * **[3p]** Copiați fișierul ''/home/student/1024_gmail_passwords.txt'' în toate cele 3 containere ''uso1'', ''uso2'' și ''uso3'' în directorul /var/passwords/<CONTAINER_NAME>, unde <CONTAINER_NAME> este numele containerului. De exemplu, pentru containerul ''uso1'', fișierul se va găsi în urma copierii la calea ''/var/passwords/uso1/1024_gmail_passwords.txt'' de pe containerul ''uso1''. | + | Scrieți un script nou numit ''wabalubadubdub.sh'' în ''/home/student/tema3/task5'' care primește ca argumente: |
- | * **[2p]** Copiați fișierul ''/uso/1024_yahoo_passwords.txt'' de pe containerul ''uso3'' în directorul ''/home/student/'' de pe host (mașina virtuală de USO). | + | * numele unui user de pe un container |
- | * **[5p]** Faceți configurările necesare pe mașina virtuală de USO (''usovm'') astfel încât să fie posibilă conectarea la containerele ''uso1'' și ''uso2'' folosind numele lor, nu doar adresele IP (setate la Taskul #2) ale interfețelor ''**eth1**'' de pe containere. De exemplu: | + | * ip-ul unui container |
- | <code bash> | + | * numele unei baze de date (path către un fișier ''*.db'') |
- | student@usovm:~$ ping uso1 | + | * numele unei table in baza de date |
- | PING uso1 (192.168.42.11) 56(84) bytes of data. | + | Scriptul va trebui să ruleze **prin ssh** scriptul ''select.sh'' pe userul și ip-ul primite ca argument. |
- | 64 bytes from uso1 (192.168.42.11): icmp_seq=1 ttl=64 time=0.047 ms | + | Scriptului ''select.sh'' i se vor da argumentele 3 și 4 (numele bazei de date si al tabelei). |
- | 64 bytes from uso1 (192.168.42.11): icmp_seq=2 ttl=64 time=0.052 ms | + | |
- | </code> | + | Apoi scriptul va trebui să copieze **prin ssh** (Hint: ''man scp'') fișierul rezultat în urma comenzii rulate (fișierul ''query.csv'') în **directorul curent** și cu numele ''query_remote.csv''. |
- | * **[5p]** Generați o pereche de chei [[https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm|ECDSA]] (id_ecdsa și id_ecdsa.pub) de lungime 384 biți în directorul ''/home/student/tema3/keys'' de pe mașina virtuală de USO (''usovm''). **NU** setați niciun passphrase pentru ele. | + | |
- | * **[5p]** Faceți configurările necesare astfel încât userul ''student'' de pe host (mașina virtuală de USO) să se poată conecta pe containerul ''uso1'' ca userul ''student'' , fără parolă, folosind cheile generate la subpunctul anterior. | + | <note important> |
+ | Atenție! Trebuie **neapărat** să rulați comanda **prin ssh**. Dacă rulați comanda folosind altceva (cum ar fi ''docker exec'') rezolvarea nu se va puncta (chair dacă checkerul vă dă punctajul). | ||
+ | </note> | ||
+ | |||
+ | * **[6p]** Extindeți scriptul să insereze datele din fișierul copiat în tabela creată de voi la primul punct al exercițiului. | ||
+ | |||
+ | <note tip> | ||
+ | Hints: | ||
+ | * http://www.sqlitetutorial.net/sqlite-import-csv/ | ||
+ | * http://tldp.org/LDP/abs/html/here-docs.html | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Nu trebuie să tratați cazurile cu input invalid. | ||
+ | </note> | ||
===== Task obligatoriu pentru toate temele (0p) ===== | ===== Task obligatoriu pentru toate temele (0p) ===== |