Tema 2

* Publicare:

  • 26 Noiembrie 2019 10:00

* Termen de predare:

  • 11 Decembrie 2019 23:55 - deadline HARD

Tema constă în realizarea configurației unui set de exerciții pe o topologie simulată într-o mașină virtuală. Topologia este alcătuită din mașina guest și trei containere virtualizate cu ajutorul tehnologiei LXC. Mai multe detalii despre topologie găsiți la secțiunea Topologie.

Revizii:

  • 10.15.2019 22:00: a fost descoperit & rezolvat un bug în checker pentru task-ul 10, partea de download. Rulați t2update dacă vă pică testul ;)
  • 29.11.2019 23:47: mică precizare la task 10 (transfer binar).
  • 27.11.2019 16:25: rezolvat bugurile din checker de la task-urile *06 și *12. Dați t2update, enjoy ;) Voi face o re-evaluare pe VMchecker celor afectați.
  • 27.11.2019 14:00: acum imaginea este disponibilă și pe OpenStack: RL 2019 Tema2, luați cât e caldă ;)

Notare

Fiecare exercițiu are un punctaj propriu. Nota pe întreaga temă este dată de suma punctajelor acumulate în urma rezolvării fiecărui exercițiu.

Punctajul maxim care se poate obține pe întreaga temă este 100 de puncte. Acest punctaj este echivalent cu 1.2 puncte din nota finală.

Există exerciții bonus cu ajutorul cărora puteți obține 125 de puncte. Punctajul se trunchiază la 100 de puncte. Puteți rezolva exerciții bonus în schimbul exercițiilor obișnuite.

Nu este obligatorie rezolvarea tuturor exercițiilor. Exercițiile pot fi rezolvate în orice ordine, mai puțin în situația în care un exercițiu depinde de rezolvarea unui alt exercițiu.

Topologie

Mașina virtuală

Utilizare

  • Puteți rezolva tema atât folosind o mașină virtuală locală, cât și folosind infrastructura cloud OpenStack (NEW: RL 2019 Tema2).
  • Pentru autentificare, utilizați credențialele root/student sau student/student.
  • Notă: pe OpenStack, autentificarea cu username și parolă a fost dezactivată! Folosiți autentificarea cu chei, prezentată aici.

Rulare în VM local

  • Pentru a rula mașina virtuală a temei local, o puteți descărca de la acest URL (fixed 26.11.19 12:12, 1.6 GB arhivat .7z, 6.6 GB dimensiune reală).
  • VM-ul este compatibil atât cu VirtualBox (testat cu >= 5.2 și 6), cât și VMWare (toate edițiile, testat cu Workstation >= 15). Și, desigur, dacă vă pricepeți, merge rulat și prin qemu+kvm.
  • Accesul prin ssh cu parolă este activat, deoarece VM-ul rulează pe o rețea privată.
  • Dacă întâmpinați probleme, creați un proiect de mașină virtuală nouă și atașați-i disk-ul existent .vmdk.

Pași pentru accesare OpenStack

  • Urmăriți pașii Tutorial Cloud.
  • Nume imagine: RL 2019 Tema2
  • Tip instanță: m1.small (NU aveți nevoie de mai mult)
  • OBLIGATORIU: autentificarea cu user și parolă a fost dezactivată, folosiți EXCLUSIV chei publice ssh (pe care ar trebui s-o aveți deja configurată în cadrul laboratoarelor).

Atenție! NU distrugeți instanța mașinii virtuale până nu ați încărcat arhiva finală pe VMchecker și ați obținut punctajul dorit sau înainte de a fi siguri că nu veți mai avea nevoie să modificați nimic.

Pentru a rezolva tema este îndeajuns să prelucrați fișiere doar din directoarele /etc, /home și /root (atât pe host, cât și pe containere).

Checkerul nu va prelua alte modificări (mai ales, nu instalați pachete noi pe VM, acestea nu vor fi luate în considerare pe VMchecker).

