Tema 2

* Publicare:

  • 2022-01-10 18:00

* Termen de predare:

  • 2022-01-26 23:55 - deadline HARD

Revizii:

  • 2022-01-11 19:25: ex 12: fix așteptare rsyslog să scrie pe disk, rezolvat în v2021.0.4 (t2update!);
  • 2022-01-11 13:05: ex 7: descoperit problemă cu checkerul la filtrarea tracker-ului, rezolvat în v2021.0.3;
  • 2022-01-11 11:55: ex 6: descoperit problemă cu checkerul la DNAT (se verifica portul greșit), rezolvat în v2021.0.2;

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 (atenție: nu se folosește Docker, ca la laboratoare, însă modul de utilizare este similar). Mai multe detalii despre topologie găsiți la secțiunea Topologie.

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.95 puncte din nota finală.

Există exerciții bonus cu ajutorul cărora puteți obține 125 de puncte. Din păcate, 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.
  • Notă: pe OpenStack, autentificarea cu username și parolă nu este posibilă! Folosiți autentificarea cu chei publice, prezentată aici.
  • Pentru autentificare pe VM local, utilizați credențialele student/student.

Pași pentru accesare OpenStack

  • Urmăriți pașii din laborator.
  • Nume imagine: RL 2021 Tema2 (atenție: nu pe cea cu 2020!)
  • Tip instanță: m1.small (NU aveți nevoie de mai mult)
  • Puneți la VM un nume de forma cu Tema2_<your username> pentru a nu fi confundat cu VM de laborator și șters de către alți asistenți!
  • 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).
  • RECOMANDARE: Dați Lock Instance la VM-ul pentru Tema 2 pentru a preveni ștergerile accidentale din partea asistenților! Opțiunea o puteți găsi în meniul contextual (dreapta) din lista de la Instances.
  • NU modificați parola la conturile root / student! Dacă vă tăiați accesul la VM din greșeală, cereți ajutorul unui asistentului preferat pe Teams ;)

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

Rulare în VM local

  • Pentru a rula mașina virtuală a temei local, o puteți descărca de la acest URL (1.6 GB arhivat .zip, 5-6 GB dimensiune dezarhivat).
  • VM-ul este compatibil atât cu VirtualBox (testat cu 6), cât și VMWare (testat cu Workstation >= 15). Pe Linux, poate fi 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.
  • Atenție: Imaginea VM-ului diferă de cea a laboratorului, asigurați-vă că îl descărcați pe cel corect!

Verificarea temei

  • Mașina virtuală conține checkerul (sursă închisă) și dispune de două scripturi pentru a face actualizarea și rularea sa mai simplă.
  • Pentru verificarea temei este disponibil un checker local. Atenție: nu este substitut pentru depanare!
    • 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 afișat pe RL Checker va fi și cel acordat în catalog la final.
  • Înainte de a rula checkerul, se recomandă descărcarea ultimului update prin rularea
    root@host$ t2update

    .

  • 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 de folosire:
    root@host:~# t2check 
    task01       .........................  10.0/10.0
    task02       .........................  10.0/10.0
    task03       .........................  10.0/10.0
    task04       .........................  10.0/10.0
    ...
    
    root@host:~# t2check 11
    task11       .........................  0.0/10.0
       mail not received
  • Dacă sunt probleme, puteți să postați un mesaj pe thread-ul aferent de pe forum;

Predarea temei

  1. Pentru urcare soluție, rulați:
    root@host$ t2check --save
  2. Rezultatul este o arhivă semnată în directorul în care invocați comanda.
  3. Folosind utilitarul scp, copiați acest fișier pe stația voastră locală (atenție să nu încurcați directoarele și să copiați o arhivă veche / salvată în altă parte!). Dacă sunteți conectat la OpenStack prin serverul intermediar fep.grid.pub.ro, va trebui să copiați mai întâi acolo, apoi s-o preluați pe stația voastră de lucru (alternativ, puteți folosi funcționalitatea de ProxyCommand a clientului ssh pentru o conexiune directă).
  4. Încărcați arhiva pe RL Checker (Moodle).

Recomandăm ca 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, altfel puteți întâmpina dificultăți la o revenire ulterioară asupra temei.

Folosiți comanda reboot înainte să testați de-a întregul (checkerul local doar simulează ceva mai rapid).

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

Personalizarea temei

Rezolvările sunt particularizate pentru fiecare student (pe baza contului Moodle). Pentru a obține aceste date, accesați link-ul Moodle RL Checker.

Datele de particularizare afișate pe Moodle vor fi introduse şi în fişierul /root/tema2.txt, unde va trebui să păstrați formatul text VARIABILA=valoare (liniile noi în plus nu contează)! Atenție: nu puteți personaliza aceste valori, ele fiind verificate cu strictețe de către checker-ul online! Includeți ȘI variabila USERNAME!

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

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 (off-topic) de discuție! Vor fi șterse.

Subiecte

Toate configurațiile 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 pentru a nu se baza pe directorul actual de lucru (working directory).

