Table of Contents

Laborator 10: Rapoarte de securitate și extindere CI/CD

Obiective

La finalul laboratorului veți ști să:

1. Introducere

Acest laborator urmărește extinderea unui pipeline de Continuous Integration (CI) centrat pe o aplicație web (frontend în React/JS, backend în Go). Veți automatiza execuția testelor, analiza de securitate și generarea rapoartelor, definind reguli stricte la nivel de repository pentru a bloca integrarea codului nevalidat.

Deși repository-ul poate conține și clienți de mobile (Android/Kotlin) sau module IoT (ESP32-CAM în C/C++), securizarea acestora reprezintă un obiectiv opțional, pentru a demonstra scalabilitatea arhitecturii CI/CD.

2. Desfășurarea laboratorului

Exercițiul 1: Izolarea pipeline-ului web și Fuzzing

Componentele aplicației web trebuie testate individual. Cerințe:

  1. Configurați pipeline-ul astfel încât job-urile de testare să ruleze independent și în paralel pentru directoarele de frontend și backend.
  2. Adăugați o etapă de Fuzzing specifică fiecărui mediu web:
    • Backend (Go): Apelați fuzzer-ul nativ (go test -fuzz=Fuzz).
    • Frontend (React): Implementați teste folosind un pachet de Property-Based Testing (ex. fast-check).

Exercițiul 2: Generarea și exportul rapoartelor

Extindeți workflow-ul curent cu următoarele etape pentru componentele web. Toate rezultatele trebuie salvate și exportate ca artifacte ale pipeline-ului. Cerințe:

  1. Unit Testing & Code Coverage: Executați testele și generați rapoartele de acoperire a codului.
  2. Static Code Analysis (SCA): Rulați utilitarele de analiză statică (ESLint pentru React, golangci-lint și gosec pentru Go).
  3. SBOM (Software Bill of Materials): Generați inventarul dependințelor cu Syft sau CycloneDX și exportați rezultatul în format JSON sau XML.

În GitHub Actions, utilizați actions/upload-artifact pentru a expune rapoartele generate (coverage, SBOM) după finalizarea execuției.

Exercițiul 3: Condiții de halt și branch protection

Cerințe:

  1. Fail-Fast: Configurați pipeline-ul să se întrerupă (Halt) imediat dacă o etapă critică a aplicației web eșuează. Exemple: un test pică, valoarea code coverage este sub 80%, sau utilitarul SCA raportează o vulnerabilitate de severitate HIGH.
  2. Branch protection: Din setările repository-ului, aplicați reguli de protecție pe branch-ul main. Configurați blocarea operațiunii de Merge pentru orice Pull Request dacă pipeline-ul (status checks) nu s-a finalizat cu succes.

Exercițiul 4: Evaluarea OpenSSF Scorecard

OpenSSF Scorecard evaluează automat aderarea repository-ului la bunele practici de securitate (ex. managementul permisiunilor, actualizarea dependințelor). Cerințe:

  1. Integrați acțiunea OpenSSF Scorecard într-un job separat din pipeline.
  2. Inspectați log-urile sau fișierul SARIF rezultat pentru a identifica scorul general.
  3. Alegeți un criteriu penalizat (ex. dependințe nefixate prin SHA, permisiuni excesive acordate token-ului de GitHub Actions) și implementați modificarea necesară pentru a crește scorul.

Exercițiul 5: Extragerea metricilor de contribuție

Cerințe:

  1. Creați o etapă finală în pipeline care interoghează API-ul platformei (ex. GitHub REST API) pentru a obține statistici despre contribuitori.
  2. Procesați răspunsul JSON cu un script Bash (folosind jq) sau Python și afișați la standard output (stdout) un tabel formatat conform structurii de mai jos:
User GitHub Nr. Commituri Nr. Pull Requests
ioan_dev 34 5
maria_front 42 7
andrei_qa 15 2

Pentru a simplifica autentificarea API, utilizați GitHub CLI (gh api) direct în pipeline. Utilitarul este preinstalat pe runner-ele GitHub și va prelua automat token-ul din context.

Exercițiul 6: BONUS - Extinderea arhitecturii pentru Mobile și Embedded

Extindeți pipeline-ul CI/CD adăugând workflow-uri complet izolate pentru componentele opționale Mobile și IoT, utilizând toolchain-urile platformelor specifice. Exportați rezultatele ca artifacte și aplicați politicile de Fail-Fast setate la Exercițiul 3. Cerințe:

  1. Componenta Mobile (Kotlin / Android Nativ):
    • Unit Testing: Rulați testele de logică folosind JUnit (sau Kotest).
    • Code Coverage: Generați rapoartele de acoperire folosind plugin-ul JaCoCo (sau EclEmma).
    • SCA: Integrați Detekt pentru analiza codului Kotlin și Android Lint pentru identificarea erorilor specifice platformei Android.
    • Fuzzing / PBT: Utilizați Jazzer pentru a descoperi crash-uri la nivel de JVM sau componenta de Property-Based Testing din Kotest.
    • SBOM: Generați inventarul dependințelor prin plugin-ul gradle CycloneDX.
  2. Componenta IoT (ESP32-CAM / C/C++):
    • Unit Testing: Verificați funcțiile izolate prin framework-ul Unity.
    • Code Coverage: Utilizați gcovr împreună cu utilitarele din PlatformIO.
    • SCA: Folosiți Clang-Tidy. Activați seturile de reguli CERT (pentru securitate cibernetică) sau MISRA (pentru fiabilitate).
    • Fuzzing: Implementați teste cu libFuzzer sau AFL++ pentru parsatoarele de rețea.
    • SBOM: Exportați lista pachetelor utilizate la compilare folosind Syft.