Predarea temei

  1. Rulați scriptul următor pe mașina virtuală:
    root@host$ t2make
  2. Rezultatul este arhiva pe care o va salva în directorul curent.
  3. Încărcați arhiva pe https://vmchecker.cs.pub.ro.

Rezolvarea exercițiilor trebuie să se facă în mod persistent. La o repornire a mașinii virtuale, rezolvările trebuie să rămână active.

Folosiți comanda reboot să testați pe mașina voastră.

Verificarea temei

  • Pentru verificarea temei este disponibil și un checker local. Atenție: nu este substitut de troubleshooting.
    • Altfel spus, contează soluția voastră, nu checker-ul.
    • Dacă, dintr-o greșeală, checker-ul dă rezulat pozitiv în cazul unui exercițiu rezolvat greșit nu înseamnă că se va puncta. O eventuală actualizare a checker-ul va puncta corect.
    • Obiectivul trebuie să fie rezolvarea corectă a enunțului. Checker-ul vine ca o confirmare (ne dorim cât mai sigură) a acelei rezolvări.
    • Punctajul final este acordat de către VMchecker, ce validează rezolvarea finală. Dacă există neconcordanțe între punctajul obținut de checkerul local și acesta, asigurați-vă că ați respectat cerințele și avertismentele din enunț.

Nu ștergeți conținutul fișierului /root/.ssh/authorized_keys de pe containere. Permite autentificarea VMcheckerului pentru testarea finală.

  • Dacă sunt probleme sau aveți sugestii sau îmbunătățiri pentru checker, puteți să postați un mesaj pe thread-ul de pe forum;
  • Mașina virtuală conține o copie (binară) a checkerului și dispune de două scripturi pentru a face actualizarea și rularea sa mai simplă.
  • Comenzile de mai jos pot fi rulate indiferent de directorul in care ne aflăm.
  • Pentru a actualiza checker-ul:
    t2update
  • Pentru a rula checkerul:
    t2check
  • Exemple simple de folosire:
    root@host:~# t2check 11
    tests/test_11        ...............  10.00/10.00
    
    root@host:~# t2check 3
    tests/test_03        ...............  5.00/5.00
    
    root@host:~# t2check 16
    tests/test_16        ...............  5.00/5.00
    
    root@host:~# t2check 
    tests/test_01        ...............  10.00/10.00
    tests/test_02        ...............  10.00/10.00
    tests/test_03        ...............  5.00/5.00
    tests/test_04        ...............  5.00/5.00
    tests/test_05        ...............  5.00/5.00
    tests/test_06        ...............  10.00/10.00
    tests/test_07        ...............  10.00/10.00
    tests/test_08        ...............  5.00/5.00
    tests/test_09        ...............  7.00/7.00
    tests/test_10        ...............  8.00/8.00
    tests/test_11        ...............  10.00/10.00
    tests/test_12        ...............  7.00/7.00
    tests/test_13        ...............  8.00/8.00
    tests/test_14        ...............  10.00/10.00
    tests/test_15        ...............  10.00/10.00
    tests/test_16        ...............  5.00/5.00
    
    Total = [ 125.00/100.0 ]

Personalizarea temei

Temele sunt particularizate pentru fiecare student. Pentru a obține aceste date, accesați link-ul Generator Date Tema2. Pentru rularea acestui script sunt necesare introducerea numelui, prenumelui și a grupei.

Introduceți numele și prenumele fără diacritice (incorect: Ștefănescu, corect: Stefanescu) ȘI ASIGURAȚI-VĂ CĂ NU AVEȚI SPAȚIU ÎNAINTE SAU DUPĂ!

Dacă aveți mai multe prenume folosiți-l doar pe primul (incorect: Ion-Viorel, corect: Ion)

Introduceti grupa urmată de serie, nu invers (incorect: CA336, corect: 336CA)