Nu trebuie instalați nimic în plus pe mașina virtuală, nu ar trebui să fie nevoie.

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.44.$A.0/27
      • Rețeaua green: 172.18.$B.64/28
      • Rețeaua blue: 172.18.$B.80/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 2022:2:$A:$C::/64
      • Rețeaua green 2022:3:$B:$D::/64
      • Rețeaua blue 2022:4:$B:$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) Hosts
    • 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) Internet connectivity
    • 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) DNS server
    • Configurați cele 3 containere pentru a putea accesa resurse din Internet pe baza numelor de domeniu al acestora (DNS).
    • Observație: systemd-resolved a fost dezactivat peste tot, deci ar trebui să meargă tehnica clasică de editare /etc/resolv.conf ;)
  6. (10 puncte) Configurați NAT pe sistemul host astfel încât:
    • Conexiunile pe porturile (21600 + $G), (21600 + $H), (18600 + $I), să conducă la conectarea ssh pe sistemele blue, green respectiv red.
    • Conectarea pe portul (13700 + $K) să conducă la conectarea pe tracker-ul de pe sistemul green.
  7. (10 puncte) Configurați filtrarea de pachete pe host astfel încât:
    • conexiunile SMTP inițiate de pe sistemul red să fie blocate (inclusiv către host!);
    • conexiunile către tracker-ul ce rulează pe sistemul green să nu fie permise de pe host (decât prin port forward).
    • blocați TOATE conexiunile trimise către blue, mai puțin protocoalele icmp, ssh și ftp.
    • atenție: NU blocați conexiunile inițiate de blue sau răspunsurile de la acestea! folosiți reguli stateful;
  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ă ducă către sistemul host cu utilizatorul student;
      • ssh r să ducă către sistemul red cu utilizatorul student;
      • ssh g să ducă către sistemul green cu utilizatorul student;
      • ssh b să ducă către 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ă autorizați cheia publică manual in fișierul corespunzător!
  9. (10 puncte) Căutare recursivă pe server HTTP cu autentificare
    • Creați pe sistemul red scriptul /home/student/scripts/whereswaldo care să caute recursiv prin paginile de la http://host/.X/ și să găsească fișierul waldo.txt (e.g., http://host/.X/sub/cale/waldo.txt).
    • Scriptul va trebui să afișeze DOAR conținutul paginii găsite!
    • Va trebui să vă autentificați prin HTTP cu credențialele:
      • username: ana
      • password: face_ReLe
    • Desigur, trebuie mai întâi să descoperiți ce tip de autentificare să folosiți!
  10. (10 puncte) Descărcare / încărcare fișiere prin ftp. Pe sistemul host:
    • Realizați un script /root/scripts/ftp-upload care uploadează DOAR fișierele de forma [UVT][0-10000].txt ('U' sau 'V' sau 'T' urmat de un număr și extensia .txt) din directorul curent la URL-ul ftp://red/upload/, autentificându-se cu utilizatorul fs și parola talent+valoare.
    • Realizați un script /root/scripts/ftp-download care descarcă DOAR fișierele cu forma ([a-zA-Z]+)-([0-9]+).tar.gz (adică orice șir de litere mici/mari, separatorul minus ('-'), un număr și extensia .tar.gz) de la URL-ul ftp://red/download în directorul curent. Descărcarea se face în mod anonim, fără autentificare.
    • Notă: Transferurile trebuiesc făcute în modul binar (și NU text)!
    • Pentru testare, puteți să vă creați structurile necesare (checkerul face acest lucru automat).
  11. (10 puncte) Pe sistemul host este configurat un server de e-mail (SMTP):
    • Pe sistemul green, creați scriptul /root/scripts/sell-nft care să trimită un mesaj către contact@host ce va conține:
      • subiectul Cumpara NFTuri cu RR
      • prima linie tipărită din argumentul primit de script;
      • pe a doua linie a mesajului, un hash sha256 al atașamentului;
      • atașament cu fișierul rr.jpeg preluat din directorul curent de unde este rulat scriptul.
  12. (5 puncte) Pe sistemul host, creați un set de reguli de firewall pentru BLOCAREA și jurnalizarea acceselor lui blue asupra serviciului telnet de pe sistemul green.
    • Aceste reguli trebuie să genereze mesaje syslog pentru fiecare pachet blocat, ce vor fi salvate în fișierul /var/log/insecure.log.
    • Mesajele trebuie prefixat de șirul “insecure-telnet: ”.
    • Hint: rsyslog
  13. (5 puncte) Pe sistemul red, creați un script /root/scripts/check-port care va primi, ca prim argument, numărul unui port TCP (1-65535), și va scrie, la stdout, textul “adevarat” dacă acel port este deschis pe host (inclusiv IPv6!) si “nah” în caz contrar.
  14. (Bonus - 10 puncte) Wireguard tunnelling
    • Configurați un tunel Wireguard între green și blue.
    • Denumiți interfețele de tunel wg-rl pe ambele capete.
    • Folosiți rețeaua IPv6 2022:0:$F::/64 pentru capetele tunelului (green va avea a prima adresă IP asignabilă, blue pe cea de-a doua).
    • Hint: nu uitați să activați rutarea!
  15. (Bonus - 15 puncte) Advanced port forwarding
    • Pe stația blue va fi pornit un serviciu special pe portul TCPv6 9944 care va asculta DOAR pe capătul de tunel wireguard creat anterior (checkerul îl va porni automat; pentru testare puteți folosi nc cu argumentul -s, trebuie să puteți trimite mesaje bidirecționale prin portul forwardat).
    • Configurați firewallul pe green (aveți iptables instalat) pentru a realiza DNAT astfel încât conexiunile la green portul 44 să ducă către acest serviciu ce rulează pe blue.
    • Accesul la serviciu prin green:44 va trebui să fie funcțional din orice rețea (e.g., încercați să vă conectați de pe host sau red)!
    • Restricție: este obligatoriu să folosiți DOAR iptables pentru a rezolva acest exercițiu. E.g., nu e voie să folosiți un serviciu auxiliar care să asculte pe portul 44 și să redirecționeze pachetele la blue!
    • Hint: Folosiți tcpdump cu încredere ;)
rl/teme/tema2.txt · Last modified: 2022/01/12 14:59 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