Datele de particularizare introduse în acel script vor fi introduse şi în fişierul /root/tema2.txt, fișier care va conține doar:

  • prima linie: numele vostru (exact cum l-ați folosit în scriptul de generare anterior) - ex: Stefanescu
  • a 2-a linie: prenumele vostru (exact cum l-ați folosit în scriptul de generare anterior) - ex: Ion
  • a 3-a linie: grupa, fără spații (exact cum l-ați introdus în scriptul de generare anterior) - ex: 336CA

Nu introduceți în fișier datele generate de script. Introduceţi DOAR numele, prenumele și grupa, conform specificațiilor de mai sus.

Nu folosiți facilitatea de auto-complete a browser-elor deoarece datele generate nu vor fi corecte!

Informațiile generate anterior, vor fi folosite în enunțul temei cu următoarele notații:

  - $A = valoarea variabilei A
  - $B = valoarea variabilei B
  - $C = valoarea variabilei C
  - $D = valoarea variabilei D
  - $E = valoarea variabilei E
  - $F = valoarea variabilei F
  - $G = valoarea variabilei G
  - $H = valoarea variabilei H
  - $I = valoarea variabilei I
  - $J = valoarea variabilei J
  - $K = valoarea variabilei K

Discuții legate de temă

Toate discuțiile legate de probleme/întrebări/exerciții din tema de RL trebuie puse pe forumul temei. Reguli de utilizare ale acestui forum:

  • Nu se pun rezolvări pe forum.
  • Fiecare întrebare legată de un task trebuie pusă pe thread-ul dedicat acelui task.
  • În momentul în care puneți o întrebare, includeți în mesaj:
    • contextul în care a apărut problema pe care o semnalați
    • ce ați încercat să faceți pentru a repara problema
    • alte informații care pot descrie mai bine problema
    • dacă este vorba de rezolvarea unui task, cum ați verificat rezolvarea task-ului
  • Verificați dacă cineva nu a mai întâmpinat aceeași problemă și i-a fost oferit un hint sau o soluție (lurk before you leap).
  • Post-uri care nu sunt puse pe thread-ul corespunzător vor fi șterse.
  • Nu creați thread-uri noi de discuție. Vor fi șterse.

Subiecte

Toate configurațiile trebuie să fie persistente. Trebuie să fie active și după repornirea mașinii virtuale.

Va trebui să realizați primele 5 exerciții în ordine. Întrucât aceste exerciții oferă, în final, conectivitate la Internet, restul se vor baza pe acestea

Dacă folosiți mai multe scripturi (apelați dintr-un script alt script), folosiți căi absolute. Adică folosiți /root/scripts/make-juju.py în loc de ./make-juju.py.

NU INSTALAȚI NIMIC ÎN PLUS PE MAȘINA VIRTUALĂ! Dacă folosiți alte pachete, acestea nu se vor regăsi și pe vmchecker ⇒ nu luați punctajul.

Se recomandă citirea întregului set de exerciții înainte de rezolvarea temei. În mod asemănător, la rezolvarea unui exercițiu se recomandă citirea întregului subset de exerciții.

  1. (10 puncte) Adresare IPv4
    1. Configurați cu adrese IP toate legăturile din topologie, astfel:
      • Rețeaua red: 10.83.$A.4/30
      • Rețeaua green: 10.83.$A.8/30
      • Rețeaua blue: 10.83.$B.16/30
      • Sistemul host va avea prima adresă asignabilă, iar containerul pe cea de-a doua.
    2. Configurați rutarea IPv4 pentru a permite comunicarea între toate sistemele. Sistemele red, green și blue vor avea ruta default prin sistemul host.
  2. (10 puncte) Adresare IPv6
    1. Configurați adrese IPv6 pentru întreaga rețea astfel:
      • Rețeaua red 2001:83:$C::/64
      • Rețeaua green 2001:83:$D::/64
      • Rețeaua blue 2001:83:$E::/64
      • Sistemul host va avea prima adresă asignabilă, iar containerul pe cea de-a doua.
    2. Configurați rutarea IPv6 pentru a permite comunicarea între toate sistemele. Sistemele red, green și blue vor avea ruta default prin sistemul host.
  3. (5 puncte) Realizați configurațiile necesare astfel încât echipamentele să poată fi accesate prin numele lor (folosiți numele host, red, green, respectiv blue). Adăugați intrări de hosts doar pentru adresele IPv4.
  4. (5 puncte) Realizați configurațiile necesare pentru ca cele 3 containere sa aibă acces la Internet.
    • Configurați sistemul host astfel încât să facă translatarea doar pentru adresele IP configurate static pe interfețele containerelor, nu și pentru alte adrese din rețelele lor.
    • Observație: adresa IP de pe eth0 a sistemului host este asignată dinamic de către ISP, prin DHCP; configurarea trebuie realizată astfel încât conectivitatea la internet a containerelor să nu depindă de această adresă IP.
  5. (5 puncte) Configurați cele 3 containere pentru a putea accesa resurse din Internet pe baza numelor de domeniu al acestora (DNS).
    • Observație: Fișierul /etc/resolv.conf este volatil. Ce scrieți in el nu va fi persistent! Găsiți altă soluție! (hint: distribuțiile moderne folosesc systemd-resolved)
  6. (10 puncte) Configurați NAT pe sistemul host astfel încât:
    • Conexiunile pe portul, respectiv, 22000 + $G, 22000 + $H, 22000 + $I, să conducă la conectarea SSH pe sistemele red, green și blue.
    • Conexiunea pe portul 21000 + $J, să conducă la conectarea FTP pe sistemul red.
    • Conectarea pe portul 9000 + $K să conducă la conectarea pe tracker-ul de pe sistemul green.
  7. (10 puncte) Configurați firewallul astfel încât:
    • conexiunile SMTP și IMAP inițiate de pe sistemul blue să fie blocate (inclusiv către host!);
    • conexiunile FTP către sistemul green să nu fie permise de pe sistemul red;
    • conexiunile către tracker-ul ce rulează pe sistemul green să nu fie permise de pe sistemul red.
  8. (5 puncte) Configurați serviciul de SSH pe toate sistemele astfel încât:
    • autentificarea cu utilizatorul student de pe oricare sistem să fie permisă pe toate celelate sisteme (tot în cadrul utilizatorului student) folosind chei publice;
    • folosind alias-uri SSH să fie folosite comenzi simplificate pentru autenficarea pe sisteme:
      • ssh h să permită autentificarea pe sistemul host cu utilizatorul student;
      • ssh r să permită autentificarea pe sistemul red cu utilizatorul student;
      • ssh g să permită autentificarea pe sistemul green cu utilizatorul student;
      • ssh b să permită autentificarea pe sistemul blue cu utilizatorul student.
      • Observație: ssh-copy-id utilizează autentificare ssh pe bază de parolă pentru a copia cheia. Mașina virtuală pe OpenStack nu permite astfel de autentificare pe host, așadar veți fi nevoiți să copiați cheia manual in fișierul corespunzător!
  9. (7 puncte) Pe sistemul host este configurat un server web (Apache2).
    • Creați pe sistemul red scriptul /root/scripts/get-www-secrets care să descarce raspunsurile URL-urilor de forma http://host/getsecrets.php?id=<n>, pentru toate <n> impare de la 20 la 50.
    • Pentru a obține mesajul va trebui să vă autentificați cu:
      • username: elprofessor
      • password: casadepapel
    • Rezultatul rulării scriptului vor fi cele 15 mesaje afișate la ieșirea standard, unul sub altul (separate prin newline).
    • Indicație: Folosiți metoda HTTP POST.
  10. (8 puncte) Pe sistemul red este configurat un server FTP. Pe sistemul host:
    • Realizați un script /root/scripts/ftp-upload care uploadează fișierele cu numele [A-F][0-9].txt (e.g, E3.txt) din directorul curent (de unde este invocat scriptul) la URL-ul ftp://red/upload/, autentificându-se cu nume de utilizator berlin și parola tokyo.
    • Realizați un script /root/scripts/ftp-download care descarcă toate fișierele de la URL-ul ftp://red/download cu numele de forma [G-M]_X[0-9].txt (e.g., J_X4.txt) în directorul curent. Descărcarea se face în mod anonim, fără autentificare.
    • Atenție: toate fișierele ce nu se încadrează în acest tipar trebuie ignorate!
    • Transferurile trebuiesc făcute în modul binar (i.e., NU text)![update 29.11 11:47]
    • Pentru testare, puteți să vă creați structurile necesare (desigur, checkerul face acest lucru automat).
  11. (10 puncte) Pe sistemul host este configurat un server de e-mail (SMTP) și server IMAP.
    • Creați pe sistemul green scriptul /root/scripts/read-messages care să citească, de pe sistemul host, mesajul cu subiectul de forma Secret-<ID>, unde ID-ul va fi furnizat ca parametru (date autentificare: berlin cu parola tokyo). Atenție: ID-ul acela NU ESTE neapărat indicele mesajului din inbox (se poate întâmpla, va fi concindență și checkerul să dea fals pozitiv, însă nu garantează punctajul final pe VMchecker).
    • Trebuie să folosiți obligatoriu IMAP pentru citirea mesajului. Puteți folosi orice fel de utilitar sau limbaj de scripting (sau compilat, dacă doriți) pentru citirea mesajului (hint: există o soluție simplă și restul mai complicate).
    • Mesajul trebuie afișat la ieșirea standard (cu sau fără headere).
    • Atenție: nu aveți voie să instalați pachete noi, vă descurcați cu ce aveți :P
    • Indicație: Puteți folosi mail pentru a umple căsuța și pentru a vedea mesajele.
  12. (7 puncte) Pe sistemul host, creați un set de reguli de firewall pentru jurnalizarea acceselor realizate de la sistemul blue către serverul SMTP de pe sistemul host.
    • Aceste reguli trebuie să genereze mesaje syslog care să fie salvate în fișierul /var/log/stati-mascatilor.log.
    • Mesajele trebuie prefixat de șirul “blue-frnr: ”.
    • Hint: fiecare mesaj de log trece, mai întâi, prin serviciul rsyslog, care decide în ce fișier va fi scris.
  13. (8 puncte) Pe sistemul red, creați un script /root/scripts/get-host-port care va primi, ca prim argument, numărul unui port (1-65535), și va scrie la stdout textul “cap” dacă acel port este deschis pe host (atenție: nu s-a precizat pe ce protocol de nivel 3 și 4, deci pe toate) si “pajura” în caz contrar.
    • Observație: Faceți scanarea cât mai rapidă (doar pentru portul respectiv), pentru a evita un eventual timeout al checkerului!
  14. (Bonus - 10 puncte) Configurați un tunel GRE (Generic Routing Encapsulation) între red și blue.
    • Denumiți interfețele de tunel tun0 pe ambele capete.
    • Folosiți rețeaua 2020:83:$F::/64 pentru capetele tunelului.
  15. (Bonus - 10 puncte) Configurați un server DHCP pe red pentru a furniza IPv4 în rețeaua tunelului GRE creat anterior.
    • Configurați serviciul de DHCP astfel încât să ofere adrese IP din spațiul 10.100.$A.0/24 prin tunelul GRE, iar containerul blue să primească mereu a 100-a adresă IP asignabilă (10.100.$A.100).
    • Hint: Verificați ce pachet de server DHCP aveți instalat și faceți o alegere.
  16. (Bonus - 5 puncte) Securizați următoarele servicii folosind TLSv1:
    • serverul web de pe sistemul host (va asculta conexiuni pe portul 443)
    • serverul de mail (SMTP) de pe sistemul host
    • serverul IMAP de pe sistemul host (va asculta conexiuni pe portul 993)
    • serverul FTP de pe sistemul red
rl/teme/tema2.txt · Last modified: 2019/12/10 20:21 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0