Vibe Coding e AI-Driven Development

Prototipazione rapida guidata dall’AI per la costruzione di MVP

Abstract

Il vibe coding descrive un paradigma di sviluppo software in cui la costruzione del prodotto avviene principalmente tramite dialogo con un modello di AI: lo sviluppatore definisce obiettivi e vincoli in linguaggio naturale, mentre l’AI genera interfacce, logica applicativa e integrazioni che vengono poi rifinite con iterazioni rapide. In questo quadro, piattaforme come Lovable e Replit riducono drasticamente il tempo tra idea e prototipo funzionante, rendendo possibile realizzare MVP pronti alla validazione in pochi giorni (o ore). Quest’articolo propone un workflow end-to-end che unisce product thinking, rapid prototyping e AI-driven development, discutendo strumenti, errori comuni, aspetti di sicurezza e una metodologia sperimentale per valutare l’efficacia del processo.

1. Introduzione e contesto

Nel ciclo di sviluppo tradizionale, l’attrito tra definizione requisiti, design, implementazione, QA e deploy introduce tempi lunghi e costi elevati. Quando l’obiettivo è validare un’ipotesi di prodotto, questo ritardo aumenta il rischio di costruire funzionalità non necessarie o di arrivare sul mercato con un’idea già superata. L’AI-driven product creation nasce come risposta a questo problema: comprimere il ciclo di feedback e trasformare rapidamente un’idea in un artefatto testabile (prototipo o MVP – Minimum Viable Product). Nell’AI-Driven Product Creation il flusso viene sintetizzato come intenzione, generazione, iterazione e rilascio dell’MVP, evidenziando il vantaggio competitivo del feedback loop rapido (Sgarbi, 2025).

2. Cos’è il Vibe Coding

Il vibe coding è una recente tecnica di programmazione assistita dall’AI in cui il programmatore descrive cosa vuole ottenere in linguaggio naturale, delegando a un agente AI (tipicamente un modello linguistico di grandi dimensioni) il compito di generare il codice sorgente. In pratica poche frasi di istruzioni (prompt) rivolte a un chatbot evoluto sostituiscono la stesura manuale del codice: lo sviluppatore passa così dal ruolo di codificare a quello di guidare, verificare e rifinire il codice prodotto dall’AI. Questo approccio, introdotto nel 2025 dal ricercatore Andrej Karpathy, punta a “dimenticarsi del codice e abbracciare le vibrazioni” per citare le parole stesse di Karpathy, cioè concentrarsi sull’idea e l’esperienza dell’applicazione lasciando all’AI la traduzione dell’intenzione in codice. I sostenitori del vibe coding evidenziano come questo permetta anche a programmatori alle prime armi di realizzare software funzionante senza dover padroneggiare tutti i dettagli tecnici tradizionali. I critici invece mettono in guardia sui rischi in termini di qualità, sicurezza e mantenibilità del codice generato interamente dall’AI senza una piena comprensione umana.

Il vibe coding può essere definito come un modo di sviluppare ‘parlando‘ con l’AI invece di scrivere codice riga per riga. L’utente descrive cosa vuole ottenere (la ‘vibe’): l’AI genera layout, logica e integrazioni; il costruttore testa, corregge e itera velocemente fino ad arrivare a un prototipo solido. Questo approccio è particolarmente efficace per prototipi, MVP e sperimentazione rapida. È però fondamentale distinguere tra accelerazione dell’execution e sostituzione del pensiero: l’AI non deve rimpiazzare l’analisi dei requisiti, la strategia di prodotto o le scelte architetturali.

3. Piattaforme per vibe coding e rapid delivery

3.1 Lovable

Lovable (lovable.dev) è una piattaforma emergente, nata dall’evoluzione del progetto open-source GPT-Engineer, che consente di costruire applicazioni web complete tramite AI. In breve, “Lovable è un agente AI che può programmare interi progetti semplicemente facendo descrivere all’utente cosa vuole”. L’esperienza d’uso tipica in Lovable inizia con la creazione di un nuovo progetto e l’apertura di una chat (simile a ChatGPT) dove l’utente fornisce un prompt dettagliato sul tipo di applicazione da creare. Ad esempio, si potrebbe chiedere “Costruisci un’app di gestione note personale con una pagina di login, una dashboard per creare/visualizzare note testuali, e salvataggio su database. Interfaccia semplice con React.”. Sulla base di questa descrizione, Lovable genera automaticamente il codice di un’app web completa: tipicamente front-end React per l’interfaccia, e un back-end basato su Supabase (un servizio BaaS che funge da database e autenticazione).

Il punto di forza di Lovable è che produce subito un progetto eseguibile e multi-componente: non pezzi di codice isolati, ma un’app funzionante con frontend, backend e database integrati. L’utente può eseguire l’app in cloud e vedere il risultato, intervenendo via chat per chiedere modifiche o nuove feature. Ad esempio, “aggiungi un campo di ricerca nelle note” potrebbe far rigenerare parte del codice per includere questa funzione. Lovable mette a disposizione anche un editor di codice nel browser, per chi volesse eventualmente rivedere o aggiustare manualmente parti del progetto. Inoltre supporta integrazioni esterne (ad esempio collegare API esterne, Google Sheets, servizi email) attraverso moduli predefiniti e prompt in linguaggio naturale. In sostanza è un ambiente no-code potenziato dall’AI, dove la logica dell’app e le condizioni vengono definite in linguaggio naturale anziché in linguaggi tradizionali.

Limiti di Lovable: come emerso da varie esperienze, Lovable dà il meglio su app semplici o MVP e incontra difficoltà man mano che la complessità cresce. Utenti avanzati riportano che tentando di implementare logiche molto articolate o integrazioni non standard, l’AI può entrare in loop di errori e correzioni fallite, consumando crediti senza risolvere il problema. Ad esempio, in un progetto con molte API esterne e logiche condizionali, Lovable poteva introdurre bug difficili da eliminare e spesso asseriva di averli risolti quando non era così. Chi non ha competenze di programmazione potrebbe trovarsi bloccato in questi casi, dovendo pagare ulteriori prompt all’AI senza vedere progressi. Un consiglio dagli utenti più esperti è di spezzare le richieste in sotto-task e mantenere i prompt molto chiari e specifici, in modo da guidare l’AI gradualmente. Lovable è comunque in rapida evoluzione: rispetto ai primi mesi di lancio (2024), gli algoritmi sono migliorati riducendo errori di compilazione e comportamenti allucinatori. Inoltre, imparare a scrivere prompt “difensivi” e a sfruttare strumenti di debug (Lovable fornisce indicatori di salute del sistema, log, ecc.) aiuta a superare molti intoppi. Va ricordato però che Lovable per ora tende a vincolare il progetto a un certo stack tecnologico (React/Supabase) e può non essere adatto a prodotti finali complessi destinati alla produzione senza un passaggio successivo di refactoring manuale. In altre parole, è eccellente per prototipi e mockup rapidi, che poi all’occorrenza possono essere rifiniti fuori dalla piattaforma per raggiungere la qualità di produzione.

Lovable è una piattaforma orientata al ‘chat-to-app’: tramite prompt in linguaggio naturale è possibile generare rapidamente un’applicazione con frontend, logica e integrazioni (ad esempio Supabase), con un deploy estremamente rapido. Viene descritta come ottimizzata per velocità estrema, con generazione full-stack e pubblicazione con URL live in pochi secondi (Sgarbi, 2025). Il suo punto di forza è la conversione immediata di requisiti in un artefatto provabile, utile per demo e validazione.

3.2 Replit

Replit (replit.com) è una piattaforma di sviluppo online completa che ha abbracciato il vibe coding rendendolo accessibile a tutti i livelli di utenza. A differenza di Lovable, Replit è innanzitutto un IDE cloud multipurpose: permette di creare e modificare codice in una miriade di linguaggi (Python, JavaScript, C++, ecc.), eseguire applicazioni in cloud e collaborare in tempo reale con altri sviluppatori. Su questa solida base, Replit ha integrato potenti assistenti AI (come Replit Ghostwriter e il più recente Replit AI Agent) che consentono di scrivere codice tramite chat e comandi in linguaggio naturale.

Come funziona in pratica? Supponiamo di voler creare una web app con Python (Flask) e un frontend HTML/JS. In Replit si può avviare un nuovo progetto (chiamato Repl) selezionando ad esempio l’ambiente Python + Flask. A questo punto si può aprire l’AI Chat di Replit e impartire istruzioni del tipo: “Configura un progetto Flask. Crea una route ‘/’ che mostri una pagina web di benvenuto con un form di login. Dopo il login, implementa una pagina protetta che dice ‘Benvenuto, [nome]’ all’utente autenticato. Usa un dizionario in memoria per tenere username/password.” L’Agent AI di Replit comprenderà queste richieste e genererà i file di codice necessari all’interno del progetto: ad esempio un main.py con l’app Flask (comprensiva delle rotte per login e pagina protetta), un template HTML per il form di login, e così via. Replit a questo punto permette di eseguire subito l’app nell’ambiente cloud (con un click su “Run”) e fornisce un URL temporaneo dove testare la web app.

Il vantaggio di Replit è che unisce la flessibilità di un IDE tradizionale (puoi rivedere e modificare liberamente qualsiasi riga di codice generata, aggiungere librerie, accedere al terminale, ecc.) con la comodità dell’AI che scrive gran parte del codice noioso o ripetitivo. Inoltre Replit offre servizi integrati che semplificano molto passare da prototipo a app funzionante online: ad esempio un database integrato, storage per file, gestione delle secret keys e configurazioni, hosting e deploy con un singolo click. In particolare, il pulsante “Deploy” consente di prendere il tuo progetto e metterlo live su un URL pubblico senza dover configurare server, domini o container – aspetto spesso ostico per chi costruisce MVP. Replit si occupa anche di scalare automaticamente le risorse se la tua app riceve più traffico del previsto. Di fatto, Replit si propone come “la piattaforma #1 per vibe coding” in quanto copre l’intero ciclo: dall’IDE online (niente setup locale), all’AI coding assistant, fino al deploy in produzione. Questo la rende ideale per studenti, maker e startup che vogliono sperimentare idee rapidamente e iterare. Ad esempio, un team può collaborare in tempo reale sul codice generato (Replit supporta la modalità multiplayer e commenti inline per discutere parti di codice) e coinvolgere l’AI ogni volta che serve estendere una funzionalità o correggere un bug.

Python e oltre: Replit è molto popolare per progetti Python, grazie al fatto che offre ambienti pronti all’uso e che i modelli AI attuali (come GPT-4) sono particolarmente bravi a generare codice Python corretto. Questo significa che per prototipi data-driven, analisi o API veloci, poter vibe-codare in Python su Replit è un enorme acceleratore. Ad esempio, persino un veterano come Linus Torvalds ha raccontato di aver “vibe-codato” in Python uno strumento di visualizzazione per un progetto audio, lasciando fare all’AI la stesura del codice mentre lui supervisionava il risultato. Allo stesso tempo, Replit non è limitato a un linguaggio: se il tuo MVP è meglio realizzarlo come sito statico con script JavaScript, o come applicazione Node.js, o in qualsiasi altra tecnologia, l’AI di Replit potrà adeguarsi alle tue richieste (magari traducendo i prompt in un differente stack). Questa versatilità è importante perché consente di scegliere gli strumenti giusti per l’MVP senza doversi vincolare in partenza. Molti MVP web combinano un frontend (spesso HTML/CSS/JS o React) e un backend (può essere Python/Flask, Node/Express, etc.): con Replit si possono generare entrambi i lati e farli comunicare, sempre assistiti dall’AI. In sostanza Replit è uno svizzero coltellino per il vibe coding: offre un ambiente unificato dove sperimentare, prototipare e poi far evolvere il prototipo in un prodotto più robusto man mano che l’idea prende piede.

Replit può essere interpretato come un IDE cloud con esecuzione immediata, collaborazione e possibilità di deploy. In un workflow vibe coding risulta utile quando si vuole uscire dal ‘solo prompting‘ e passare a refactor, debugging e aggiunta di test sul codice generato. In pratica, Lovable massimizza la velocità ‘prompt-to-app‘, mentre Replit facilita la fase di consolidamento e manutenzione, aumentando il controllo sul progetto.

3.3 Altre soluzioni e tecnologie utili

Oltre a Lovable e Replit, vale la pena citare che il panorama dei tool AI-driven per sviluppo è in fermento. Ad esempio GitHub Copilot (basato su Codex) è stato uno dei primi assistenti ad anticipazione di codice, utile dentro VS Code o altri IDE per suggerire linee e funzioni mentre si scrive. Strumenti come Cursor o Codeium forniscono IDE con AI integrata, e servizi come Bolt, DataButton e Easycode (citate spesso nelle community) mirano a facilitare la creazione di interi progetti con l’AI. Molti di questi offrono approcci leggermente diversi – chi più low-level (aiuto nel codice riga per riga), chi più high-level (generatori di progetto interi). La scelta dello strumento dipende spesso dalle esigenze del progetto e dalle competenze di chi lo usa: per un non-programmatore assoluto, ambienti guidati come Lovable o Replit con interfacce semplificate risultano più accessibili; un utente più tecnico potrebbe preferire integrare ChatGPT o Copilot nel proprio editor tradizionale per mantenere maggiore controllo sul codice generato. Indipendentemente dallo strumento, i principi del vibe coding rimangono gli stessi: descrivere bene ciò che si vuole, procedere in modo iterativo e utilizzare l’AI come acceleratore invece che come sostituto totale dell’ingegno umano.

4. Dall’idea all’MVP: principi e scelte tecniche

L’MVP (Minimum Viable Product) non è una prima versione completa, ma un esperimento: un sistema minimo che verifica una o più ipotesi critiche con il minor costo possibile. Un errore comune è partire da una lista di feature; un approccio più robusto parte da un problem statement e da un happy path essenziale (accesso, azione principale, successo), come proposto nel workflow del webinar (Sgarbi, 2025). Dal punto di vista ingegneristico, l’MVP privilegia componenti managed (DB, auth, storage) e integrazioni standard per ridurre il tempo di implementazione e focalizzarsi su UX e valore.

Un concetto cardine nello sviluppo moderno e nelle startup è l’MVP (Minimum Viable Product): la versione minima di un prodotto che contiene solo le funzionalità essenziali per soddisfare i primi utenti e validare l’idea di business. In ottica Lean Startup, un MVP serve a massimizzare l’apprendimento con il minimo sforzo: si realizza un prototipo rapido, lo si testa sul campo raccogliendo feedback reali, e si iterano miglioramenti in base alle evidenze anziché a supposizioni.

Nel processo tradizionale, passare dall’idea all’MVP richiedeva tempo, competenze tecniche o budget per ingaggiare sviluppatori. Un team doveva definire il concept, poi trascorrere settimane (se non mesi) sviluppando un prototipo funzionante e affrontando sfide tecniche, per poi finalmente riuscire a lanciarlo e verificarne l’utilità. Con l’avvento di strumenti di AI generativa, questo percorso si è drasticamente accorciato: oggi è possibile descrivere in linguaggio naturale la propria idea a un agente AI e ottenere in pochi minuti o ore un’applicazione funzionante, da raffinare e pubblicare con pochi clic. In altre parole, il vibe coding consente a un singolo founder o piccolo team di passare “dal pensiero al prodotto” con una rapidità senza precedenti, concentrandosi sul cosa realizzare più che sul come realizzarlo.

4.1 Pianificazione dell’MVP: product thinking e scope ridotto

Anche con l’AI a disposizione, la fase iniziale di product thinking rimane cruciale. Significa chiarire cosa costruire e perché: identificare il problema da risolvere, gli utenti target e le funzionalità di base indispensabili. Prima di tuffarsi nel coding (anche se automatico), è consigliabile delineare una definition of MVP: ad esempio un Problem Statement (qual è il problema e per chi), le Core Features (le funzioni minime che dimostrano il valore centrale) e eventuali vincoli (serve un login? un database? integrazioni esterne?). Mantenere l’MVP piccolo e focalizzato è fondamentale: l’AI eccelle nel creare rapidamente prototipi di app relativamente semplici, con pochi flussi logici e schermate chiave. Se invece si tenta di costruire fin da subito un prodotto complesso, multi-utente e ricco di requisiti, si rischia di oltrepassare le capacità attuali degli strumenti AI (oltre che perdere il beneficio di velocità). Un motto utile è “fare meno, ma farlo bene”: implementare solo le caratteristiche necessarie per verificare l’idea principale sul campo.

4.2 Prototipazione rapida con l’AI

Definiti obiettivi e caratteristiche minime, entra in gioco l’AI per la prototipazione rapida. Qui il vibe coding mostra tutto il suo potenziale: invece di scrivere manualmente codice in un determinato linguaggio, lo sviluppatore si mette nei panni di un regista o product manager che comunica all’AI cosa costruire. Ad esempio, può letteralmente scrivere un prompt del tipo:

“Crea un’applicazione web per gestire una lista di attività (To-Do list). Deve permettere di aggiungere attività con un nome e una scadenza, segnare attività come completate e visualizzare l’elenco filtrando per completate/da fare. L’interfaccia sia semplice e responsive. Implementa il backend in Python (ad esempio con Flask) per salvare le attività in un piccolo database.”

Un agente AI adeguato prenderà queste istruzioni e inizierà a generare l’applicazione: creerà il codice backend (ad esempio un server Flask in Python con le rotte API per le operazioni CRUD sulle attività) e il codice frontend (HTML/CSS/JS per l’interfaccia utente) rispettando le specifiche fornite. In pochi minuti potrebbe restituire un progetto completo di file, ad esempio con una app.py contenente il server Flask e pagine web pronte all’uso.

Per concretizzare, ecco un possibile snippet di codice che l’AI potrebbe generare per la parte backend in Python (semplificato per illustrazione):

from flask import Flask, request, jsonify

app = Flask(__name__)
tasks = []  # semplice "database" in memoria

@app.route('/tasks', methods=['GET'])
def list_tasks():
    return jsonify(tasks)

@app.route('/tasks', methods=['POST'])
def add_task():
    data = request.get_json()
    task = {"id": len(tasks)+1, "name": data["name"], "due": data["due"], "done": False}
    tasks.append(task)
    return jsonify(task), 201

@app.route('/tasks/<int:task_id>/complete', methods=['POST'])
def complete_task(task_id):
    for task in tasks:
        if task["id"] == task_id:
            task["done"] = True
            return jsonify({"status": "ok"})
    return jsonify({"error": "Task not found"}), 404

if __name__ == "__main__":
    app.run()

Nell’esempio sopra, l’AI ha generato con poche istruzioni un semplice server Flask in Python con API RESTful per aggiungere attività, elencarle e marcarle come completate. Senza vibe coding, scrivere anche un progetto basico come questo avrebbe richiesto di scrivere manualmente decine di righe di codice, configurare l’ambiente, gestire errori di sintassi, ecc. Invece, descrivendo l’obiettivo in linguaggio naturale, l’AI ha prodotto uno scheletro funzionante in pochi istanti. Naturalmente il codice andrebbe poi integrato con un’interfaccia utente e testato, ma lo scopo è mostrare l’accelerazione enorme data dall’AI nella fase di prototipo. Come afferma Matt Palmer di Replit, questa metodologia consente a creatori anche non tecnici di “focalizzarsi sugli aspetti creativi dello sviluppo anziché rimanere impantanati nei dettagli tecnici”. L’AI si occupa di setup, sintassi e boilerplate, mentre l’umano può concentrarsi su idea, UX e feedback utente.

5. Strumenti davvero utili nello stack AI-driven

5.1 Stack tecnico minimo e integrazioni

Uno stack pragmatico per MVP AI-driven tende a minimizzare il ‘plumbing‘ e massimizzare la rapidità di iterazione. Un pattern ricorrente è: frontend generato e rifinito (Lovable + IDE), backend gestito con Supabase (database + autenticazione + storage), pagamenti con Stripe quando necessario e automazioni con strumenti come Make o n8n per ridurre codice di integrazione. Il criterio di scelta non è la completezza, ma la riduzione del tempo tra ipotesi e feedback.

5.2 AI per creatività, design e product execution

L’intelligenza artificiale nel contesto dello sviluppo non è utile solo a generare codice: può essere un prezioso alleato in tutte le fasi, dalla concezione creativa al design dell’interfaccia, fino all’esecuzione tecnica e al delivery del prodotto. Vediamo come:

Creatività e brainstorming: gli stessi modelli linguistici che scrivono codice possono aiutare a generare idee. Ad esempio, ChatGPT può essere interpellato nelle prime fasi di un progetto per fare brainstorming su funzionalità possibili, trovare soluzioni alternative a un problema di design, o persino proporre nomi e slogan per il prodotto. Si può chiedere all’AI “come potrei risolvere il problema X con la tecnologia?” oppure “quali caratteristiche vorrebbero gli utenti in un’app di tipo Y?”. L’AI, attingendo al suo addestramento su miliardi di documenti, può suggerire spunti che il team umano non aveva considerato. Chiaramente non ogni output sarà valido, ma anche solo stimolare la discussione attraverso suggerimenti creativi è un valore. Molte startup sfruttano GPT-4 come collaboratore virtuale nelle sessioni iniziali di product thinking, per ampliare lo spazio delle idee.

Design dell’esperienza utente (UX/UI): oggi esistono AI specializzate che generano layout grafici o schizzi di interfaccia da descrizioni (es. “uno schermo di login con email e password e un pulsante rosso di submit”). Strumenti come Galileo AI, Uizard, o lo stesso Replit Design (introdotto recentemente) trasformano prompt testuali in bozze di interfacce. Questo significa che un progettista può rapidamente esplorare varianti di design senza dover disegnarle a mano da zero. Anche senza tool dedicati, i modelli generici possono produrre codice HTML/CSS per prototipi di interfaccia: ad esempio ChatGPT può scrivere il codice di una navbar o di un form ben formattato se richiesto. Ciò accelera la fase di prototipazione UI, permettendo di avere qualcosa di cliccabile per test utente in tempi brevi. Inoltre l’AI può generare contenuti di placeholder: testi fittizi, immagini (tramite modelli generativi tipo DALL-E o Midjourney) per rendere il prototipo più realistico. Sul fronte UX, l’AI può fornire feedback simulando l’utente: ad esempio si può chiedere “questo flusso di registrazione è chiaro?” e ottenere suggerimenti (anche se qui l’occhio umano esperto rimane insostituibile). In sostanza, se usata bene, l’AI diventa una cassetta degli attrezzi creativa per designer e product manager.

Esecuzione tecnica e sviluppo: questo è l’ambito già esplorato con il vibe coding. L’AI può accelerare enormemente la fase di implementazione: generazione di codice backend, configurazione di database, scrittura di test automatici, creazione di API client, documentazione del codice, ecc. Ad esempio, una volta sviluppato l’MVP, si può chiedere all’AI di produrre una serie di test unitari per assicurarsi che le funzioni critiche funzionino (molti hanno sperimentato con successo prompt come “scrivi i test per questa funzione in PyTest”). Oppure, può aiutare nella migrazione del codice: se il prototipo cresce e serve passare da un database in memoria a uno persistente, l’AI può fornire lo schema di come integrare un database SQL o NoSQL, scrivendo le query o configurando ORM. Durante lo sviluppo, l’AI funge anche da assistente di debugging: se un errore non è chiaro, si può incollare lo stack trace nel prompt e chiedere spiegazioni o possibili fix. Un aspetto importante è anche l’ottimizzazione: magari l’MVP funziona ma è lento; l’AI può suggerire come migliorare le prestazioni (ad esempio, “questo algoritmo ha complessità O(n^2), potresti usare un approccio più efficiente come…”). Insomma, l’AI può essere vista come un collega virtuale sempre disponibile, con una vasta conoscenza, che aiuta a scrivere codice, trovare bug, proporre miglioramenti e ricordare sintassi e best practice all’istante. Sfruttata a pieno, può ridurre drasticamente i colli di bottiglia nello sviluppo esecutivo di un prodotto.

Da notare che queste capacità dell’AI non eliminano la necessità di competenza umana, ma ne aumentano il raggio d’azione. Un piccolo team può produrre risultati da grande team, perché delega alla “forza lavoro” artificiale i compiti ripetitivi o di dettaglio, mantenendo però il controllo creativo e decisionale. In ambito universitario, per esempio, uno studente può concentrare il proprio apprendimento sui concetti di alto livello (es. logica algoritmica, architettura del software) sapendo che l’AI lo aiuterà con la scrittura effettiva del codice sintatticamente corretto. Questo suggerisce un futuro in cui meno tempo è speso a scrivere codice boilerplate, e più tempo a progettare soluzioni, che è il cuore creativo dell’informatica.

6. Best practice ed errori comuni da evitare

Nel vibe coding gli errori più costosi sono spesso di processo: partire senza un problema chiaro, delegare la strategia all’AI, trascurare UX e micro-copy, iterare troppo poco (prototipo fragile) o troppo (perfezionismo). Il webinar evidenzia che definire bene il problema vale ‘meta’ del lavoro e che la velocità dell’iterazione supera l’illusione del planning perfetto (Sgarbi, 2025).

Nonostante le promesse, il vibe coding nasconde anche diverse trappole se praticato ingenuamente. Di seguito alcune best practice consigliate e gli errori da evitare, emersi sia dall’esperienza degli utenti sia dai pareri di esperti:

Prompt precisi e modulari: un errore comune è dare all’AI richieste vaghe o troppo generali (“fai un’app tipo Uber”). Prompt così aperti portano l’AI a fraintendere o a produrre risultati incompleti. Conviene invece specificare chiaramente ciò che si vuole ottenere, suddividendo il lavoro in passi. Una regola pratica: un task alla volta. Ad esempio, prima chiedere di creare la schermata di login, poi in un secondo prompt aggiungere la funzionalità di reset password, e così via. Questo aiuta sia l’AI (che ha limiti di contesto e tende a confondersi con troppi requisiti insieme) sia voi a controllare meglio ogni componente man mano che viene costruita.

Versionare e salvare spesso: quando si procede per iterazioni con l’AI, può capitare che un cambiamento richiesto rompa parti funzionanti in precedenza. È buona pratica usare un sistema di version control (ad esempio Git, o anche le snapshot integrate in Lovable/Replit) per creare checkpoint del progetto. In caso di “deragliamento” del codice generato, si può tornare a una versione stabile precedente. Alcuni sviluppatori in vibe coding adottano la filosofia “revert fearlessly”: se l’AI introduce un errore architetturale grave, conviene annullare l’ultima modifica e provare una strada diversa, invece di intestardirsi a far correggere al bot qualcosa che potrebbe non aver compreso.

Verificare e testare sempre (Trust but verify): il vibe coding puro implica accettare il codice generato senza comprenderlo a fondo, ma ciò non esime dal testarlo rigorosamente. Ogni funzionalità generata va provata con vari input per assicurarsi che si comporti come previsto. Se non si hanno test automatici, fatene almeno di manuali. In particolare, attenzione a corner cases: l’AI può non prevedere situazioni non esplicitamente descritte nel prompt. Inoltre, leggere almeno superficialmente il codice prodotto – se si hanno competenze per farlo – può aiutare a intercettare assurdità logiche o cose che l’AI ha “hallucinato”. Un principio condiviso è: non fidarsi ciecamente. Come nota un programmatore, “non mi fido di nulla di quello che mi dice l’AI finché non l’ho verificato”. Questo è doppiamente vero per il codice che va in produzione.

Occhio a sicurezza e qualità: l’AI genera codice attingendo da ciò che ha imparato, il che include anche esempi di codice insicuro o obsoleto. Di conseguenza, c’è il rischio che introduca vulnerabilità note (injection, errori di convalida input, dipendenze insicure) se il prompt non specifica contromisure. Evitare gli errori di sicurezza più comuni deve essere una priorità: ad esempio, verificare che l’AI abbia gestito correttamente la sanitizzazione degli input utente, l’autenticazione, la protezione delle API key, ecc. Se non l’ha fatto, intervenite manualmente o istruitela a farlo. Un’azienda non dovrebbe mai accettare codice AI tal quale senza passarlo per i consueti controlli di qualità (code review, audit di sicurezza, test). Inoltre, la mancanza di trasparenza nei cambiamenti introdotti dall’AI può complicare la tracciabilità: in un progetto open source si può vedere la cronologia delle modifiche e chi le ha fatte; con il codice generato dall’AI, questa storia manca. È opportuno dunque documentare quello che si fa generare (es. mantenere commenti che indichino “funzione X generata con prompt Y”) e magari conservare i prompt usati, per future analisi.

Non trascurare l’apprendimento personale: un errore soprattutto per chi è agli inizi è adagiare troppo le proprie competenze sull’AI. Se uno studente o junior developer delega sempre all’AI senza cercare di capire il perché delle soluzioni, rischia di bloccare la propria crescita. Come evidenziato in ambito educativo, l’AI va usata come assistente, non come sostituto. Continuate a studiare le basi: algoritmi, strutture dati, paradigmi di design. Il vibe coding può dare l’illusione di non dover più “imparare a programmare” in senso tradizionale, ma in realtà per usare bene questi strumenti serve più comprensione logica e analitica, non meno. Bisogna bilanciare l’utilizzo dell’AI con la pratica manuale, per non incorrere in un offload cognitivo totale in cui poi, senza AI, non si sa fare nulla. Un buon metodo è sfruttare l’AI in modalità interattiva: farle spiegare il codice che ha scritto (“perché hai usato questa funzione?”), chiedere alternative, insomma usarla anche come strumento didattico. Così si rimane in controllo e si trasforma una potenziale pigrizia in opportunità di apprendimento accelerato.

Gestire costi e risorse: molte piattaforme AI (Lovable, ma anche le API di OpenAI usate in Replit) funzionano a consumo, con crediti o quote mensili. Fate attenzione a non sprecare risorse in prompt ridondanti o cicli infiniti. Se l’AI rimane bloccata su un problema dopo vari tentativi, forse conviene fermarsi e ridurre il problema in parti più piccole o consultare un umano esperto. Inoltre, quando il codice cresce, l’AI potrebbe non reggere tutto il contesto in una singola richiesta (limiti di token): in questi casi bisogna adattare la strategia, ad esempio fornendo riassunti del codice o lavorando su moduli separati. Pianificare minimamente l’architettura prima di gettare l’AI sulla tastiera può farvi risparmiare soldi e tempo nel lungo periodo.

In definitiva, evitare questi errori significa usare il vibe coding in modo consapevole e professionale: beneficiando della velocità e creatività che l’AI offre, ma allo stesso tempo mitigando i rischi con disciplina ingegneristica classica. Un buon developer che adotta l’AI rimane critico verso il risultato, effettua test, e sa quando rientrare in controllo manuale del codice.

7. Sicurezza nel rapid development: prevenzione prima di tutto

Le applicazioni nate in contesti rapidi e sperimentali finiscono spesso online molto presto: ciò rende i rischi concreti, anche quando il progetto nasce come semplice MVP. Nel documento ‘Security in Lovable: Prevenzione Prima di Tutto‘ viene evidenziato che la sicurezza non è sempre ‘visibile‘ durante lo sviluppo, e che serve un meccanismo continuo di prevenzione. La domanda guida proposta è: ‘Se questa applicazione fosse pubblicata oggi, cosa potrebbe vedere chiunque da Internet?’. L’obiettivo non è sostituire un audit professionale, ma prevenire errori comuni dovuti a fretta e configurazioni lasciate di default (Lovable.dev, n.d.).

8. Workflow reale: Product Thinking + Rapid Prototyping + AI-driven Development

8.1 Scenario di esempio: Proposal Assistant per freelance

Per illustrare un flusso di lavoro concreto che unisce product thinking, prototipazione rapida e AI-driven development, consideriamo un esempio pratico:

Scenario: immaginiamo che una studentessa di informatica abbia un’idea di startup: un’app mobile/web che aiuta i freelancer a generare proposte di progetto automaticamente, rispondendo a qualche domanda chiave. L’obiettivo è creare rapidamente un MVP per testare l’interesse dei primi utenti.

Ideazione e Product Thinking: la studentessa definisce il problema: “i freelancer perdono molto tempo a scrivere proposte; un assistente AI potrebbe generarne una bozza in base a input standard (descrizione progetto, budget, durata, ecc.)”. Identifica come utenti target i freelance junior o con poco tempo. Definisce le core features dell’MVP: una semplice interfaccia web con un form di input (domande sulle esigenze del progetto) e un output testuale generato dall’AI (la proposta da usare come base). Come vincolo decide che non servirà autenticazione utente nella prima versione, per ridurre la complessità: l’MVP sarà single-user, ognuno genera la sua proposta e la copia.

Progettazione rapida (bozza): prima di codificare, pensa al flusso utente: una pagina iniziale di benvenuto con un pulsante “Inizia”; una pagina di questionario con campi (nome cliente, descrizione progetto, tempistiche…); un bottone “Genera Proposta” che scatena la chiamata all’AI; infine una pagina di risultato con il testo della proposta e un pulsante per copiarla. Questo schema a 3 schermate è annotato su carta o su una lavagna, giusto per avere chiaro il percorso.

Implementazione con vibe coding: ora passa agli strumenti AI. Decide di provare prima Lovable per costruire velocemente il front-end e la logica AI. Su Lovable, crea un nuovo progetto e nel prompt iniziale descrive: “App generatore di proposte per freelance. Pagina 1: benvenuto con pulsante Start. Pagina 2: form con domande (nome cliente, descrizione progetto, budget, durata) e bottone ‘Genera Proposta’. Quando cliccato, l’AI deve prendere le risposte e generare un testo di proposta che includa quei dati in tono formale professionale. Pagina 3: mostra la proposta generata e un pulsante ‘Copia testo’. Usa uno stile semplice e intuitivo.” Dopo qualche decina di secondi, Lovable restituisce un’app pronta: dietro le quinte ha creato le schermate con i relativi UI blocks (titoli, campi di input, pulsanti) e definito la logica in linguaggio naturale per assemblare le risposte e chiamare un modello di linguaggio (ad esempio l’API di OpenAI) per generare il testo della proposta. La studentessa può entrare in modalità preview e testare l’app inserendo dati fittizi, verificando se l’output ha senso. Supponiamo che la prima versione generi una proposta troppo breve; lei allora aggiorna il prompt interno della logica su Lovable, aggiungendo ad esempio “il testo finale dovrebbe avere almeno 4 paragrafi dettagliati”. Ritesta e ottiene un risultato migliore. In meno di un’ora, ha un prototipo funzionante del suo servizio.

Collegamento di componenti custom: ora, poniamo che il modello di Lovable per generare il testo non le piaccia (magari vuole usare un proprio modello open-source ospitato altrove, o aggiungere un controllo sui dati). Qui entra la flessibilità di integrare codice Python custom se necessario. La studentessa crea su Replit un piccolo servizio Flask con un endpoint /genera_proposta che riceve in JSON i dati del form e restituisce un testo generato da un suo script Python (potrebbe usare una libreria locale o un modello HuggingFace per generare il testo). Utilizzando vibe coding anche qui, descrive in Replit cosa deve fare questo endpoint e lascia che l’AI prepari il codice Python corrispondente, che poi adatta alle sue esigenze. Una volta soddisfatta, deploia l’API Python con Replit (ottenendo ad es. un URL pubblico tipo https://nomeprogetto–utente.repl.co/genera_proposta). Torna in Lovable e configura nella schermata di generazione proposta un API Call Block verso questo nuovo endpoint. In questo modo combina i punti di forza di entrambi gli strumenti: Lovable per l’interfaccia e la struttura dell’app, Replit per logica custom aggiuntiva in Python. In generale, è possibile unire servizi – il bello dei moderni approcci cloud.

Test e iterazione: con il prototipo pronto, lo condivide con alcuni freelance conoscenti per ottenere feedback. Grazie alla velocità con cui è stato creato, può permettersi di iterare rapidamente: se i tester dicono che manca una certa sezione nella proposta, o che l’output è troppo generico, basta tornare nell’AI e affinare i prompt o aggiungere quel campo. La fase di debugging è supportata dagli strumenti stessi: Lovable ad esempio ha un pannello debug per vedere i valori delle variabili attraverso le schermate e monitorare il flusso, mentre su Replit può usare i log del server Flask per capire eventuali errori. In pochi cicli la qualità del prototipo migliora sensibilmente.

Rilascio dell’MVP: una volta soddisfatta, può rilasciare l’MVP al pubblico target. Lovable permette di pubblicare l’app (fornendo un link web utilizzabile dai client) e Replit ha già il suo servizio live. Costi e tempi di tutto questo? Forse qualche decina di dollari in crediti AI e pochi giorni di lavoro – contro le settimane e migliaia di dollari che avrebbe richiesto sviluppare front-end, back-end e modelli AI manualmente con un team tradizionale. Questo esempio mostra come un workflow integrato che combina pensiero di prodotto (focus su problema e utente), prototipazione rapida (implementazione immediata via AI), e sviluppo guidato dall’AI (iterazioni rapide sul codice) possa concretizzare un’idea in un MVP tangibile prontamente testabile sul mercato.

Un workflow efficace unisce product thinking e AI-assisted coding in cinque fasi: (1) problem statement, (2) definizione dell’happy path, (3) initial prompt ricco di vincoli, (4) iteration cycle basato su gap e fix mirati, (5) refine & deploy con rifinitura UI/UX e copy. Questo schema corrisponde al flusso presentato nel webinar (Sgarbi, 2025) e riduce drasticamente il tempo tra idea e validazione.

8.2 Prompt template (esempio)

Esempio di prompt iniziale per avviare un MVP in Lovable:

Crea una web app full-stack chiamata “MakerShop”.

Target: artigiani che vogliono vendere online senza competenze tecniche.

Schermi richiesti:

1) Landing con CTA “Crea il tuo shop

2) Signup/Login (email + password)

3) Wizard in 3 step: nome shop, logo, categoria

4) Dashboard: lista prodotti (CRUD), anteprima shop pubblico

5) Pagina pubblica dello shop con prodotti e pulsante “Acquista

Vincoli:

– UI pulita, mobile-first, italiano, micro-copy chiaro

– Validazioni form (email, campi obbligatori) con messaggi amichevoli

– Backend dati su Supabase (utenti, shop, prodotti)

– Deploy con URL condivisibile

9. Caso studio 1: MakerShop (MVP e-commerce AI-first)

Il primo caso studio riprende lo scenario illustrato nel webinar (hackathon): costruire un MVP in poche ore per validare una piattaforma e-commerce orientata ai maker, in cui la creazione del negozio avviene tramite chat AI. Il valore dell’MVP è verificare rapidamente due ipotesi: (a) i maker vogliono vendere, (b) la barriera tecnica è un blocco significativo. Il progetto può essere implementato con: UI generata in Lovable, dati e autenticazione su Supabase e successiva rifinitura del codice (ad esempio su Replit) per autorizzazioni e validazioni.

9.1 Esempi di implementazione: validazione e autorizzazione

Validazione email con messaggio user-friendly (da rifinire spesso manualmente):

export function validateEmail(email: string): string | null {

  const e = email.trim();

  if (!e) return "Inserisci un indirizzo email.";

  const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

  if (!re.test(e)) return "L’email non sembra valida. Controlla e riprova.";

  return null;

}

Isolamento dati per utente (pattern minimo di autorizzazione in un CRUD):

const { data, error } = await supabase

  .from("products")

  .select("*")

  .eq("owner_id", user.id);

10. Caso studio 2: Dashboard interna e CRUD ‘enterprise-light

Un secondo scenario tipico, spesso ‘luce verde‘ per vibe coding, è una dashboard interna che aggrega dati da un database esistente e offre funzionalità CRUD per processi operativi (ticket, asset, richieste, inventario). Rispetto a un prodotto consumer, l’obiettivo principale è ridurre tempi di lavoro e migliorare visibilità su KPI, non massimizzare conversion. In questo contesto, il vibe coding accelera la costruzione del front-end, la definizione delle viste e la connessione al backend, mentre Replit/IDE risulta utile per introdurre controlli di accesso per ruoli, logica di validazione e test.

10.1 Requisiti minimi del prototipo

Requisiti essenziali per una dashboard interna: (a) autenticazione e gestione ruoli (admin, operator), (b) viste KPI (es. ticket aperti/chiusi, SLA, backlog per categoria), (c) CRUD su entità principali (ticket, utenti, asset), (d) esportazione CSV e audit log minimo. Questi requisiti permettono di validare rapidamente benefici e adozione senza costruire un sistema completo.

10.2 Esempio pratico: endpoint KPI e consumo lato UI

Esempio minimale (Node/Express) di endpoint KPI, utile quando si esce dal low-code puro:

import express from "express";

import { createClient } from "@supabase/supabase-js";

const app = express();

const supabase = createClient(process.env.SUPABASE_URL!, process.env.SUPABASE_SERVICE_ROLE_KEY!);

app.get("/api/kpi/tickets", async (req, res) => {

  // Nota: in produzione aggiungere auth e controlli di ruolo (RBAC)

  const { data, error } = await supabase

    .from("tickets")

    .select("status", { count: "exact", head: false });

  if (error) return res.status(500).json({ error: error.message });

  const total = data?.length ?? 0;

  const open = data?.filter(t => t.status === "open").length ?? 0;

  const closed = data?.filter(t => t.status === "closed").length ?? 0;

  res.json({ total, open, closed });

});

app.listen(3000);

Esempio React di consumo dati KPI:

async function loadKpi() {

  const r = await fetch("/api/kpi/tickets");

  if (!r.ok) throw new Error("Errore nel caricamento KPI");

  return r.json();

}

11. Metodologia sperimentale: metriche e validazione

Per valutare in modo ripetibile l’efficacia del vibe coding rispetto a uno sviluppo tradizionale (o rispetto a baseline interne), è utile definire una metodologia sperimentale con metriche e criteri di successo. Qui si propone un disegno sperimentale leggero, adatto a contesti universitari e prototipi reali.

11.1 Disegno sperimentale

Si definiscono due condizioni: A) sviluppo AI-driven (Lovable + Replit/IDE), B) sviluppo tradizionale (IDE + framework standard, senza generazione UI/logica). Entrambe implementano lo stesso set di requisiti minimi per un MVP, con tempi e risorse comparabili. Si raccolgono metriche su tempo, qualità, usabilità e outcome di validazione.

11.2 Metriche di tempo

Tempo-to-first-prototype (TtP): minuti/ore dal problem statement a una versione navigabile. Tempo-to-MVP (TtM): tempo fino a deploy condivisibile con happy path completo. Iteration count: numero di cicli prompt-test-fix fino a stabilità percepita.

11.3 Metriche di qualità e bug rate

Bug rate: numero di difetti per ora di test o per sessione utente, classificati per severità (bloccante, alto, medio, basso). Regression rate: difetti introdotti da una modifica successiva. Stabilità build: percentuale di deploy senza errori critici. Per ridurre bias, i bug possono essere raccolti con un test script comune e una checklist.

11.4 Metriche di usabilità

Usability: valutazione con questionario SUS (System Usability Scale) o con metriche operative (tempo medio per completare il task, errori per task). Task success rate: percentuale utenti che completano l’happy path senza assistenza. Qualità percepita: rating qualitativo su chiarezza dei messaggi, coerenza UI e fiducia.

11.5 Metriche di conversion e validazione prodotto

Activation rate: percentuale utenti che completano un’azione chiave (es. creazione shop, creazione primo ticket). Retention breve: utenti che tornano entro 7 giorni (se applicabile). Conversion (se monetizzazione): percentuale utenti che avviano checkout o attivano un piano. In contesti interni, conversion può essere sostituita da metriche di adozione (utenti attivi settimanali) e risparmio tempo.

11.6 Raccolta dati e strumentazione

La raccolta dati può essere ottenuta con: logging eventi (es. ‘signup_completed’, ‘first_item_created’), tracciamento errori (client e server), e un semplice dashboard di analytics. È fondamentale rispettare principi minimi di privacy: minimizzare i dati raccolti e evitare logging di informazioni sensibili.

12. Dal prototipo alla produzione: transizione e scalabilità

Il vibe coding è particolarmente efficace prima della piena comprensione del problema; quando l’idea è validata e si ottiene trazione, diventa strategico consolidare con pratiche ingegneristiche standard: test, CI/CD, hardening di sicurezza, refactor architetturale e osservabilità. Nel webinar viene sottolineato che la transizione è spesso ‘liscia’ perché il codice generato tende a essere basato su stack standard, e quindi evolvibile senza buttare via lavoro (Sgarbi, 2025).

Conclusioni

Il vibe coding è un acceleratore potente per prototipi e MVP quando è guidato da product thinking chiaro e da iterazioni rapide. Lovable riduce drasticamente il tempo di generazione e deploy, mentre Replit/IDE supporta il consolidamento con refactor e test. La velocità, tuttavia, amplifica errori di processo e rischi di sicurezza: per questo è utile adottare un approccio di prevenzione continua e verifiche esplicite di esposizione dati prima di condividere un URL. Con una metodologia sperimentale basata su metriche, è possibile misurare in modo oggettivo benefici e limiti dell’approccio AI-driven in contesti universitari e professionali.

Il vibe coding rappresenta senza dubbio una svolta nel modo di sviluppare software, spingendo verso uno scenario in cui “tutti possono programmare” in qualche misura grazie all’AI. In un contesto universitario, questa tecnologia offre spunti sia pratici che teorici: pratici perché gli studenti possono realizzare progetti più ambiziosi in meno tempo (e le piccole imprese prototipare soluzioni innovative con costi ridotti), teorici perché solleva nuove sfide su come garantire qualità, sicurezza e formazione delle competenze in un’era di automazione del codice. Abbiamo visto come strumenti come Lovable e Replit incarnino questa filosofia fornendo piattaforme per produrre MVP funzionanti in giorni invece che mesi. Allo stesso tempo, l’adozione diffusa del vibe coding nel mondo reale sta evidenziando l’importanza di procedure di validazione: i team devono adattare i propri workflow (ciclo di vita del software, controlli di versione, auditing) per integrare in modo sicuro ed efficace codice generato dall’AI.

In prospettiva futura, il ruolo del developer potrebbe sempre più somigliare a quello di un direttore d’orchestra, in cui l’AI suona molti degli strumenti tecnici. Ma la melodia – l’idea, la soluzione creativa al problema – deve ancora provenire dall’ingegno umano. Come per ogni salto tecnologico, vincerà chi saprà trovare il giusto equilibrio: sfruttare appieno i vantaggi dell’AI (produttività, rapidità, accesso democratico alla programmazione) senza sacrificare la solidità del prodotto e la crescita delle competenze fondamentali. In conclusione, il vibe coding non sostituisce la buona progettazione, ma la potenzia: permette di passare “dal foglio bianco all’app” con facilità, richiedendo però al progettista di mantenere visione lucida, spirito critico e cura per i dettagli. Queste qualità, unite agli strumenti AI-driven, possono aprire la strada a una nuova generazione di sviluppatori in grado di trasformare idee in realtà a una velocità prima impensabile.

Bibliografia

Sgarbi, E. (2025). AI-Driven Product Creation: Workflow reale per founder, developer e innovatori. Slide/webinar (PDF allegato).

Lovable.dev (n.d.). Security in Lovable: Prevenzione Prima di Tutto. Slide deck (PDF allegato).

Ries, E. (2011). The Lean Startup. Crown Business.

Osterwalder, A., & Pigneur, Y. (2010). Business Model Generation. Wiley.

Brooks, F. P. (1975). The Mythical Man-Month. Addison-Wesley.

Karpathy, A. (2025, Feb). “There’s a new kind of coding I call vibe coding…” Post su X/Twitter.

Replit Blog. (2025, Mar). “What is Vibe Coding?”.

IBM Blog. (2025). “What is vibe coding?”.

Wired Italia. (2025, Ott). Articolo sui rischi del vibe coding (sicurezza e supply chain).

Tom’s Hardware Italia. (2026, Gen). Articolo su vantaggi/opportunità del vibe coding.

Lundahl, M. (2025, Apr). “Lovable.dev Review: Great for MVPs…”.

Mobitouch. (2025). “How to build an MVP with AI (Lovable)”.

Wikipedia. (consultata 2026). Voce “Vibe coding” (edizioni en/it).

Vibe Coding

L’evoluzione dello sviluppo prodotto nell’era del Vibe Coding e della sicurezza Low-Code.

Proviamo ad analizzare il paradigma di sviluppo prodotto e assistito dall’Intelligenza Artificiale (AI-Driven Product Creation) con un focus specifico sull’approccio “Vibe Coding” e sulle implicazioni di sicurezza in ambienti Low-Code/No-Code.

Il contesto attuale dello sviluppo di applicazioni digitali è caratterizzato da un’esigenza critica di velocità di validazione (Time-to-Market) e ottimizzazione dei costi. Il modello di sviluppo tradizionale (Idea → Spec → Design → Dev → QA → Deploy) è descritto come un “Ciclo Lungo” che può rendere l’idea obsoleta prima del lancio.

La soluzione proposta è la compressione del tempo attraverso l’integrazione dell’Intelligenza Artificiale (AI) generativa. Questo non implica l’eliminazione del fattore umano, ma un cambiamento di paradigma verso lo “sviluppo assistito”, in cui l’AI si occupa dell’esecuzione di codice, UI e logica, permettendo al developer o al founder di concentrarsi sulla strategia, la logica di business e la User Experience (UX).

Il Vibe Coding è identificato come la metodologia operativa centrale di questo nuovo paradigma. Si tratta di un approccio in cui lo sviluppo avviene attraverso una comunicazione in linguaggio naturale con l’AI, anziché tramite la scrittura di codice riga per riga.

Flusso operativo del Vibe Coding

Il processo si articola in un ciclo rapido che riduce drasticamente il timeframe di creazione di un Minimum Viable Product (MVP):

  1. Intenzione (Prompting): descrizione in linguaggio naturale dell’obiettivo del prodotto.
  2. Generazione (Preview): l’AI crea in tempo reale layout, logica e stile (e.g., in piattaforme come Lovable, Replit).
  3. Iterazione (Feedback Loop): l’MVP viene testato immediatamente e modificato con prompt (es. “Cambia colore”, “Fix bug”).
  4. MVP (Deploy): rilascio immediato per validazione reale.

Questo flusso è presentato come un’alternativa che permette di passare da settimane o mesi di sviluppo a poche ore per un MVP funzionale

Casi d’uso e delimitazioni

L’applicazione del Vibe Coding è strategicamente delimitata in base alla complessità e alla criticità:

CategoriaUso raccomandatoUso sconsigliato
ValidazioneMVP / Proof of ConceptEnterprise Backend (1M+ query/giorno)
MarketingLanding Pages, E-commerce Starter (semplice)Real-time Gaming (multiplayer complessi)
InternoDashboard Interne, CRUD Apps (CRM leggeri)Security Critical (Banking core, Auth proprietaria)
TecnicoML Training (pipeline di dati pesanti)

L’obiettivo è utilizzare il Vibe Coding per muoversi velocemente PRIMA di conoscere a fondo il problema, e scalare verso il Coding Tradizionale solo DOPO aver validato l’idea e ottenuto trazione reale. La transizione è facilitata dal codice generato (spesso React/Supabase) che è standard e può essere oggetto di refactoring.

L’accelerazione dello sviluppo in ambienti no-code e low-code (come Lovable.dev) solleva preoccupazioni relative alla sicurezza, spesso “invisibile” o posticipata a causa della velocità di prototipazione; la maggior parte degli sviluppatori in questi contesti non ha accesso a team di sicurezza dedicati.

Funzione Security di Lovable.dev: un meccanismo di prevenzione pragmatica

La funzione di Security è introdotta per colmare il gap di sicurezza, integrando la Privacy by Design come principio fondante e non come aggiunta successiva. Il funzionamento si basa su un ciclo continuo di analisi e segnalazione proattiva:

  • analisi automatica: monitoraggio costante di configurazioni, permessi di accesso, collezioni di dati ed endpoint;
  • domanda chiave: la verifica si concentra su una domanda di threat modeling fondamentale: “Se questa applicazione fosse pubblicata oggi, cosa potrebbe vedere chiunque da Internet?”;
  • segnalazione proattiva: identificazione di risorse accessibili senza autenticazione e segnalazione di errori critici (dati potenzialmente leggibili tramite URL diretti) prima che si verifichino incidenti.

Delimitazioni metodologiche della Security (cosa NON È)

È cruciale notare che questo strumento non si propone come soluzione di sicurezza definitiva, ma come barriera contro gli errori più comuni derivanti da fretta o inconsapevolezza:

  • non è uno strumento di penetration testing avanzato;
  • non sostituisce un audit professionale completo;
  • non garantisce sicurezza al 100% in ogni scenario.

La sua reale utilità risiede nell’essere un meccanismo pragmatico di prevenzione moderna che rende la sicurezza tangibile (“Questo dato è esposto”), trasformando concetti astratti in azioni correttive immediate e contribuendo all’educazione continua dello sviluppatore.

L’analisi rivela l’emergere di un modello di sviluppo agile e accelerato, il Vibe Coding, che sfrutta la maturità dell’AI generativa e delle piattaforme low-code (Lovable, Supabase) per ridurre il rischio di business legato alla validazione delle idee. Tuttavia, questa velocità deve essere controbilanciata da una sicurezza integrata e proattiva. Il meccanismo di Security di Lovable rappresenta un approccio didattico e preventivo, essenziale per garantire che la rapidità di sviluppo non si traduca in vulnerabilità critiche, soprattutto in applicazioni in cui la configurazione predefinita o un errore di distrazione possono esporre dati sensibili. Il successo di questo paradigma dipende da una combinazione ottimale di AI, Low-Code e la supervisione strategica e consapevole dell’operatore umano.

    Sistemi di gestione centralizzati: Active Directory e Kerberos in ambito CSIRT/SOC

    In ambito enterprise, i sistemi di gestione centralizzati (come i servizi di directory) svolgono un ruolo chiave nella sicurezza informatica. Forniscono un punto unico per gestire identità, autenticazione e autorizzazione degli utenti su tutta l’infrastruttura, semplificando l’amministrazione e migliorando la consistenza delle policy di sicurezza. Ad esempio, Active Directory (AD) di Microsoft è ampiamente utilizzato (oltre il 90% delle organizzazioni lo impiega in forma on-premises, cloud Azure AD o ibrida[1]) come soluzione di identità principale. Grazie a questi sistemi, un team CSIRT/SOC può applicare controlli di sicurezza uniformi (es. criteri di password, restrizioni di accesso) e raccogliere centralmente gli eventi di sicurezza per il monitoraggio. Questo approccio riduce le vulnerabilità dovute a configurazioni incoerenti e permette di reagire più rapidamente agli incidenti. Al contempo, però, la natura centralizzata rende questi sistemi un bersaglio privilegiato per i cyber attaccanti, poiché comprometterli significa ottenere accesso esteso alla rete[2].

    Active Directory (AD) è un servizio di directory per reti Windows domain che organizza e memorizza informazioni su utenti, computer e altre risorse in modo gerarchico[1]. L’architettura logica di AD comprende i seguenti elementi fondamentali:

    • Domain (Dominio): Un dominio AD è un contenitore amministrativo che raggruppa oggetti (utenti, computer, gruppi) sotto un unico database di directory e un unico spazio dei nomi DNS (es: azienda.local). Rappresenta un boundary di sicurezza e replicazione: tutti i controller di dominio di un dominio condividono il database e autenticano gli utenti di quel dominio.
    • Organizational Unit (OU): Sono unità organizzative, ovvero sottocontenitori all’interno di un dominio, usati per organizzare gli oggetti (ad esempio per dipartimento o sede) e delegare autorizzazioni di amministrazione. Le OU facilitano l’applicazione di Criteri di Gruppo specifici per gruppi di utenti/computer.
    • Tree (Albero) e Forest (Foresta): Un albero è un insieme di domini in relazione gerarchica (ad es. domini figlio europe.azienda.local sotto il dominio radice azienda.local). Più alberi possono essere collegati in una foresta, che è l’insieme più ampio: domini multipli che condividono la stessa struttura logica AD (schema comune, catalogo globale, configurazione) e instaurano trust bidirezionali transitivi fra di loro[3][4]. La foresta è il boundary di sicurezza massimo di AD: tutti i domini in foresta si fidano reciprocamente. In genere la foresta coincide con l’organizzazione complessiva, mentre i domini separano unità organizzative maggiori (es. divisioni aziendali o regioni).
    • Site (Sito): Configurazione opzionale che rappresenta la topologia fisica (es. sedi geografiche) per ottimizzare la replicazione e l’autenticazione (i DC all’interno di un sito replicano frequentemente tra loro e servono preferibilmente client locali).

    Componenti fisici: i Domain Controller (DC) sono i server Windows che ospitano Active Directory Domain Services (AD DS) e contengono ciascuno una copia replicata del database AD (file NTDS.dit). I DC gestiscono le richieste di autenticazione (login utenti) e le query al directory. In un dominio vi sono tipicamente più DC per ridondanza e alta disponibilità (almeno due per tollerare guasti)[5]. Tra i DC avviene una replica multi-master continua dei dati AD. Alcuni DC possono avere ruoli speciali (vedi FSMO sotto). Un altro componente chiave è il Global Catalog (GC): un DC (o insieme di DC) che ospita una copia parziale di tutti gli oggetti della foresta, rendendo possibili ricerche rapide su oggetti in qualsiasi dominio. Inoltre, AD supporta Read-Only Domain Controller (RODC), DC di sola lettura pensati per sedi periferiche meno sicure fisicamente, i quali mantengono una copia in sola lettura del database (nessuna modifica locale)[6].

    Database AD e schema: AD memorizza gli oggetti con i loro attributi in un database basato su Jet Database. Lo Schema AD definisce la struttura dei dati, ovvero i tipi di oggetti e attributi ammessi (es: utenti con attributi come nome, telefono, gruppi con elenco membri, computer con nome host, ecc.). Lo schema è estensibile ma unico a livello di foresta, ed è gestito centralmente (vedi ruolo Master schema).

    Active Directory supporta diversi protocolli di rete standard per le sue funzioni: – LDAP (Lightweight Directory Access Protocol): protocollo directory su porta 389/TCP (o 636/LDAPS cifrato) utilizzato per interrogare e modificare il database AD. Client e applicazioni usano LDAP per cercare utenti, gruppi, autenticare su servizi (LDAP bind) ecc. – Kerberos: protocollo predefinito per l’autenticazione in un dominio AD (porta 88/UDP/TCP). Su Kerberos approfondiremo nelle sezioni successive. – NTLM: metodo di autenticazione legacy (challenge/response) usato come fallback se Kerberos non è disponibile (ad es. PC non in dominio o alcuni scenari particolari). È meno sicuro e soggetto ad attacchi pass-the-hash, quindi AD ne limita l’uso in favore di Kerberos. – RPC/SMB: protocolli usati per funzioni interne come la replicazione tra DC, la gestione remota, l’applicazione di policy, etc. Ad esempio il File Replication Service (FRS) o DFS-R per replicare le Sysvol (che contengono script di login e Group Policy) usano SMB, mentre molte operazioni di amministrazione AD usano RPC (porta 135 e porte dinamiche).

    In AD alcune operazioni critiche sono demandate a ruoli unici detti FSMO (o ruoli operazioni master flessibili) per evitare conflitti nella rete multi-master. I 5 ruoli FSMO in un’infrastruttura Active Directory sono[7]:

    • Master schema – uno per foresta: detiene la unica copia scrivibile dello schema AD. Solo il DC con questo ruolo può aggiornare lo schema (es. aggiunta di nuovi attributi o classi di oggetti).
    • Master per la denominazione dei domini – uno per foresta: responsabile di aggiungere/rimuovere domini nella foresta e assicurare unicità dei nomi di dominio[8]. Previene la creazione di due domini con lo stesso nome.
    • Master RID (Relative ID) – uno per dominio: assegna blocchi di RID unici ai DC del dominio. Ogni oggetto in AD ha un SID (Security ID); il RID è la parte finale variabile del SID. Questo ruolo garantisce che ogni DC usi RID diversi per creare nuovi oggetti, evitando SID duplicati[9].
    • Emulatore PDC – uno per dominio: il DC che agisce da Primary Domain Controller Emulator. È un ruolo chiave per retrocompatibilità e funzioni centralizzate: risponde alle richieste di sincronizzazione oraria, gestisce cambi password immediati, funge da server primario per le autenticazioni NTLM e coordina la distribuzione delle Group Policy. In pratica, è considerato il DC di riferimento principale per il dominio (simulando il vecchio PDC di Windows NT)[10]. Inoltre, in un ambiente con più DC, è il PDC Emulator a essere contattato per operazioni come lock/unlock account.
    • Master infrastrutture – uno per dominio: si occupa di mantenere riferimenti consistenti tra oggetti di domini differenti (in particolare converte SID e GUID di oggetti esterni in nomi canonici, aggiornando riferimenti nei gruppi qualora utenti vengano spostati tra domini)[11]. In una singola foresta con un solo dominio, questo ruolo può passare inosservato; in foreste multi-dominio evita problemi di referenze “orfane” mostrando SID non risolti nelle ACL se non funzionasse.

    Tali ruoli possono essere spostati tra DC (tramite strumenti grafici o PowerShell) per bilanciare il carico o in caso di decommissionamento di un controller. È fondamentale monitorare lo stato dei ruoli FSMO perché, pur avendo AD un meccanismo flessibile (in caso di DC offline i ruoli possono essere sequestrati da un altro DC), la perdita prolungata di un FSMO può impedire operazioni importanti (ad es. senza Master RID non si possono creare nuovi utenti quando i RID disponibili sui DC finiscono).

    Group Policy e controllo centralizzato

    Una delle funzionalità più potenti di AD in ottica sicurezza è la Group Policy. I Criteri di Gruppo (GPO) permettono di applicare impostazioni di configurazione e di sicurezza in modo centralizzato a gruppi di computer o utenti all’interno del dominio (ad es. impostare la policy password complessa, i limiti di lockout, le impostazioni del firewall client, restrizioni software, etc.). Le GPO possono essere collegate a livello di sito, dominio o OU e vengono applicate automaticamente ai sistemi/utenti interessati all’avvio o login. Questo consente un controllo uniforme: invece di configurare manualmente ogni host, gli amministratori definiscono il criterio una volta in AD e assicurano conformità su larga scala. Ad esempio, tramite GPO si può imporre che tutte le macchine del dominio abbiano login screen banner di avviso, che gli utenti non possano installare software non autorizzato, o che vengano eseguite specifiche configurazioni di auditing (vedi dopo). Un’altra area critica gestibile via GPO è la politica password: a livello di dominio si definisce lunghezza minima, complessità e durata delle password utente, nonché soglie di blocco account per tentativi falliti (mitigando brute force)[12]. In contesti avanzati, AD supporta anche fine-grained password policies (PSO) per eccezioni su gruppi specifici, ma la policy di dominio resta fondamentale. Il vantaggio per il SOC è chiaro: uniformità delle configurazioni di sicurezza e riduzione degli errori manuali.

    Autenticazione e autorizzazione centralizzate

    Active Directory gestisce in modo integrato autenticazione (verifica dell’identità) e autorizzazione (controllo degli accessi) in rete[13]. Quando un utente si logga a un computer membro del dominio, le sue credenziali vengono verificate dal Domain Controller usando Kerberos (per default). AD quindi emette token contenenti l’identità utente e i suoi gruppi di appartenenza (SIDs), che saranno usati per autorizzare l’accesso alle risorse. L’autenticazione centralizzata garantisce che solo utenti validi (presenti nel database AD) possano accedere e che la loro password sia verificata secondo le policy del dominio. L’Single Sign-On (SSO) è un beneficio: un utente, autenticandosi al dominio una volta, riceve i ticket Kerberos per accedere a più servizi senza dover reinserire credenziali per ognuno[14].

    L’autorizzazione nelle risorse Windows avviene tramite ACL che contengono SID di utenti/gruppi AD; grazie a AD, i gruppi possono essere usati per gestire ruoli e permessi (es: mettere un utente nel gruppo “Finance” gli dà automaticamente accesso alle cartelle riservate a Finance se le ACL sono configurate di conseguenza). La centralizzazione AD consente di modificare un membership di gruppo e influenzare immediatamente i privilegi su molte risorse. AD fornisce anche meccanismi avanzati come il Delegation of Control (possibilità di delegare permessi amministrativi granulari su OU ad esempio a un IT locale, senza dare privilegi globali) e funzionalità di trust tra domini/foreste per estendere l’autenticazione federata (un utente di un dominio trusted può essere autenticato nel dominio trusting).

    Auditing e monitoraggio

    Dal punto di vista di un SOC, monitorare Active Directory è cruciale perché molte tracce di compromissione emergono negli eventi di sicurezza del dominio. Windows Server fornisce una serie di Security Auditing che, se abilitati tramite policy, registrano eventi come logon riusciti e falliti, utilizzo di credenziali, modifiche a utenti o gruppi, cambi ACL, ecc. Tramite Group Policy (es. configurando la Default Domain Controllers Policy per i DC) si possono attivare audit dettagliati: ad esempio Audit account logon events, Audit account management (creazione/modifica utenti/gruppi), Directory Service Access (accessi a oggetti AD), ecc. Una volta abilitati (spesso definendo sia Success che Failure per ottenere tracce di tentativi falliti) i Domain Controller iniziano a generare eventi nel registro di Sicurezza Windows.

    Per gestire l’auditing AD: 1. Si attivano le categorie di audit via GPO (sotto Computer Configuration > Windows Settings > Security Settings > Advanced Audit Policy Configuration[15][16]). 2. Si raccolgono i log di sicurezza dai DC centralmente (tipicamente inviandoli a un SIEM o aggregatore) per analisi. Ad esempio, un evento 4625 (logon failed) su un DC con codice errore indica un tentativo di accesso fallito, un 4720 indica creazione di un nuovo account utente, un 4723 tentativo di cambio password, 4728 aggiunta a gruppo privilegiato, ecc. 3. Si configurano alert su eventi sensibili (es: molteplici lockout account possono indicare brute force; modifica di membership Domain Admins genera evento 4728 da attenzionare).

    L’auditing nativo può essere complesso (molti eventi verbosi), ma esistono soluzioni che aiutano (strumenti Microsoft come Advanced Threat Analytics/Defender for Identity, o soluzioni terze) per individuare anomalie. Indipendentemente dagli strumenti, è fondamentale che un CSIRT/SOC abiliti e utilizzi l’auditing AD: modifiche anomale su AD spesso sono segnale di compromissione in atto. Come raccomandato da guide specializzate, tutte le azioni privilegiate dovrebbero essere tracciate e riviste regolarmente[17]. In sintesi, AD offre gli elementi per un controllo centralizzato, ma spetta all’organizzazione implementare una robusta politica di logging, monitoring e auditing per trarne vantaggio.

    Kerberos: principio di funzionamento

    Kerberos è un protocollo di autenticazione di rete, progettato dal MIT, basato su un sistema di ticket che permettono a nodi (client e server) di autenticarsi reciprocamente su una rete insicura senza trasmettere password in chiaro. Il nome deriva da Cerbero, il cane a tre teste della mitologia greca, ad indicare le sue tre componenti principali: un client (principal), un servizio richiesto e un Key Distribution Center (KDC) centrale che funge da guardiano[18][19]. In ambiente Windows/AD, il KDC è implementato sui Domain Controller.

    Figura – Le “tre teste” di Kerberos: Principale (l’entità che si autentica, ad es. un utente), Risorsa/Servizio a cui vuole accedere, e KDC (Key Distribution Center) che media l’autenticazione.[18]

    Kerberos opera secondo un meccanismo di fiducia centralizzata: il KDC possiede una chiave segreta condivisa con ogni utente (derivata dalla password) e con ogni servizio/server (derivata dalla password dell’account computer o account servizio registrato in AD). Il processo di autenticazione Kerberos (versione Kerberos V5 usata in AD) avviene in più fasi (detto ticketing):

    1. Client richiede un Ticket-Granting Ticket (TGT) – Quando, ad esempio, un utente inserisce credenziali per accedere al dominio, il suo computer invia al KDC (servizio di Authentication Service, in esecuzione sul DC) un’autenticazione iniziale AS-REQ con il proprio principal (es. nome utente). Il KDC verifica le credenziali (nel caso di AD, controlla l’hash della password dell’utente confrontandolo con quello memorizzato in AD) e, se corrette, genera un Ticket-Granting Ticket. Il TGT è un ticket crittografato con la chiave segreta del KDC (nota solo al KDC stesso), contenente l’identità dell’utente, timestamp e una chiave di sessione. Il TGT viene restituito al client nell’AS-REP, insieme a una copia della chiave di sessione cifrata con la chiave dell’utente (così solo l’utente – conoscendo la propria password – può decifrarla). Da notare che a questo punto il KDC ha autenticato l’utente, ma l’utente non ha ancora accesso a nessun servizio di rete, solo al diritto di chiedere ticket ulteriori.
    2. Client richiede un ticket di servizio (TGS) – Quando il client vuole accedere a una risorsa specifica (es. un file server o un’applicazione web che supporta Kerberos), utilizza il TGT ottenuto per fare una richiesta TGS-REQ al Ticket-Granting Service (sempre sul KDC) per un ticket verso quel servizio. La richiesta include il TGT e indica il Service Principal Name (SPN) del servizio desiderato (ad es. HTTP/nomeServer per un sito web, o cifs/fileserver1 per un file share SMB). Il KDC verifica il TGT (che essendo firmato dalla sua chiave può essere validato e considerato prova dell’identità del client) e controlla nei propri database AD se l’utente ha diritto di accedere al servizio richiesto. Se tutto ok, il KDC genera un Ticket di Servizio (detto anche service ticket o TGS), crittografato con la chiave segreta del servizio target (nota solo a quel server). Questo ticket contiene l’identità del client, un nuovo session key client-server e le autorizzazioni (nel contesto AD, include il PAC – vedi dopo). Il KDC invia al client il ticket di servizio nell’TGS-REP, insieme a una copia della session key client-server (cifrata con la chiave già condivisa col client tramite il TGT). A questo punto il client ha un ticket valido per presentarsi al servizio.
    3. Accesso al servizio (AP-REQ/AP-REP) – Il client contatta il server target presentando il ticket di servizio (messaggio AP-REQ). Il server, che conosce la propria chiave segreta, decifra il ticket e ottiene così la session key e l’identità del client. Può opzionalmente inviare una risposta AP-REP per confermare al client la propria identità (mutua autenticazione). Da questo momento, client e server hanno stabilito una fiducia reciproca e possono comunicare in modo sicuro. Il client è autenticato presso il servizio senza aver trasmesso la password in rete (solo ticket cifrati). Il servizio, grazie alle informazioni nel ticket (come i gruppi di appartenenza dell’utente nel PAC), può effettuare il controllo di autorizzazione e concedere o negare l’accesso alla risorsa richiesta.

    Questo sistema di ticket fa sì che le credenziali sensibili (password) non circolino mai sulla rete; inoltre i ticket hanno una durata limitata (tipicamente il TGT dura 8-10 ore, i ticket di servizio alcune ore) e includono timestamp per prevenire replay. Kerberos fornisce anche mutua autenticazione (il client si fida del server solo se quest’ultimo dimostra di aver decifrato il ticket, quindi di essere legittimo). In Windows, Kerberos è integrato: il processo avviene in gran parte in background quando un utente esegue il logon al dominio e quando accede a risorse domain-based.

    Crittografia e sicurezza in Kerberos

    Kerberos si basa su crittografia simmetrica forte per proteggere i ticket e le comunicazioni[20]. Nel contesto Active Directory, le versioni moderne usano algoritmi AES (Advanced Encryption Standard) per cifrare ticket e chiavi (Windows Server 2008+ supporta AES, mentre versioni più vecchie usavano DES o RC4-HMAC[21]). Ogni principal (utente o servizio) ha in AD una chiave segreta derivata dalla password: per utenti è l’hash della password NT, per i computer/servizi è la password dell’account macchina o service account. Il KDC conosce tutte queste chiavi, perciò può creare ticket cifrati destinati sia al client (cifrati con chiave dell’utente) sia al servizio (cifrati con chiave del servizio).

    Alcuni dettagli di sicurezza: – Pre-autenticazione: Kerberos v5 in AD richiede che l’utente provi di conoscere la propria chiave già nella richiesta AS-REQ (inviando un timestamp cifrato con la propria chiave). Ciò previene attacchi offline: senza pre-auth, un attacker potrebbe chiedere un TGT e riceverlo cifrato con la chiave dell’utente, tentando poi di crackare offline la password da quel ticket (attacco AS-REP Roasting). Con la pre-auth attiva, il KDC non risponde se l’utente non dimostra prima la conoscenza della chiave. Nota: è importante che tutti gli account AD mantengano abilitata la pre-auth (è di default, ma può essere disabilitata per compatibilità): account senza pre-auth sono esposti ad attacchi di password guessing offline[22]. – Time synchronization: Kerberos dipende da orologi sincronizzati: i ticket hanno timestamp e scadenze. In AD è tollerato tipicamente un skew di 5 minuti; se l’orologio di un client differisce troppo, l’autenticazione fallirà. Per questo, parte delle best practice è assicurare NTP attivo su DC e client. – Session keys: per ogni autenticazione a un servizio, Kerberos genera chiavi di sessione uniche che il client e il server useranno per cifrare la sessione (ad esempio integrità e/o confidenzialità dei dati scambiati dopo l’autenticazione, se l’applicazione lo supporta). Ciò garantisce che anche se qualcuno intercettasse il ticket, non potrebbe usare la sessione senza la session key (che è protetta). – PAC (Privilege Attribute Certificate): è un campo aggiuntivo che Microsoft ha inserito nei ticket Kerberos in ambiente AD. Il PAC contiene gli identificatori di sicurezza e privilegi dell’utente (SID utente, SID dei gruppi di appartenenza, attributi come il SIDHistory, ecc.). Quando un utente presenta un ticket a un server, quest’ultimo può (ed è tenuto a) validare il PAC contattando un DC (procedura di PAC validation) per assicurarsi che non sia stato manomesso[23]. Il PAC consente al server di conoscere i gruppi e quindi applicare le ACL adeguate, ed è firmato dal KDC per garantirne l’integrità. Attacchi sofisticati come Golden Ticket coinvolgono la falsificazione del PAC, come vedremo.

    Vulnerabilità note del protocollo Kerberos

    Nonostante Kerberos sia considerato un protocollo molto sicuro, esistono vulnerabilità e attacchi noti legati al suo utilizzo in Active Directory: – Kerberoasting: è una tecnica di attacco che sfrutta il fatto che i ticket di servizio Kerberos per account di servizio AD (spesso associati a SPN) sono cifrati con hash derivati dalla password dell’account servizio. Un attacker che ha un accesso minimo al dominio (anche solo un account non privilegiato) può richiedere un ticket di servizio per un determinato SPN (operazione consentita a chiunque), ottenendo un ticket TGS cifrato con la chiave del servizio. Se l’account servizio ha una password debole, l’attaccante può fare cracking offline del ticket per risalire alla password in chiaro del servizio[24][25]. Questo attacco prende di mira account di servizio privilegiati (es. con diritti amministrativi) con password non abbastanza robuste. – Golden Ticket: attacco devastante in cui un aggressore riesce a compromettere l’account krbtgt (l’account del servizio KDC in AD). Con la chiave di krbtgt, l’attaccante può generare arbitrariamente Ticket-Granting Ticket validi per qualsiasi identità nel dominio, essenzialmente impersonando chiunque (anche un Domain Admin) e ottenendo accesso illimitato[26][27]. Il Golden Ticket consente accesso non autorizzato a qualsiasi sistema come utente privilegiato (Domain Admin) e può restare valido per un lungo periodo senza essere rilevato se non si monitorano attentamente i ticket (l’attaccante può anche personalizzare durata e attributi del ticket). È chiamato “Golden” perché garantisce controllo totale del “regno” AD. – Silver Ticket: simile al Golden, ma invece di compromettere krbtgt, l’attaccante compromette la chiave di un singolo servizio (ad esempio rubando l’hash di password di un account computer o account servizio). Con quella chiave può falsificare ticket di servizio validi per quel particolare servizio solamente. Ad esempio, ottenendo la password di un server applicazioni, può creare un ticket Kerberos per farsi passare per qualsiasi utente verso quel server. Non richiede contattare il KDC, quindi può sfuggire più facilmente al monitoraggio. È limitato a uno specifico servizio, ma se quel servizio gira su un server membro, l’attaccante può usare il Silver Ticket per eseguire code injection e magari arrivare comunque a privilegi di sistema su quell’host, poi muoversi lateralmente. – Pass-the-Ticket: attacco in cui un aggressore ruba un ticket Kerberos valido dalla macchina di un utente (tipicamente un TGT in cache, estraendolo dalla memoria con strumenti come Mimikatz) e lo riutilizza su un altro sistema per impersonare quell’utente senza conoscere le credenziali[28]. In pratica “passa” il ticket rubato, potendo accedere a risorse di rete come se fosse l’utente legittimo. Questo è possibile se l’attaccante ha compromesso una macchina e può estrarre i ticket dalla sessione utente. – Overpass-the-Hash (Pass-the-Key): variante avanzata dove l’attaccante usa l’hash NTLM di un utente per ottenere un TGT Kerberos (convincendo il sistema a generare un ticket con quell’hash). Combina tecniche di pass-the-hash con Kerberos, permettendo di trasformare un furto di hash in un ticket Kerberos valido[29]. – Delegation abuse: Kerberos supporta meccanismi di delegazione che consentono a un servizio di impersonare gli utenti verso altri servizi (utile, ad esempio, per frontend web che devono accedere a un database usando l’identità dell’utente). Esistono la delega non vincolata, vincolata e vincolata alle risorse. Se mal configurate, un utente malintenzionato che compromette un servizio con delega può ottenere ticket che gli consentono di impersonare utenti di alto livello verso altri servizi, realizzando escalation di privilegi[30][31]. In particolare, la unconstrained delegation è pericolosa: qualsiasi account con delega non vincolata può agire come qualsiasi utente che si autentichi su di esso, spesso includendo Domain Admin che accedono al servizio compromesso. – Vulnerabilità crittografiche: L’uso di vecchi algoritmi (DES, RC4) è oggi sconsigliato; Microsoft negli ultimi anni ha rilasciato patch per forzare l’uso di AES e migliorare la protezione del PAC (es. CVE-2021-42287/42278 e aggiornamenti 2022/2023 che richiedono PAC signature sempre valida). Se l’infrastruttura non è aggiornata, un attacker potrebbe sfruttare debolezze note, come spoof del PAC signature (varie CVE 2021-2022) o attacchi brute force agevolati da DES abilitato.

    In generale, Kerberos in AD resta robusto, ma la sua sicurezza dipende dalla protezione delle chiavi segrete (password degli account, in primis quella di krbtgt e dei service account) e dalla corretta configurazione. Molti attacchi puntano a estrarre o riutilizzare ticket (pass-the-ticket) o falsificarli conoscendo le chiavi (Golden/Silver). L’evoluzione delle minacce e l’uso scorretto di Kerberos in ambienti complessi ha portato ad una maggiore esposizione nel tempo[32], rendendo fondamentale l’adozione di contromisure adeguate.

    Integrazione di Kerberos in Active Directory

    In un dominio Active Directory, Kerberos è strettamente integrato e rappresenta la spina dorsale dell’autenticazione. Ogni Domain Controller AD funge da KDC per il suo dominio: in particolare, sul DC girano i servizi Kerberos Authentication Service e Ticket-Granting Service. Quando un client Windows parte di un dominio esegue il logon, di default contatta un DC per ottenere un TGT Kerberos; analogamente, ogni volta che accede a una risorsa di rete (file server, SQL, web app) in grado di Kerberos, utilizza Kerberos con il DC per ottenere i relativi ticket.

    L’integrazione comporta alcuni aspetti tecnici importanti: – Account krbtgt: in ogni dominio AD esiste un account utente speciale chiamato krbtgt. Esso non ha login interattivo ma possiede la chiave segreta del KDC. Questa chiave (derivata dalla password random generata all’installazione del dominio) è usata da ogni DC per cifrare e firmare i TGT che emette. Tutti i DC del dominio condividono la stessa chiave krbtgt (replicata come parte di AD). Proteggere l’account krbtgt è fondamentale: come detto, se un attaccante ne ottiene l’hash, può firmare Golden Ticket validi ovunque nel dominio. – Service Principal Name (SPN): AD tiene traccia di tutti i servizi di rete registrati per Kerberos tramite gli SPN associati agli account computer o servizio. Ad esempio, un server SQL di nome DB01 avrà un SPN del tipo MSSQLSvc/DB01.dominio.local. Quando un client chiede un ticket per MSSQLSvc/DB01.dominio.local, il KDC cerca in AD quale account ha quell’SPN (in questo caso l’account computer DB01 se SQL gira sotto Local System, oppure un account utente dedicato se SQL ha un service account) e userà la chiave di quell’account per cifrare il ticket di servizio. La gestione corretta degli SPN è essenziale per Kerberos: SPN duplicati o errati causano errori di autenticazione. Inoltre gli SPN sono sfruttati nell’attacco Kerberoasting, come visto, per individuare account servizio. – PAC e autorizzazioni: Quando un DC AD emette un ticket Kerberos (TGT o service), vi include il Privilege Attribute Certificate con i SID dei gruppi e altri dettagli di privilegio dell’utente. Ciò significa che l’autorizzazione alle risorse può essere valutata dai server immediatamente leggendo il PAC nel ticket presentato. Un file server, ad esempio, quando riceve un ticket da un utente, estrae dal PAC i gruppi dell’utente e può determinare se l’ACL sulla cartella consente accesso. Questa integrazione rende Kerberos in AD più di un semplice autenticatore: trasporta anche informazioni di autorizzazione. Il rovescio della medaglia è che un PAC falsificato (come in Golden Ticket) può ingannare i server facendogli credere che l’utente abbia privilegi che non ha. Per mitigare, i server Windows possono convalidare i PAC chiedendo conferma a un DC (PAC validation). – Trust tra domini: In AD, se un dominio A ha un trust (bidirezionale, transitivo tipicamente) verso dominio B, Kerberos supporta l’autenticazione inter-dominio. Un KDC del dominio A può emettere un Referral Ticket che il client userà per farsi riconoscere da un KDC del dominio B, ottenendo poi ticket per servizi nel dominio B. Questo meccanismo cross-realm (multi-foresta se c’è trust) consente SSO tra domini diversi. Dal punto di vista di un SOC, la fiducia tra domini estende la superficie d’attacco (un attaccante in un dominio potrebbe muoversi su un dominio trusted se riesce a ottenere credenziali valide). È importante quindi gestire con attenzione i trust (limitare quelli esterni non necessari, o usare trust con autenticazione selettiva). – Fallback NTLM: Nonostante Kerberos sia predefinito, AD consente fallback a NTLM in scenari come: client non domain-joined che accedono a risorse tramite credenziali, alcuni protocolli legacy che non supportano Kerberos, o casi di errori (es. orologio fuori sync). Il Domain Controller dunque gestisce anche l’NTLM Authentication Service (tramite il servizio NETLOGON). In un’ottica di sicurezza, ridurre l’uso di NTLM è consigliato perché è meno sicuro; AD offre policy (per esempio via GPO) per rifiutare NTLM in vari scope, preferendo Kerberos.

    In sintesi, Active Directory è costruito intorno a Kerberos: senza Kerberos (o NTLM come riserva), gli utenti non potrebbero autenticarsi nel dominio. Per questo la compromissione di componenti Kerberos (come krbtgt o account servizio) equivale alla compromissione di AD stesso. Viceversa, solide policy su AD (password forti, account protetti) rafforzano Kerberos. Un amministratore AD deve avere competenza di Kerberos per capire fenomeni come errori di SPN, scadenza di ticket, e un analista SOC deve sapere interpretare eventi Kerberos (ad esempio i log di Kerberos su DC – Event ID 4768, 4769, 4771 che indicano emissione di TGT, TGS o fallimenti). L’integrazione consente anche funzionalità avanzate come Smartcard logon (Kerberos supporta autenticazione tramite certificati mappati a un utente AD) e protocollo Kerberos Armoring (Flexible Authentication Secure Tunneling – FAST – che mitiga alcuni attacchi come brute force su PA). Queste caratteristiche possono essere implementate per incrementare la sicurezza dell’ambiente.

    Di seguito descriviamo un esempio pratico di installazione e configurazione di un dominio Active Directory (su Windows Server) e come ciò fornisce autenticazione Kerberos centralizzata:

    1. Installazione di Active Directory Domain Services: Si parte da un server Windows (es. Windows Server 2022). Tramite Server Manager, si aggiunge il ruolo Active Directory Domain Services (AD DS). Completata l’installazione, si esegue il promuovi a controller di dominio per creare una nuova foresta. Durante questa procedura si sceglie il nome del dominio (ad es. laboratorio.local), si imposta la modalità di funzionamento (livello funzionale), si definisce una password DSRM (per il ripristino di Directory Service). Dopo il riavvio, il server diventa il Domain Controller del dominio laboratorio.local. Automaticamente vengono configurati i servizi Kerberos KDC e DNS integrato.
    2. Aggiunta di client e membri al dominio: Su una macchina client (Windows 10/11) si esegue join al dominio (impostando nei dettagli di sistema il dominio laboratorio.local e fornendo credenziali di un amministratore del dominio). Una volta unito, all’avvio l’utente potrà effettuare il logon scegliendo account di dominio. Questo processo implica che il client contatta il DC e utilizza Kerberos per autenticare l’utente: se inseriamo le credenziali di un utente di dominio valido, il DC rilascerà al client un TGT Kerberos e consentirà l’accesso. Da notare che se il DC non fosse raggiungibile, l’utente potrebbe ancora loggarsi con cache delle credenziali (Cached Logon), ma non otterrebbe ticket aggiornati per risorse di rete.
    3. Creazione di utenti, gruppi e unità organizzative: Tramite la console Active Directory Users and Computers (ADUC) si possono creare nuove OU (ad esempio “Uffici” con sottocartelle “Vendite”, “IT”), quindi creare utenti (es. utente alice in OU Vendite e utente admin-it in OU IT) e gruppi globali (es. gruppo VenditeTeam). Quindi si aggiunge l’utente alice al gruppo VenditeTeam. Queste operazioni di fatto centralizzano la gestione: invece di creare account su ogni singolo server, abbiamo un unico account dominio per Alice che vale su tutte le macchine del dominio.
    4. Configurazione dei permessi di accesso alle risorse: Supponiamo che su un file server membro del dominio vi sia una cartella riservata al team Vendite. Tramite le ACL NTFS di Windows, si può assegnare i diritti di Lettura/Scrittura al gruppo di dominio VenditeTeam su quella cartella. Così, quando Alice (membro del gruppo) accede al file server, il suo token (derivato dal ticket Kerberos con PAC) indicherà l’appartenenza a VenditeTeam e il server le concederà l’accesso. Se invece Bob, che non è nel gruppo, provasse, verrebbe negato. Questo mostra la comodità: basta gestire i membri del gruppo in AD per controllare l’accesso, senza dover definire utenti locali su ogni server o permessi individuali.
    5. Implementazione di criteri di sicurezza via Group Policy: Tramite la console Group Policy Management, creiamo o modifichiamo per esempio la Default Domain Policy per applicare regole di sicurezza a tutti gli utenti del dominio. Si può abilitare la complessità delle password, impostare il blocco dell’account dopo 5 tentativi falliti, definire che i membri del gruppo “Domain Admins” ricevano auditing speciale, ecc. Queste impostazioni vengono automaticamente applicate dai DC a tutti i sistemi. Possiamo anche creare GPO mirate: ad esempio una GPO collegata all’OU “IT” che disabilita l’uso di dispositivi USB per i computer IT e impone l’MFA per gli account amministrativi (se infrastruttura ADFS/Azure AD disponibile). Nell’ambito Kerberos, attraverso i Kerberos Policy Settings (in Default Domain Policy > Account Policies > Kerberos Policy) possiamo regolare parametri come la durata massima dei ticket (es. 4 ore per TGT e 8 ore per ticket di servizio), il tempo massimo di skew, e il numero massimo di rinnovi. Di solito si lasciano i default, ma è importante sapere che esistono – ad esempio in ambienti ad alta sicurezza si potrebbe ridurre la durata dei ticket per mitigare il rischio di reuse.
    6. Abilitazione dell’auditing di sicurezza: Per assicurare la tracciabilità, tramite GPO Default Domain Controllers Policy (che si applica ai DC), abilitiamo le audit policy: ad esempio in Computer Configuration > Windows Settings > Security Settings > Advanced Audit Policy Configuration abilitiamo Account Logon, Account Management, Directory Service Access, Logon/Logoff sia Success che Failure[15][16]. Applichiamo la GPO ed eseguiamo gpupdate. Da questo momento i Domain Controller inizieranno a loggare eventi come logon utente, creazione account, ecc. Per esempio, se l’utente admin-it aggiunge Alice al gruppo Domain Admins, sul DC verrà generato un evento ID 4728 (A member was added to a security-enabled global group) con i dettagli; un SOC potrebbe ricevere un alert immediato su questo.
    7. Test e verifica: Ora Alice può loggarsi su qualsiasi PC del dominio con il suo account unico. Quando lo fa, il PC contatta il DC e (trasparentemente) ottiene un TGT Kerberos per Alice. Se Alice accede alla cartella condivisa del file server, il suo PC utilizza il TGT per richiedere al DC un ticket di servizio per cifs/fileserver; DC glielo fornisce, e Alice accede senza reinserire credenziali (SSO). Possiamo verificare con il comando klist sul PC di Alice che nella cache Kerberos ci sono i ticket ottenuti (TGT e ticket per il file server). Sul file server, se tentasse l’accesso Bob (non nel gruppo), Windows loggerebbe un evento di accesso negato.
    8. Strumenti amministrativi aggiuntivi: L’esempio può includere l’uso di Active Directory Administrative Center (ADAC) per gestione avanzata (con interfaccia più moderna e PowerShell integrato), oppure l’uso di PowerShell (modulo ActiveDirectory) per automatizzare operazioni (es: creare più utenti da CSV). Inoltre, implementare LAPS (Local Administrator Password Solution) su client e server membri garantisce che ogni macchina abbia password amministratore locale univoca e archiviata in AD, migliorando la sicurezza (mitiga pass-the-hash su account locali). Le migliori pratiche suggeriscono di usare account amministrativi separati per l’amministrazione (es. admin-it) diversi dagli account personali (Alice), di posizionare gli amministratori in OU con policy più restrittive (es. blocco login interattivo su workstation non amministrative, enforcement di MFA), ecc., tutte cose configurabili via AD.

    Questo scenario illustra come Active Directory centralizzi la gestione: un amministratore controlla da un unico punto utenti, gruppi, policy, e Kerberos fa sì che le autenticazioni e le autorizzazioni funzionino automaticamente su tutti i servizi membri del dominio. Per un SOC ciò significa anche che la compromissione di AD (ad esempio un DC violato, o un account admin rubato) ha impatto ovunque, quindi grande attenzione va posta nel monitorare e proteggere AD.

    Active Directory e Kerberos essendo componenti critici e diffusissimi, presentano un’ampia superficie d’attacco. Come notato, AD è spesso un obiettivo primario dei cyber attacchi per via del suo ruolo centrale[2]. In un contesto CSIRT/SOC, è essenziale conoscere le principali tecniche di attacco che i malintenzionati utilizzano contro AD/Kerberos e predisporre contromisure. Di seguito esaminiamo alcune delle tecniche di attacco comuni e i rischi associati, con relative contromisure:

    • Pass-the-Ticket: Consente a un attaccante di rubare ticket Kerberos dalla memoria di una macchina compromessa e riutilizzarli altrove. Ad esempio, tramite malware o tool post-exploitation (es. Mimikatz) l’attaccante estrae il TGT dell’utente corrente (in formato Kerberos Cache). Con quel TGT valido può impersonare l’utente su altri sistemi del dominio, ottenendo accesso non autorizzato senza conoscere la password[28]. Contromisure: rendere difficile l’estrazione di credenziali dalla memoria – abilitare LSA Protection su sistemi Windows (protezione dei processi LSA), usare Windows Defender Credential Guard sulle workstation (che isola i ticket Kerberos in un ambiente virtualizzato), limitare l’adesione di macchine non sicure al dominio. Inoltre, implementare rigorosi controlli sugli account privilegiati (che non dovrebbero lavorare su macchine esposte dove un malware potrebbe rubarne i ticket) e monitorare eventi di autenticazione anomali, ad esempio TGT usati da device insoliti.
    • Golden Ticket: Come descritto, è la capacità di generare TGT arbitrari dopo aver compromesso krbtgt. Il rischio qui è massimo: un Golden Ticket consente di impersonare qualsiasi account (anche non esistente) e dura fino a 10 anni di default se non specificato diversamente, con possibilità di rinnovo infinito. Un attaccante con Golden Ticket può continuare ad avere accesso anche se la violazione iniziale (es. un malware su un server) viene rimossa, perché può crearsi nuovi TGT a piacimento. Contromisure: l’unica difesa efficace è prevenire la compromissione iniziale – quindi proteggere gli account con privilegi che potrebbero portare a Domain Admin e quindi a krbtgt. Ma se si sospetta un Golden Ticket, l’azione da fare è reimpostare due volte la password dell’account krbtgt (due volte perché AD mantiene due chiavi attive per tollerare un cambio, la seconda rotazione invalida sicuramente tutti i ticket generati con la chiave vecchia). Questo è distruttivo (tutti i TGT esistenti diventano invalidi, forzando ri-autenticazione globale) ma necessario in caso di compromissione. Inoltre, monitorare i DC per segni di Golden Ticket: ad esempio ticket con durata anomala o ID fuori range (il Golden Ticket spesso ha un SID 500 amministratore o attributi anomali). Strumenti di detection come Microsoft ATA/Defender Identity segnalano pattern noti di Golden Ticket[33]. Best practice: cambiare l’account krbtgt periodicamente (es. ogni 6-12 mesi) per limitare la finestra di abuso, e soprattutto evitare che un attacker ottenga Domain Admin in primo luogo.
    • Silver Ticket: Permette attacchi mirati a singoli servizi. Un aggressore con hash di un account computer può autenticarsi presso quel servizio quanto vuole. Contromisure: proteggere gli hash degli account macchina e servizio. Questo significa principalmente mantenere i server al sicuro (se un attacker ottiene System su un server, ne estrae l’hash e può creare Silver Ticket per servizi offerti da quel server). L’uso di Managed Service Accounts (MSA/gMSA) aiuta: queste speciali tipologie di account servizio hanno password lunghe gestite automaticamente da AD e non recuperabili in chiaro dagli admin, riducendo il rischio di furto hash. Inoltre, su servizi critici si può abilitare l’AES-only per Kerberos (evitando RC4 che è più facile da usare negli attacchi Silver Ticket in combinazione con pass-the-hash).
    • Kerberoasting: Punta alle password dei service account. Contromisure: adottare password molto robuste per tutti gli account con SPN (ideale >25 caratteri casuali) in modo che il cracking offline sia impraticabile in tempi ragionevoli. Meglio ancora, utilizzare gMSA per i servizi: le gMSA randomizzano automaticamente la password ogni 30 giorni e di solito hanno 120 caratteri, virtualmente impossibili da crackare. Inoltre, eseguire periodicamente un audit degli SPN registrati in AD e individuare account “deboli” (es. con password semplici o mai cambiate) da mettere in sicurezza. Disabilitare la pre-auth è sconsigliato, come già detto, quindi verificare che tutti gli account utente abbiano “Do not require Kerberos preauthentication” non selezionato (solo rarissimi servizi legacy richiedono di toglierla). Un altro controllo: mettere account sensibili nel gruppo “Protected Users” di AD – i membri di questo gruppo non possono usare cifrature deboli né essere soggetti a Kerberoasting in quanto non ottengono ticket TGS rilasciati con chiavi RC4 (usano sempre AES) e hanno TGT con vita breve non rinnovabile.
    • Pass-the-Hash / Overpass-the-Hash: Queste tecniche spesso precedono o seguono quelle Kerberos. Un attaccante che ha l’hash NTLM di un admin può usarlo per autenticarsi (NTLM) o per generare ticket Kerberos (overpass). Contromisure: adottare misure di protezione credenziali sulle macchine (LsaProtect, CredentialGuard come già detto) e minimizzare la presenza di hash di admin su sistemi meno sicuri. Microsoft consiglia il modello Tiered Administration: account amministratore del dominio usati solo sui DC o sistemi Tier-0; account admin di server solo su server, ecc. Così, anche se viene compromesso un PC di un utente, non dovrebbe trovarsi in RAM l’hash di un Domain Admin (che non vi ha mai fatto login). Utilizzare soluzioni come Privileged Access Workstations dedicate agli amministratori per evitare di esporre credenziali alte su macchine esposte a internet o userland.
    • Attacchi alla delega Kerberos: Un attacker che compromette un servizio con delega non vincolata potrebbe impersonare utenti. Contromisure: evitare per quanto possibile la delega non vincolata; preferire la constrained delegation con protocol transition solo dove necessario e aggiungendo l’opzione “ProtocolcTransition e Constrained only to specific services (Resource-based constrained delegation)” introdotta in Windows 2012+; monitorare gli account configurati con delega (sono un potenziale rischio se compromessi). Microsoft offre comandi PowerShell (Get-ADObject -Filter {TrustedForDelegation -eq $True}) per elencarli.
    • Attacchi ai DC (DCSync, DCShadow): Un attaccante con privilegi di Domain Admin può utilizzare tool come mimikatz per simulare il comportamento di un DC e estrarre tutti gli hash delle password (DCSync) o iniettare oggetti malevoli nel directory (DCShadow). Questi sono attacchi post-exploit avanzati. Contromisure: impedire di arrivare a Domain Admin è la chiave. Inoltre, monitorare chiamate replicate anomale: un server che non è DC non dovrebbe mai richiedere replicazioni come se fosse un DC. I log di Directory Service Event ID 4662 con operazioni sospette possono rivelare DCSync (accesso a repliche di segreti). Abilitare l’Advanced Auditing per Directory Service Replication aiuta a catturare questi eventi.

    Riassumendo i rischi: se AD viene compromesso in uno dei modi sopra, l’intera rete è a rischio – l’attaccante può leggere email, rubare dati, distribuire malware tramite GPO, o distruggere il dominio. È compito del SOC rilevare segnali precoci: ad esempio, un account che passa improvvisamente a membro di Domain Admin, o l’utilizzo di un account krbtgt (che non dovrebbe mai eseguire logon), o ancora volumi anomali di ticket TGS richiesti (indicatore di Kerberoasting). La difesa è in profondità: prevenzione, durevoli misure di protezione e robusto monitoring.

    La protezione di AD/Kerberos richiede un insieme di best practice procedurali e tecniche. Elenchiamo le più importanti che un team di sicurezza dovrebbe implementare:

    • Principio del minimo privilegio: Limitare rigorosamente il numero di utenti con diritti amministrativi sul dominio. Gli account privilegiati (Domain Admins, Enterprise Admins) dovrebbero essere pochissimi e utilizzati solo quando necessario. Creare ruoli amministrativi delegati per attività specifiche (es. helpdesk può reset password ma non aggiungere membri a Domain Admins). Questo limita l’impatto di eventuali credenziali compromesse.
    • Account amministrativi protetti: Per gli amministratori di dominio, utilizzare account separati dall’utenza normale (es. Mario Rossi usa account standard per email/browsing e un account admin dedicato solo per AD). Tali account vanno collocati in OU con GPO restrittive (es. impedirne l’uso per login interattivo su workstation utenti, forzare MFA, negare accesso da macchine non amministrative). Impiegare workstation sicure dedicate (PAW) per le operazioni amministrative, isolate da internet e da attività a rischio.
    • Protezione delle credenziali e delle chiavi sensibili: Implementare strumenti come LAPS per gestire password locali univoche su ogni macchina (mitiga movimenti laterali via pass-the-hash). Abilitare Credential Guard sui sistemi client se possibile. Per gli account “krbtgt” e quelli di servizio ad alto privilegio, prevedere un cambio password periodico (per krbtgt, come detto, idealmente 2 cambi consecutivi ogni tot mesi) e monitorare il suo utilizzo. Assicurarsi che la pre-autenticazione Kerberos sia sempre abilitata per tutti gli account utente e servizio[34]. Utilizzare Group Managed Service Accounts (gMSA) per i servizi: queste password lunghe e ruotate automaticamente riducono enormemente il rischio di Kerberoasting e la necessità di gestire manualmente credenziali di servizio[35].
    • Hardening dei Domain Controller: I DC dovrebbero essere trattati come sistemi altamente sensibili (Tier 0). Eseguirli su hardware/VM dedicate, con accesso fisico/logico limitato. Disattivare sui DC qualsiasi software o servizio non necessario (niente navigazione internet, niente software di produttività). Mantenere i DC aggiornati con le patch di sicurezza di Windows senza eccezioni – molte patch critiche negli ultimi anni riguardavano Kerberos (es. vulnerabilità PAC, privilege escalation). Considerare di isolare la rete dei DC (segmentazione) così che solo gli host autorizzati possano comunicare con essi sulle porte LDAP/Kerberos.
    • Adozione di misure avanzate Kerberos: Valutare l’uso della funzionalità “Protected Users” in AD – mettendo gli account amministrativi in questo gruppo si applicano restrizioni automatiche: niente NTLM, niente ticket TGT longevi (max 4 ore), richiesta AES obbligatoria, nessuna delega Kerberos consentita, etc. Questo mitiga diversi attacchi. Attivare inoltre le policy di sicurezza Kerberos: ad esempio, abilitare “Kerberos client supporta solo AES” su client e server (impedisce fallback a RC4), e assicurarsi che “PAC Signature Required” sia attiva (ci sono stati aggiornamenti che ora lo rendono obbligatorio per evitare PAC spoofing).
    • Monitoraggio continuo e analisi dei log: Implementare una soluzione SIEM per raccogliere centralmente i log di sicurezza da DC, server e magari anche workstation chiave. Configurare regole di correlazione per eventi AD: ad esempio, alert se un account viene aggiunto ai gruppi Admins, se vengono creati utenti con privilegi, se compaiono autenticazioni di computer fuori orario o da IP insoliti, se un singolo utente richiede tanti ticket per servizi diversi (pattern di Kerberoasting), ecc. Il monitoring continuo e proattivo è essenziale per individuare tempestivamente attività sospette[36]. Microsoft offre strumenti come Defender for Identity (ex Azure ATP) che analizzano in tempo reale i domain controller alla ricerca di indicatori noti (tentativi di DCSync, Golden Ticket, ecc.). Anche senza soluzioni commerciali, molto può essere fatto con il tuning dei log e script personalizzati.
    • Procedure di risposta e recovery pianificate: Un team CSIRT deve predisporre piani specifici per scenari di compromissione AD. Ad esempio, procedure per rotazione urgente di krbtgt (script predefiniti da eseguire su DC), per isolare un DC sospetto, per ripristinare AD da backup in caso di attacco distruttivo (ransomware su DC). Esercitazioni periodiche di recovery AD (incluse prove di Active Directory Forest Recovery) dovrebbero essere svolte, dato che AD è critico (“se AD non funziona, non funziona nulla”[37]). Mantenere backup offline della foresta AD e testarne la validità regolarmente fa parte delle best practice.
    • Migliorare la postura di sicurezza continuamente: Effettuare regolarmente un AD Health Check e un security assessment dell’AD[38]. Ci sono strumenti (es. PingCastle, Purple Knight[38]) che analizzano la configurazione AD evidenziando configurazioni deboli (account con SPN senza pre-auth, deleghe pericolose, permessi ACL anomali, trust deboli, ecc.). Dare seguito a queste raccomandazioni aiuta a ridurre la superficie d’attacco. Documentare e aggiornare costantemente le policy di sicurezza AD, allineandosi alle linee guida Microsoft e CIS Benchmark[39][40].
    • User awareness e formazione amministratori: Non trascurare l’aspetto umano. Formare gli amministratori e i membri del SOC sulle minacce AD (attacchi Golden Ticket, pass-the-hash, ecc.) e sulle procedure di sicurezza (es. non inserire credenziali Domain Admin su prompt sospetti, attenzione al phishing mirato agli admin, etc.). Erogare anche agli utenti awareness sul non installare software non autorizzato, riconoscere email di phishing – tutto ciò riduce le chance iniziali di compromissione che poi potrebbe propagarsi su AD. In caso di incidenti, un amministratore preparato saprà come controllare i DC, dove cercare gli indicatori (log di evento Kerberos, registro replicazione, etc.) e potrà reagire tempestivamente.

    In conclusione, Active Directory con Kerberos offre una gestione centralizzata potentissima e conveniente, ma richiede disciplina di sicurezza elevata. Un proverbio in ambito AD dice: “Active Directory detiene le chiavi del tuo regno, ma è sicuro?”[41]. Spetta all’organizzazione implementare difese in profondità: hardening, monitoring e readiness alla risposta. Con le giuste best practice, AD/Kerberos può rimanere un pilastro affidabile dell’infrastruttura, offrendo i vantaggi del single sign-on e dell’amministrazione centralizzata senza diventare il singolo punto di falla. Continuo scrutinio, patching e miglioramento dei controlli sono necessari poiché anche le minacce evolvono e prendono di mira Kerberos ed AD in modi sempre nuovi. Con un’adeguata messa in sicurezza, il team CSIRT/SOC potrà sfruttare al meglio le funzionalità di AD e Kerberos mantenendo l’ambiente protetto e resiliente.

    Come gestire array RAID

    Come gestire gli array RAID con mdadm su Ubuntu 22.04

    Gli array RAID forniscono prestazioni e ridondanza migliorate combinando singoli dischi in dispositivi di archiviazione virtuali in configurazioni specifiche. In Linux, l’utility mdadmcrea e gestisce array RAID software.

    In questa guida eseguirai diverse configurazioni RAID che possono essere configurate utilizzando un server Ubuntu 22.04.

    Per seguire questa guida, avrai bisogno dell’accesso a un utente non-root sudo.

    Come accennato, questa guida riguarderà la gestione dell’array RAID. Segui la guida su come creare array RAID con mdadmsu Ubuntu 22.04 per creare uno o più array prima di continuare a leggere. Questa guida presuppone che tu abbia uno o più array su cui operare.

    Uno dei requisiti più essenziali per una corretta gestione è la capacità di reperire informazioni sulla struttura, sui dispositivi che lo compongono e sullo stato attuale dell’array.

    Per informazioni dettagliate su un dispositivo RAID, passare il dispositivo RAID con l’opzione -Do --detaila mdadm:

    sudo mdadm -D /dev/md0

    Verranno visualizzate informazioni importanti sull’array:

    Output/dev/md0:
               Version : 1.2
         Creation Time : Thu Sep 29 17:07:10 2022
            Raid Level : raid10
            Array Size : 209582080 (199.87 GiB 214.61 GB)
         Used Dev Size : 104791040 (99.94 GiB 107.31 GB)
          Raid Devices : 4
         Total Devices : 4
           Persistence : Superblock is persistent
    
           Update Time : Thu Sep 29 17:08:24 2022
                 State : clean, resyncing
        Active Devices : 4
       Working Devices : 4
        Failed Devices : 0
         Spare Devices : 0
    
                Layout : near=2
            Chunk Size : 512K
    
    Consistency Policy : resync
    
                  Name : raid2:0  (local to host raid2)
                  UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0
                Events : 35
    
        Number   Major   Minor   RaidDevice State
           0       8        0        0      active sync set-A   /dev/sda
           1       8       16        1      active sync set-B   /dev/sdb
           2       8       32        2      active sync set-A   /dev/sdc
           3       8       48        3      active sync set-B   /dev/sdd

    L’output rivela il livello RAID, la dimensione dell’array, lo stato dei singoli pezzi, il file UUIDdell’array, i dispositivi componenti e i loro ruoli.

    Per i dettagli abbreviati di un array, adatti per l’aggiunta al file /dev/mdadm/mdadm.conf, puoi passare il flag --briefO -bcon la vista dettagliata:

    sudo mdadm -Db /dev/md0

    Output
    /dev/md0: 199.88GiB raid10 4 devices, 0 spares. Use mdadm --detail for more detail.

    Questo può essere utilizzato per trovare a colpo d’occhio le informazioni chiave su un dispositivo RAID.

    Ottenere informazioni sui dispositivi componenti

    Puoi anche usare mdadmper interrogare i singoli dispositivi componenti.

    L’opzione -Q, se utilizzata con un dispositivo componente, ti dirà l’array di cui fa parte e il suo ruolo:

    sudo mdadm -Q /dev/sdc

    Output
    /dev/sdc: is not an md array
    /dev/sdc: device 2 in 4 device active raid10 /dev/md0.  Use mdadm --examine for more detail.

    È possibile ottenere informazioni più dettagliate utilizzando le opzioni -Eo --examine:

    sudo mdadm -E /dev/sdc

    Output
    /dev/sdc:
              Magic : a92b4efc
            Version : 1.2
        Feature Map : 0x0
         Array UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0
               Name : RAID2204:0  (local to host RAID2204)
      Creation Time : Wed Oct  5 15:56:03 2022
         Raid Level : raid10
       Raid Devices : 4
    
     Avail Dev Size : 209582080 sectors (99.94 GiB 107.31 GB)
         Array Size : 209582080 KiB (199.87 GiB 214.61 GB)
        Data Offset : 133120 sectors
       Super Offset : 8 sectors
       Unused Space : before=132968 sectors, after=0 sectors
              State : clean
        Device UUID : 027f74c5:6d488509:64844c7a:add75d88
    
        Update Time : Wed Oct  5 16:13:57 2022
      Bad Block Log : 512 entries available at offset 136 sectors
           Checksum : 98edf3ae - correct
             Events : 35
    
             Layout : near=2
         Chunk Size : 512K
    
       Device Role : Active device 2
       Array State : AAAA ('A' == active, '.' == missing, 'R' == replacing)

    Queste informazioni sono simili a quelle visualizzate quando si utilizza l’opzione -Dcon il dispositivo dell’array, ma focalizzata sulla relazione del dispositivo componente con l’array.

    Leggere le informazioni su /proc/mdstat

    Per informazioni dettagliate su ciascuno degli array assemblati sul tuo server, controlla il file /proc/mdstat. Questo è spesso il modo migliore per trovare lo stato corrente degli array attivi sul tuo sistema:

    cat /proc/mdstat

    Output
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
          209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
          
    unused devices: <none>

    L’output qui è piuttosto denso e fornisce molte informazioni in una piccola quantità di spazio:

    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    . . .

    La riga Personalitiesdescrive i diversi livelli RAID e le configurazioni attualmente supportate dal kernel.

    La riga che inizia con md0descrive l’inizio della descrizione di un dispositivo RAID. Le righe rientrate che seguono descrivono anche questo dispositivo:

    . . .
    md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
    . . .

    La prima riga indica che l’array è attivo, non difettoso e configurato come RAID 10. Successivamente vengono elencati i dispositivi componenti utilizzati per costruire l’array. I numeri tra parentesi descrivono il ruolo attuale del dispositivo nell’array. Ciò influisce su quali copie dei dati vengono fornite al dispositivo.

    . . .
          209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
    . . .

    La seconda riga visualizzata in questo esempio fornisce il numero di blocchi forniti dai dispositivi virtuali, la versione dei metadati (1.2 in questo esempio) e la dimensione del blocco dell’array. Poiché si tratta di un array RAID 10, include anche informazioni sul layout dell’array. In questo esempio, è stato configurato per memorizzare due copie di ogni blocco di dati nel layout near.

    Gli ultimi elementi tra parentesi quadre rappresentano entrambi i dispositivi attualmente disponibili di un set integro. Il primo numero tra parentesi numeriche indica la dimensione di un array integro mentre il secondo numero rappresenta il numero di dispositivi attualmente disponibili. Le altre parentesi sono un’indicazione visiva dello stato dell’array, con Uche rappresentano dispositivi sani e _che rappresentano dispositivi difettosi.

    Se il tuo array è attualmente in fase di assemblaggio o ripristino, potresti avere un’altra riga che mostra l’avanzamento:

    . . .
          [>....................]  resync =  0.9% (2032768/209584128) finish=15.3min speed=225863K/sec
    . . .

    Descrive l’operazione applicata e lo stato di avanzamento attuale in diversi modi. Fornisce inoltre la velocità attuale e un tempo stimato fino al completamento.

    Una volta che ti sei fatto un’idea di quali array sono attualmente in esecuzione sul tuo sistema, puoi intraprendere una serie di azioni.

    Per arrestare un array, il primo passo è smontarlo.

    Esci dalla directory montata con il comando cd ~:

    cd ~

    Quindi smonta il dispositivo:

    sudo umount /mnt/md0

    Puoi interrompere tutti gli array attivi eseguendo:

    sudo mdadm --stop --scan

    Se vuoi fermare un array specifico, passalo al comando mdadm --stop:

    sudo mdadm --stop /dev/md0

    Questo fermerà l’array. Dovrai riassemblare l’array per accedervi nuovamente.

    Per avviare tutti gli array definiti nei file di configurazione o /proc/mdstat, esegui quanto segue:

    sudo mdadm --assemble --scan

    Per avviare un array specifico, puoi passarlo come argomento a mdadm --assemble:

    sudo mdadm --assemble /dev/md0

    Funziona se l’array è definito nel file di configurazione.

    Se nel file di configurazione manca la definizione corretta dell’array, l’array può comunque essere avviato passando i dispositivi componenti:

    sudo mdadm --assemble /dev/md0 /dev/sda /dev/sdb /dev/sdc /dev/sdd

    Una volta assemblato l’array, è possibile montarlo come al solito:

    sudo mount /dev/md0 /mnt/md0

    È possibile aggiungere dispositivi di riserva a qualsiasi array che offra ridondanza, come RAID 1, 5, 6 o 10. I dispositivi di riserva non verranno utilizzati attivamente dall’array a meno che un dispositivo attivo non si guasti. Quando ciò accade, l’array risincronizzerà i dati sull’unità di riserva per ripristinare l’integrità dell’array. Non è possibile aggiungere ricambi agli array non ridondanti (RAID 0) poiché l’array non sopravvivrà al guasto di un’unità.

    Per aggiungere un dispositivo di riserva, passare l’array e il nuovo dispositivo al comando mdadm --add:

    sudo mdadm /dev/md0 --add /dev/sde

    Se l’array non è in uno stato degradato, il nuovo dispositivo verrà aggiunto come riserva. Se il dispositivo è attualmente danneggiato, inizierà immediatamente l’operazione di risincronizzazione utilizzando l’unità di riserva per sostituire l’unità difettosa.

    Dopo aver aggiunto un ricambio, aggiorna il file di configurazione per riflettere il nuovo orientamento del dispositivo:

    sudo nano /etc/mdadm/mdadm.conf

    Rimuovi o commenta la riga corrente che corrisponde alla definizione dell’array:

    . . .
    # ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=d81c843b:4d96d9fc:5f3f499c:6ee99294

    Successivamente, aggiungi la configurazione corrente:

    sudo mdadm --detail --brief /dev/md0 | sudo tee -a /etc/mdadm/mdadm.conf

    Le nuove informazioni verranno utilizzate dall’utility mdadmper assemblare l’array.

    È possibile espandere un array aumentando il numero di dispositivi attivi all’interno dell’assieme. La procedura esatta dipende leggermente dal livello RAID che stai utilizzando.

    Con RAID 1 o 10

    Inizia aggiungendo il nuovo dispositivo come riserva, come dimostrato nell’ultima sezione:

    sudo mdadm /dev/md0 --add /dev/sde

    Scopri il numero attuale di dispositivi RAID nell’array:

    sudo mdadm --detail /dev/md0

    Output
    /dev/md0:
            Version : 1.2
      Creation Time : Wed Aug 10 15:29:26 2016
         Raid Level : raid1
         Array Size : 104792064 (99.94 GiB 107.31 GB)
      Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
       Raid Devices : 2
      Total Devices : 3
        Persistence : Superblock is persistent
    
        . . .

    In questo esempio, l’array è configurato per utilizzare attivamente due dispositivi. Rivela, tuttavia, che il numero totale di dispositivi disponibili nell’array è tre a causa della riserva.

    Ora riconfigura l’array per avere un dispositivo attivo aggiuntivo. La riserva verrà utilizzata per soddisfare i requisiti di drive extra. Ricorda di sostituire il numero di destinazione dei dispositivi RAID in questo comando. Qui stiamo aumentando il RAID 1 con 2 dispositivi a 3. Se sei nel RAID 10 con 4 dispositivi e hai l’unità aggiuntiva, aumentala a 5:

    sudo mdadm --grow --raid-devices=3 /dev/md0

    L’array inizierà a riconfigurarsi con un disco attivo aggiuntivo. Per visualizzare l’avanzamento della sincronizzazione dei dati, eseguire quanto segue:

    cat /proc/mdstat

    Puoi continuare a utilizzare il dispositivo una volta completato il processo.

    Con RAID 5 o 6

    Inizia aggiungendo il nuovo dispositivo come ricambio come dimostrato nell’ultima sezione:

    sudo mdadm /dev/md0 --add /dev/sde

    Scopri il numero attuale di dispositivi RAID nell’array:

    sudo mdadm --detail /dev/md0

    Output
    /dev/md0:
            Version : 1.2
      Creation Time : Wed Oct 5 18:38:51 2022
         Raid Level : raid5
         Array Size : 209584128 (199.88 GiB 214.61 GB)
      Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
       Raid Devices : 3
      Total Devices : 4
        Persistence : Superblock is persistent
    
        . . .

    In questo esempio, l’array è configurato per utilizzare attivamente tre dispositivi e il numero totale di dispositivi disponibili nell’array è quattro a causa del dispositivo di riserva aggiunto.

    Ora riconfigura l’array per avere un dispositivo attivo aggiuntivo. La riserva verrà utilizzata per soddisfare i requisiti di drive extra. Quando si espande un array RAID 5 o RAID 6, è importante includere un’opzione aggiuntiva denominata --backup-file. Ciò indicherà una posizione fuori dall’array in cui verrà archiviato un file di backup contenente informazioni critiche:

    sudo mdadm --grow --raid-devices=4 --backup-file=/root/md0_grow.bak /dev/md0

    Il seguente output indica che verrà eseguito il backup della sezione critica:

    Output
    mdadm: Need to backup 3072K of critical section..

    L’array inizierà a riconfigurarsi con un disco attivo aggiuntivo. Per visualizzare l’avanzamento della sincronizzazione dei dati, eseguire:

    cat /proc/mdstat

    Puoi continuare a utilizzare il dispositivo una volta completato questo processo.

    Una volta completata la rimodellazione, dovrai espandere il filesystem sull’array per utilizzare lo spazio aggiuntivo:

    sudo resize2fs /dev/md0

    Il tuo array avrà ora un filesystem che corrisponde alla sua capacità.

    Con RAID 0

    Gli array RAID 0 non possono avere unità di riserva perché non esiste alcuna possibilità per una riserva di ricostruire un array RAID 0 danneggiato. È necessario aggiungere il nuovo dispositivo contemporaneamente all’espansione dell’array.

    Innanzitutto, scopri il numero corrente di dispositivi RAID nell’array:

    sudo mdadm --detail /dev/md0

    Output
    /dev/md0:
            Version : 1.2
      Creation Time : Wed Aug 10 19:17:14 2020
         Raid Level : raid0
         Array Size : 209584128 (199.88 GiB 214.61 GB)
       Raid Devices : 2
      Total Devices : 2
        Persistence : Superblock is persistent
    
        . . .

    Ora puoi incrementare il numero di dispositivi RAID nella stessa operazione di aggiunta della nuova unità:

    sudo mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc

    Riceverai un output che indica che l’array è stato modificato in RAID 4:

    Output
    mdadm: level of /dev/md0 changed to raid4
    mdadm: added /dev/sdc

    Questo è normale e previsto. L’array tornerà al RAID 0 quando i dati saranno stati ridistribuiti su tutti i dischi esistenti.

    Puoi controllare lo stato di avanzamento dell’azione:

    cat /proc/mdstat

    Una volta completata la sincronizzazione, ridimensiona il filesystem per utilizzare lo spazio aggiuntivo:

    sudo resize2fs /dev/md0

    Il tuo array avrà ora un filesystem che corrisponde alla sua capacità.

    Talvolta è necessario rimuovere un’unità da un array RAID in caso di guasto o se è necessario sostituire il disco.

    Per poter rimuovere un dispositivo, è necessario prima contrassegnarlo come “guasto” all’interno dell’array. Puoi verificare se è presente un dispositivo guasto utilizzando mdadm --detail:

    sudo mdadm --detail /dev/md0

    Output
    /dev/md0:
            Version : 1.2
      Creation Time : Wed Aug 10 21:42:12 2020
         Raid Level : raid5
         Array Size : 209584128 (199.88 GiB 214.61 GB)
      Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
       Raid Devices : 3
      Total Devices : 3
        Persistence : Superblock is persistent
    
        Update Time : Thu Aug 11 14:10:43 2020
              State : clean, degraded 
     Active Devices : 2
    Working Devices : 2
     Failed Devices : 1
      Spare Devices : 0
    
             Layout : left-symmetric
         Chunk Size : 64K
    
               Name : mdadmwrite:0  (local to host mdadmwrite)
               UUID : bf7a711b:b3aa9440:40d2c12e:79824706
             Events : 144
    
        Number   Major   Minor   RaidDevice State
           0       0        0        0      removed
           1       8        0        1      active sync   /dev/sda
           2       8       16        2      active sync   /dev/sdb
           0       8       32        -      faulty   /dev/sdc
    

    Tutte le linee evidenziate indicano che un’unità non funziona più. Come esempio, /dev/sdcin questo output rivela che l’unità è difettosa.

    Se è necessario rimuovere un’unità che non presenta problemi, è possibile contrassegnarla manualmente come guasta con l’opzione--fail:

    sudo mdadm /dev/md0 --fail /dev/sdc

    Output
    mdadm: set /dev/sdc faulty in /dev/md0

    È quindi possibile sostituirlo con una nuova unità, utilizzando lo stesso comando mdadm --addche usi per aggiungere un ricambio:

    sudo mdadm /dev/md0 --add /dev/sdd

    Output
    mdadm: added /dev/sdd

    L’array inizierà il ripristino copiando i dati sulla nuova unità.

    Per distruggere un array, compresi tutti i dati in esso contenuti, iniziare seguendo il processo utilizzato per arrestare un array.

    Esci dalla directory montata con il seguente comando:

    cd ~

    Quindi smonta il filesystem:

    sudo umount /mnt/md0

    Quindi, interrompi l’array:

    sudo mdadm --stop /dev/md0

    Successivamente, elimina l’array stesso con il comando --removedestinato al dispositivo RAID:

    sudo mdadm --remove /dev/md0

    Una volta rimosso l’array stesso, utilizzare mdadm --zero-superblocksu ciascuno dei dispositivi componenti. Questo cancellerà il superblocco md, un’intestazione utilizzata da mdadmper assemblare e gestire i dispositivi componenti come parte di un array. Se è ancora presente, potrebbe causare problemi quando si tenta di riutilizzare il disco per altri scopi.

    Controlla la colonna FSTYPE nell’output lsblk --fsper confermare che il superblocco è presente nell’array:

    lsblk --fs

    Output
    NAME    FSTYPE            LABEL        UUID                                 MOUNTPOINT
    …
    sda     linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
    sdb     linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
    sdc     linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
    sdd                                                                         
    vda                                                                         
    ├─vda1  ext4              DOROOT       4f8b85db-8c11-422b-83c4-c74195f67b91 /
    └─vda15

    In questo esempio, /dev/sda, /dev/sdb e /dev/sdcfacevano tutti parte dell’array e sono ancora etichettati come tali.

    Rimuovere le etichette con il seguente comando:

    sudo mdadm --zero-superblock /dev/sda /dev/sdb /dev/sdc

    Successivamente, assicurati di rimuovere o commentare qualsiasi riferimento all’array nel file /etc/fstab. Puoi farlo aggiungendo il simbolo dell’hashtag #all’inizio:

    sudo nano /etc/fstab

    . . .
    # /dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0

    Salva e chiudi il file quando hai finito.

    Rimuovere o commentare eventuali riferimenti all’array anche dal file /etc/mdadm/mdadm.conf:

    nano /etc/mdadm/mdadm.conf

    # ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=bf7a711b:b3aa9440:40d2c12e:79824706

    Salva e chiudi il file quando hai finito.

    Quindi aggiorna l’initramfs:

    sudo update-initramfs -u

    Ciò rimuoverà il dispositivo dall’ambiente di avvio iniziale.

    Creare array RAID

    Come creare array RAID con mdadm su Ubuntu 22.04

    L’utility mdadmpuò essere utilizzata per creare e gestire array di archiviazione utilizzando le funzionalità RAID del software Linux. Gli amministratori hanno una grande flessibilità nel coordinare i propri dispositivi di storage individuali e nel creare dispositivi di storage logici con maggiori prestazioni o caratteristiche di ridondanza.

    In questa guida eseguirai diverse configurazioni RAID che possono essere configurate utilizzando un server Ubuntu 22.04.

    Per seguire i passaggi di questa guida, avrai bisogno di:

    • Un utente non root con privilegi sudo su un server Ubuntu 22.04.
    • Una conoscenza di base della terminologia e dei concetti RAID. Per saperne di più sul RAID e sul livello RAID adatto a te, leggi l’articolo introduzione alla terminologia e ai concetti.
    • Più dispositivi di archiviazione raw disponibili sul tuo server. Gli esempi in questo tutorial dimostrano come configurare vari tipi di array sul server. Pertanto, avrai bisogno di alcune unità da configurare.
    • A seconda del tipo di array, saranno necessari da due a quattro dispositivi di archiviazione . Non è necessario formattare queste unità prima di seguire questa guida.

    Puoi saltare questa sezione per ora se non hai ancora configurato alcun array. Questa guida introdurrà una serie di diversi livelli RAID. Se desideri seguire e completare ogni livello RAID per i tuoi dispositivi, probabilmente vorrai riutilizzare i dispositivi di archiviazione dopo ogni sezione. È possibile fare riferimento a questa sezione specifica Reimpostazione dei dispositivi RAID esistenti per reimpostare i dispositivi di archiviazione prima di testare un nuovo livello RAID.

    Inizia trovando gli array attivi nel file /proc/mdstatfile:

    cat /proc/mdstat

    Output
    Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid0 sdc[1] sdd[0]
          209584128 blocks super 1.2 512k chunks
                
                unused devices: <none>

    Quindi smonta l’array dal filesystem:

    sudo umount /dev/md0

    Ora termina e rimuovi l’array:

    sudo mdadm --stop /dev/md0

    Trova i dispositivi utilizzati per costruire l’array con il seguente comando:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE            TYPE MOUNTPOINT
    sda      100G linux_raid_member disk 
    sdb      100G linux_raid_member disk 
    sdc      100G                   disk 
    sdd      100G                   disk 
    vda       25G                   disk 
    ├─vda1  24.9G ext4              part /
    ├─vda14    4M                   part 
    └─vda15  106M vfat              part /boot/efi
    vdb      466K iso9660           disk

    Dopo aver scoperto i dispositivi utilizzati per creare un array, azzera il loro superblocco per ripristinarli alla normalità

    sudo mdadm --zero-superblock /dev/sdc
    sudo mdadm --zero-superblock /dev/sdd

    Dovresti rimuovere tutti i riferimenti persistenti all’array. Modifica il file /etc/fstabe commenta o rimuovi il riferimento al tuo array:

    sudo nano /etc/fstab

    . . .
    # /dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0
    

    Inoltre, commenta o rimuovi la definizione dell’array dal file /etc/mdadm/mdadm.conf:

    sudo nano /etc/mdadm/mdadm.conf

    . . .
    # ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=7261fb9c:976d0d97:30bc63ce:85e76e91

    Infine aggiorna ancora il initramfs:

    sudo update-initramfs -u

    A questo punto dovresti essere pronto per riutilizzare i dispositivi di archiviazione singolarmente o come componenti di un array diverso.

    L’array RAID 0 funziona suddividendo i dati in blocchi e distribuendoli sui dischi disponibili. Ciò significa che ogni disco contiene una parte dei dati e che durante il recupero delle informazioni verrà fatto riferimento a più dischi.

    • Requisiti: minimo 2 dispositivi di archiviazione
    • Vantaggio principale: prestazioni
    • Cose da tenere a mente: assicurati di disporre di backup funzionali. Un singolo guasto del dispositivo distruggerà tutti i dati nell’array.

    Identificare i dispositivi

    Per iniziare, trova gli identificatori per i dischi raw che utilizzerai:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE   TYPE MOUNTPOINT
    sda      100G          disk
    sdb      100G          disk
    vda       25G          disk 
    ├─vda1  24.9G ext4     part /
    ├─vda14    4M          part 
    └─vda15  106M vfat     part /boot/efi
    vdb      466K iso9660  disk 

    In questo esempio, hai due dischi senza filesystem, ciascuno di 100 GB. A questi dispositivi sono stati assegnati gli identificatori /dev/sdaE /dev/sdb per questa sessione e saranno i componenti raw utilizzati per costruire l’array.

    Creazione dell’array

    Per creare un array RAID 0 con questi componenti, passali al comando mdadm --create. Dovrai specificare il nome del dispositivo che desideri creare, il livello RAID e il numero di dispositivi. In questo esempio di comando, nominerai il dispositivo /dev/md0 e includerai i due dischi che costruiranno l’array:

    sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sda /dev/sdb

    Conferma che il RAID è stato creato correttamente controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid0 sdb[1] sda[0]
          209584128 blocks super 1.2 512k chunks
                
                unused devices: <none>

    Questo output rivela che il dispositivo /dev/md0 è stato creato nella configurazione RAID 0 utilizzando i dispositivi /dev/sda e /dev/sdb.

    Creazione e montaggio del filesystem

    Successivamente, crea un filesystem sull’array:

    sudo mkfs.ext4 -F /dev/md0

    Quindi, crea un punto di montaggio per collegare il nuovo filesystem:

    sudo mkdir -p /mnt/md0

    Puoi montare il filesystem con il seguente comando:

    sudo mount /dev/md0 /mnt/md0

    Successivamente, controlla se il nuovo spazio è disponibile:

    df -h -x devtmpfs -x tmpfs

    Output
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        25G  1.4G   23G   6% /
    /dev/vda15      105M  3.4M  102M   4% /boot/efi
    /dev/md0        196G   61M  186G   1% /mnt/md0
    

    Il nuovo filesystem è ora montato e accessibile.

    Salvataggio del layout dell’array

    Per assicurarti che l’array venga riassemblato automaticamente all’avvio, dovrai modificare il file /etc/mdadm/mdadm.conf. È possibile eseguire automaticamente la scansione dell’array attivo e aggiungere il file con quanto segue:

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

    Successivamente è possibile aggiornare il file initramfso file system RAM iniziale, in modo che l’array sia disponibile durante il processo di avvio:

    sudo update-initramfs -u

    Aggiungi le nuove opzioni di montaggio del filesystem al file /etc/fstabper il montaggio automatico all’avvio:

    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab

    Il tuo array RAID 0 ora assemblerà e monterà automaticamente ogni avvio.

    Ora hai finito con la configurazione del RAID. Se desideri provare un RAID diverso, segui le istruzioni di ripristino all’inizio di questo tutorial per procedere con la creazione di un nuovo tipo di array RAID.

    Il tipo di array RAID 1 viene implementato eseguendo il mirroring dei dati su tutti i dischi disponibili. Ogni disco in un array RAID 1 riceve una copia completa dei dati, fornendo ridondanza in caso di guasto del dispositivo.

    • Requisiti: minimo 2 dispositivi di archiviazione .
    • Vantaggio principale: ridondanza tra due dispositivi di archiviazione.
    • Cose da tenere a mente: poiché vengono conservate due copie dei dati, solo la metà dello spazio su disco sarà utilizzabile.

    Identificazione dei dispositivi

    Per iniziare, trova gli identificatori per i dischi raw che utilizzerai:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE   TYPE MOUNTPOINT
    sda      100G          disk 
    sdb      100G          disk 
    vda       25G          disk 
    ├─vda1  24.9G ext4     part /
    ├─vda14    4M          part 
    └─vda15  106M vfat     part /boot/efi
    vdb      466K iso9660  disk 

    In questo esempio, hai due dischi senza filesystem, ciascuno di 100 GB. A questi dispositivi è stato assegnato gli identificatori /dev/sdaE /dev/sdb per questa sessione e saranno i componenti raw utilizzati per creare l’array.

    Creazione dell’array

    Per creare un array RAID 1 con questi componenti, passali al comando mdadm --create. Dovrai specificare il nome del dispositivo che desideri creare, il livello RAID e il numero di dispositivi. In questo esempio di comando, nominerai il dispositivo /dev/md0e includerai i dischi che costruiranno l’array:

    sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb

    Se i dispositivi che stai utilizzando non sono partizioni con il flagbootabilitato, probabilmente riceverai il seguente avviso. È sicuro rispondere con ye continua:

    Output
    mdadm: Note: this array has metadata at the start and
        may not be suitable as a boot device.  If you plan to
        store '/boot' on this device please ensure that
        your boot-loader understands md/v1.x metadata, or use
        --metadata=0.90
    mdadm: size set to 104792064K
    Continue creating array? y
    

    Il tool mdadm inizierà a eseguire il mirroring delle unità. Il completamento dell’operazione può richiedere del tempo, ma durante questo periodo è possibile utilizzare l’array. È possibile monitorare l’avanzamento del mirroring controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid1 sdb[1] sda[0]
          104792064 blocks super 1.2 [2/2] [UU]
          [====>................]  resync = 20.2% (21233216/104792064) finish=6.9min speed=199507K/sec
          
    unused devices: <none>

    Nella prima riga evidenziata, il dispositivo /dev/md0 è stato creato nella configurazione RAID 1 utilizzando i dispositivi /dev/sdae /dev/sdb. La seconda riga evidenziata rivela lo stato di avanzamento del mirroring. Puoi continuare con il passaggio successivo mentre il processo viene completato.

    Creazione e montaggio del filesystem

    Successivamente, crea un filesystem sull’array:

    sudo mkfs.ext4 -F /dev/md0

    Quindi, crea un punto di montaggio per collegare il nuovo filesystem:

    sudo mkdir -p /mnt/md0

    È possibile montare il filesystem eseguendo quanto segue:

    sudo mount /dev/md0 /mnt/md0

    Verifica se il nuovo spazio è disponibile:

    df -h -x devtmpfs -x tmpfs

    Output
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        25G  1.4G   23G   6% /
    /dev/vda15      105M  3.4M  102M   4% /boot/efi
    /dev/md0         99G   60M   94G   1% /mnt/md0
    

    Il nuovo filesystem è montato e accessibile.

    Salvataggio del layout dell’array

    Per assicurarti che l’array venga riassemblato automaticamente all’avvio, devi modificare il file /etc/mdadm/mdadm.conf. È possibile eseguire automaticamente la scansione dell’array attivo e aggiungere il file con quanto segue:

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

    Successivamente è possibile aggiornare il file initramfso file system RAM iniziale, in modo che l’array sia disponibile durante il processo di avvio:

    sudo update-initramfs -u

    Aggiungi le nuove opzioni di montaggio del filesystem al file /etc/fstab per il montaggio automatico all’avvio:

    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab

    L’array RAID 1 ora assemblerà e monterà automaticamente ogni avvio.

    Ora hai finito con la configurazione del RAID. Se desideri provare un RAID diverso, segui le istruzioni di ripristino all’inizio di questo tutorial per procedere con la creazione di un nuovo tipo di array RAID.

    Il tipo di array RAID 5 viene implementato eseguendo lo striping dei dati sui dispositivi disponibili. Un componente di ciascun stripe è un blocco di parità calcolato. Se un dispositivo si guasta, il blocco di parità e i blocchi rimanenti possono essere utilizzati per calcolare i dati mancanti. Il dispositivo che riceve il blocco di parità viene ruotato in modo che ciascun dispositivo disponga di una quantità bilanciata di informazioni sulla parità.

    • Requisiti: minimo 3 dispositivi di archiviazione .
    • Vantaggio principale: ridondanza con maggiore capacità utilizzabile.
    • Cose da tenere a mente: mentre le informazioni sulla parità vengono distribuite, per la parità verrà utilizzata la capacità di un disco. RAID 5 può presentare prestazioni molto scarse quando si trova in uno stato degradato.

    Identificazione dei dispositivi

    Per iniziare, trova gli identificatori per i dischi raw che utilizzerai:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE   TYPE MOUNTPOINT
    sda      100G          disk 
    sdb      100G          disk 
    sdc      100G          disk 
    vda       25G          disk 
    ├─vda1  24.9G ext4     part /
    ├─vda14    4M          part 
    └─vda15  106M vfat     part /boot/efi
    vdb      466K iso9660  disk

    Hai tre dischi senza filesystem, ciascuno di 100 GB. A questi dispositivi sono stati assegnato gli identificatori /dev/sda, /dev/sdb e /dev/sdc per questa sessione e saranno i componenti raw utilizzati per creare l’array.

    Creazione dell’array

    Per creare un array RAID 5 con questi componenti, passali al comando mdadm --create. Dovrai specificare il nome del dispositivo che desideri creare, il livello RAID e il numero di dispositivi. In questo esempio di comando, nominerai il dispositivo /dev/md0e includerai i dischi che costruiranno l’array:

    sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc

    Il tool mdadm inizierà a configurare l’array. Utilizza il processo di ripristino per creare l’array per motivi di prestazioni. Il completamento dell’operazione può richiedere del tempo, ma durante questo periodo è possibile utilizzare l’array. È possibile monitorare l’avanzamento del mirroring controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid5 sdc[3] sdb[1] sda[0]
          209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
          [>....................]  recovery =  0.9% (957244/104791040) finish=18.0min speed=95724K/sec
          
    unused devices: <none>

    Nella prima riga evidenziata, il dispositivo /dev/md0è stato creato nella configurazione RAID 5 utilizzando i dispositivi/dev/sda, /dev/sdbe /dev/sdc. La seconda riga evidenziata mostra l’avanzamento della compilazione.

    Avvertenza: a causa del modo in cui mdadm crea gli array RAID 5, mentre l’array è ancora in fase di creazione, il numero di unità di riserva nell’array verrà riportato in modo impreciso. Ciò significa che è necessario attendere il completamento dell’assemblaggio dell’array prima di aggiornare il file /etc/mdadm/mdadm.conf. Se aggiorni il file di configurazione mentre l’array è ancora in fase di creazione, il sistema avrà informazioni errate sullo stato dell’array e non sarà in grado di assemblarlo automaticamente all’avvio con il nome corretto.

    Puoi continuare la guida mentre questo processo viene completato.

    Creazione e montaggio del filesystem

    Successivamente, crea un filesystem sull’array:

    sudo mkfs.ext4 -F /dev/md0

    Crea un punto di montaggio per collegare il nuovo filesystem:

    sudo mkdir -p /mnt/md0

    È possibile montare il filesystem con quanto segue:

    sudo mount /dev/md0 /mnt/md0

    Verifica se il nuovo spazio è disponibile:

    df -h -x devtmpfs -x tmpfs

    Output
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        25G  1.4G   23G   6% /
    /dev/vda15      105M  3.4M  102M   4% /boot/efi
    /dev/md0        197G   60M  187G   1% /mnt/md0
    

    Il nuovo filesystem è montato e accessibile.

    Salvataggio del layout dell’array

    Per assicurarti che l’array venga riassemblato automaticamente all’avvio, devi modificare il file /etc/mdadm/mdadm.conf.

    È possibile monitorare l’avanzamento del mirroring controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid5 sdc[3] sdb[1] sda[0]
          209584128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
          
    unused devices: <none>

    Questo output rivela che la ricostruzione è completa. Ora puoi scansionare automaticamente l’array attivo e aggiungere il file:

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

    Successivamente è possibile aggiornare il file initramfso file system RAM iniziale, in modo che l’array sia disponibile durante il processo di avvio:

    sudo update-initramfs -u

    Aggiungi le nuove opzioni di montaggio del filesystem al file /etc/fstabper il montaggio automatico all’avvio:

    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab

    L’array RAID 5 ora assemblerà e monterà automaticamente ad ogni avvio.

    Ora hai finito con la configurazione del RAID. Se desideri provare un RAID diverso, segui le istruzioni di ripristino all’inizio di questo tutorial per procedere con la creazione di un nuovo tipo di array RAID.

    Il tipo di array RAID 6 viene implementato eseguendo lo striping dei dati sui dispositivi disponibili. Due componenti di ciascun stripe sono blocchi di parità calcolati. Se uno o due dispositivi si guastano, i blocchi di parità e i blocchi rimanenti possono essere utilizzati per calcolare i dati mancanti. I dispositivi che ricevono i blocchi di parità vengono ruotati in modo che ciascun dispositivo disponga di una quantità bilanciata di informazioni sulla parità. È simile a un array RAID 5, ma consente il guasto di due unità.

    • Requisiti: minimo 4 dispositivi di archiviazione .
    • Vantaggio principale: doppia ridondanza con maggiore capacità utilizzabile.
    • Cose da tenere a mente: mentre le informazioni sulla parità vengono distribuite, per la parità verrà utilizzata la capacità di due dischi. RAID 6 può presentare prestazioni molto scarse quando si trova in uno stato degradato.

    Identificazione dei dispositivi

    Per iniziare, trova gli identificatori per i dischi raw che utilizzerai:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE   TYPE MOUNTPOINT
    sda      100G          disk 
    sdb      100G          disk 
    sdc      100G          disk 
    sdd      100G          disk 
    vda       25G          disk 
    ├─vda1  24.9G ext4     part /
    ├─vda14    4M          part 
    └─vda15  106M vfat     part /boot/efi
    vdb      466K iso9660  disk 

    In questo esempio, hai quattro dischi senza filesystem, ciascuno di 100 GB. A questi dispositivi sono stati assegnati gli identificatori /dev/sda, /dev/sdb, /dev/sdc e /dev/sdd per questa sessione e saranno i componenti raw utilizzati per costruire l’array.

    Creazione dell’array

    Per creare un array RAID 6 con questi componenti, passali al comando mdadm --create. Devi specificare il nome del dispositivo che desideri creare, il livello RAID e il numero di dispositivi. Nel seguente esempio di comando, nominerai il dispositivo /dev/md0e includere i dischi che costruiranno l’array:

    sudo mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

    Il tool mdadm inizierà a configurare l’array. Utilizza il processo di ripristino per creare l’array per motivi di prestazioni. Il completamento dell’operazione può richiedere del tempo, ma durante questo periodo è possibile utilizzare l’array. È possibile monitorare l’avanzamento del mirroring controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md0 : active raid6 sdd[3] sdc[2] sdb[1] sda[0]
          209584128 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
          [>....................]  resync =  0.6% (668572/104792064) finish=10.3min speed=167143K/sec
          
    unused devices: <none>

    Nella prima riga evidenziata, il dispositivo /dev/md0è stato creato nella configurazione RAID 6 utilizzando i dispositivi /dev/sda, /dev/sdb, /dev/sdce /dev/sdd. La seconda riga evidenziata mostra l’avanzamento della creazione. Puoi continuare la guida mentre questo processo viene completato.

    Creazione e montaggio del filesystem

    Successivamente, crea un filesystem sull’array:

    sudo mkfs.ext4 -F /dev/md0

    Crea un punto di montaggio per collegare il nuovo filesystem:

    sudo mkdir -p /mnt/md0

    È possibile montare il filesystem con quanto segue:

    sudo mount /dev/md0 /mnt/md0

    Verifica se il nuovo spazio è disponibile:

    df -h -x devtmpfs -x tmpfs

    Output
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        25G  1.4G   23G   6% /
    /dev/vda15      105M  3.4M  102M   4% /boot/efi
    /dev/md0        197G   60M  187G   1% /mnt/md0
    

    Il nuovo filesystem è montato e accessibile.

    Salvataggio del layout dell’array

    Per assicurarti che l’array venga riassemblato automaticamente all’avvio, dovrai modificare il file /etc/mdadm/mdadm.conf. Puoi scansionare automaticamente l’array attivo e aggiungere il file digitando:

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

    Successivamente è possibile aggiornare il file initramfso file system RAM iniziale, in modo che l’array sia disponibile durante il processo di avvio:

    sudo update-initramfs -u

    Aggiungi le nuove opzioni di montaggio del filesystem al file /etc/fstab per il montaggio automatico all’avvio:

    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab

    L’array RAID 6 ora assemblerà e monterà automaticamente ogni avvio.

    Ora hai finito con la configurazione del RAID. Se desideri provare un RAID diverso, segui le istruzioni di ripristino all’inizio di questo tutorial per procedere con la creazione di un nuovo tipo di array RAID.

    Il tipo di array RAID 10 viene tradizionalmente implementato creando un array RAID 0 con striping composto da set di array RAID 1. Questo tipo di array annidato offre ridondanza e prestazioni elevate, a scapito di grandi quantità di spazio su disco. L’utility mdadmdispone di un proprio tipo RAID 10 che fornisce lo stesso tipo di vantaggi con maggiore flessibilità. Non viene creato annidando array, ma ha molte delle stesse caratteristiche e garanzie. Utilizzerai il mdadmRAID 10 di sequito.

    • Requisiti: minimo 3 dispositivi di archiviazione .
    • Vantaggio principale: prestazioni e ridondanza.
    • Cose da tenere a mente: l’entità della riduzione della capacità dell’array è definita dal numero di copie dei dati che si sceglie di conservare. Il numero di copie archiviate con RAID 10 in stile mdadm è configurabile.

    Per impostazione predefinita, due copie di ciascun blocco di dati verranno archiviate in quello che viene chiamato layout vicino (near). I possibili layout che determinano la modalità di memorizzazione di ciascun blocco dati sono i seguenti:

    • near: la disposizione predefinita. Le copie di ciascun blocco vengono scritte consecutivamente durante lo striping, il che significa che le copie dei blocchi di dati verranno scritte nella stessa parte di più dischi.
    • far: la prima copia e quelle successive vengono scritte in parti diverse dei dispositivi di archiviazione nell’array. Ad esempio, il primo pezzo potrebbe essere scritto vicino all’inizio di un disco, mentre il secondo pezzo potrebbe essere scritto a metà su un disco diverso. Ciò può fornire alcuni miglioramenti nelle prestazioni di lettura per i tradizionali dischi rotanti a scapito delle prestazioni di scrittura.
    • offset: ogni stripe viene copiato e spostato di un’unità. Ciò significa che le copie sono sfalsate l’una dall’altra, ma ancora vicine sul disco. Ciò aiuta a ridurre al minimo la ricerca eccessiva durante alcuni carichi di lavoro.

    Puoi scoprire di più su questi layout controllando la sezione RAID10 della pagina man:

    man 4 md

    Oppure qui.

    Identificazione dei dispositivi

    Per iniziare, trova gli identificatori per i dischi raw che utilizzerai:

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

    Output
    NAME     SIZE FSTYPE   TYPE MOUNTPOINT
    sda      100G          disk 
    sdb      100G          disk 
    sdc      100G          disk 
    sdd      100G          disk 
    vda       25G          disk 
    ├─vda1  24.9G ext4     part /
    ├─vda14    4M          part 
    └─vda15  106M vfat     part /boot/efi
    vdb      466K iso9660  disk 

    In questo esempio, hai quattro dischi senza filesystem, ciascuno di 100 GB. A questi dispositivi sono stati assegnati gli identificatori /dev/sda, /dev/sdb, /dev/sdc, E /dev/sddper questa sessione e saranno i componenti raw utilizzati per costruire l’array.

    Creazione dell’array

    Per creare un array RAID 10 con questi componenti, passali al comando mdadm --create. Devi specificare il nome del dispositivo che desideri creare, il livello RAID e il numero di dispositivi. Nel seguente esempio, nominerai il dispositivo /dev/md0e includerai i dischi che costruiranno l’array:

    È possibile impostare due copie utilizzando il layout vicino senza specificare un layout e un numero di copia:

    sudo mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

    Se desideri utilizzare un layout diverso o modificare il numero di copie, dovrai utilizzare l’opzione --layout=, che accetta un layout e un identificatore di copia. I layout sono nper vicino, fper lontano, e oper compensazione. Il numero di copie da archiviare viene aggiunto successivamente.

    Ad esempio, per creare un array con tre copie nel layout offset, il comando includerebbe quanto segue:

    sudo mdadm --create --verbose /dev/md0 --level=10 --layout=o3 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

    Il tool mdadminizierà a configurare l’array. Utilizza il processo di ripristino per creare l’array per motivi di prestazioni. Il completamento dell’operazione può richiedere del tempo, ma durante questo periodo è possibile utilizzare l’array. È possibile monitorare l’avanzamento del mirroring controllando il file /proc/mdstat:

    cat /proc/mdstat

    Output
    Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
    md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
          209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
          [===>.................]  resync = 18.1% (37959424/209584128) finish=13.8min speed=206120K/sec
          
    unused devices: <none>

    Nella prima riga evidenziata, il dispositivo /dev/md0è stato creato nella configurazione RAID 10 utilizzando i disositivi /dev/sda, /dev/sdb, /dev/sdce /dev/sdd. La seconda area evidenziata mostra il layout utilizzato per questo esempio (due copie nella configurazione near). La terza area evidenziata mostra lo stato di avanzamento della costruzione. Puoi continuare la guida mentre questo processo viene completato.

    Creazione e montaggio del filesystem

    Successivamente, crea un filesystem sull’array:

    sudo mkfs.ext4 -F /dev/md0

    Crea un punto di montaggio per collegare il nuovo filesystem:

    sudo mkdir -p /mnt/md0

    È possibile montare il filesystem in questo modo:

    sudo mount /dev/md0 /mnt/md0

    Verifica se il nuovo spazio è disponibile:

    df -h -x devtmpfs -x tmpfs

    Output
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        25G  1.4G   23G   6% /
    /dev/vda15      105M  3.4M  102M   4% /boot/efi
    /dev/md0        197G   60M  187G   1% /mnt/md0
    

    Il nuovo filesystem è montato e accessibile.

    Salvataggio del layout dell’array

    Per assicurarti che l’array venga riassemblato automaticamente all’avvio, dovrai modificare il file /etc/mdadm/mdadm.conf. È possibile eseguire automaticamente la scansione dell’array attivo e aggiungere il file eseguendo quanto segue:

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

    Successivamente è possibile aggiornare il file initramfso file system RAM iniziale, in modo che l’array sia disponibile durante il processo di avvio:

    sudo update-initramfs -u

    Aggiungi le nuove opzioni di montaggio del filesystem al file /etc/fstab per il montaggio automatico all’avvio:

    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab

    L’array RAID 10 verrà ora assemblato e montato automaticamente ogni avvio.

    RAID – Introduzione alla terminologia e ai concetti

    L’archiviazione è una considerazione importante quando si configura un server. Quasi tutte le informazioni importanti che interessano verranno prima o poi scritte su un dispositivo di archiviazione per essere salvate per un successivo recupero. I dischi singoli possono essere utili se le esigenze sono semplici. Tuttavia, se hai requisiti di ridondanza o prestazioni più complessi, soluzioni come RAID possono essere utili.

    In questa guida parleremo della terminologia e dei concetti RAID comuni. Discuteremo alcuni vantaggi e svantaggi della disposizione dei dispositivi in ​​array RAID, parleremo delle differenze nelle tecnologie di implementazione e esamineremo il modo in cui i diversi livelli RAID influiscono sull’ambiente di archiviazione.

    RAID sta per Array ridondanti di dischi indipendenti (Redundant Arrays of Independent Disks). Combinando le unità in modelli diversi, gli amministratori possono ottenere prestazioni o ridondanza maggiori rispetto a quelle che l’insieme di unità può offrire se gestite individualmente. Il RAID è implementato come uno strato intermedio tra le unità o le partizioni grezze e lo strato del file system.

    Quando il RAID è una buona idea?

    I valori principali forniti dal RAID sono la ridondanza dei dati e il miglioramento delle prestazioni.

    La ridondanza ha lo scopo di contribuire ad aumentare la disponibilità dei dati. Ciò significa che durante determinate condizioni di guasto, come quando un’unità di archiviazione diventa difettosa, le informazioni sono ancora accessibili e il sistema nel suo insieme può continuare a funzionare fino alla sostituzione dell’unità. Questo non è inteso come un meccanismo di backup (con RAID sono sempre consigliati backup separati come con qualsiasi altro tipo di archiviazione), ma è inteso invece a ridurre al minimo le interruzioni quando si verificano problemi.

    L’altro vantaggio offerto dal RAID in alcuni scenari riguarda le prestazioni. L’I/O di archiviazione è spesso limitato dalla velocità di un singolo disco. Con RAID, i dati sono ridondanti o distribuiti, il che significa che è possibile consultare più dischi per ogni operazione di lettura, aumentando il throughput totale. Le operazioni di scrittura possono anche essere migliorate in alcune configurazioni poiché a ogni singolo disco potrebbe essere richiesto di scrivere solo una frazione dei dati totali.

    Alcuni svantaggi del RAID includono una maggiore complessità di gestione e spesso una riduzione della capacità disponibile. Ciò si traduce in costi aggiuntivi per la stessa quantità di spazio utilizzabile. Ulteriori spese potrebbero essere sostenute attraverso l’uso di hardware specializzato quando l’array non è gestito interamente tramite software.

    Un altro svantaggio delle configurazioni di array incentrate sulle prestazioni senza ridondanza è l’aumento del rischio di perdita totale dei dati. In questi scenari un insieme di dati dipende interamente da più di un dispositivo di archiviazione, aumentando il rischio totale di perdita

    Gli array RAID possono essere creati e gestiti utilizzando alcune tecnologie diverse.

    RAID hardware

    È possibile utilizzare hardware dedicato chiamato controller RAID o schede RAID per impostare e gestire il RAID in modo indipendente dal sistema operativo. Questo è noto come RAID hardware. I veri controller RAID hardware avranno un processore dedicato per la gestione dei dispositivi RAID.

    Ciò presenta una serie di vantaggi:

    • Prestazioni: i controller RAID hardware originali non hanno bisogno di occupare cicli della CPU per gestire i dischi sottostanti. Ciò significa nessun sovraccarico per la gestione dei dispositivi di archiviazione collegati. I controller di alta qualità forniscono anche un’ampia memorizzazione nella cache, che può avere un enorme impatto sulle prestazioni.
    • Eliminazione della complessità: un altro vantaggio derivante dall’utilizzo dei controller RAID è che astraggono la disposizione del disco sottostante dal sistema operativo. Il RAID hardware può presentare l’intero gruppo di unità come una singola unità logica di archiviazione. Non è necessario che il sistema operativo comprenda la disposizione RAID; può semplicemente interfacciarsi con l’array come se fosse un singolo dispositivo.
    • Disponibilità all’avvio: poiché l’array è gestito interamente al di fuori del software, sarà disponibile all’avvio, consentendo al filesystem root stesso di essere facilmente installato su un array RAID.

    Il RAID hardware presenta anche alcuni svantaggi significativi.

    • Vincolo del fornitore: poiché la disposizione RAID è gestita dal firmware proprietario sull’hardware stesso, un array è in qualche modo bloccato sull’hardware utilizzato per crearlo. Se un controller RAID muore, nella quasi totalità dei casi, deve essere sostituito con un modello identico o compatibile. Alcuni amministratori consigliano di acquistare uno o più controller di backup da utilizzare nel caso in cui il primo abbia un problema.
    • Costo elevato: i controller RAID hardware di qualità tendono ad essere piuttosto costosi.

    RAID software

    Il RAID può anche essere configurato dal sistema operativo stesso. Poiché la relazione tra i dischi è definita all’interno del sistema operativo e non del firmware di un dispositivo hardware, si parla di RAID software .

    Alcuni vantaggi del RAID software:

    • Flessibilità: poiché il RAID è gestito all’interno del sistema operativo, può essere facilmente configurato dallo spazio di archiviazione disponibile senza riconfigurare l’hardware, da un sistema in esecuzione. Il RAID software Linux è particolarmente flessibile e consente molti tipi diversi di configurazione RAID.
    • Open source: anche le implementazioni RAID software per sistemi operativi open source come Linux e FreeBSD sono open source. L’implementazione RAID non è nascosta e può essere facilmente letta e implementata su altri sistemi. Ad esempio, l’array RAID creato su una macchina Ubuntu può essere facilmente importato in un server CentOS in un secondo momento. Ci sono poche possibilità di perdere l’accesso ai tuoi dati a causa delle differenze del software.
    • Nessun costo aggiuntivo: il RAID software non richiede hardware speciale, quindi non aggiunge costi aggiuntivi al server o workstation.

    Alcuni svantaggi del RAID software sono:

    • Specifico dell’implementazione: sebbene il RAID software non sia legato a un hardware specifico, tende ad essere legato all’implementazione software specifica del RAID. Linux utilizza mdadm, mentre FreeBSD utilizza RAID basato su GEOM e Windows ha la propria versione di RAID software. Sebbene in alcuni casi le implementazioni open source possano essere trasferite o lette, il formato stesso probabilmente non sarà compatibile con altre implementazioni RAID software.
    • Sovraccarico delle prestazioni: storicamente, il RAID software è stato criticato per la creazione di ulteriore sovraccarico. Per gestire l’array sono necessari cicli della CPU e memoria, che potrebbero essere utilizzati per altri scopi. Implementazioni come mdadmsull’hardware moderno, tuttavia, annulla in gran parte queste preoccupazioni. Il sovraccarico della CPU è minimo e nella maggior parte dei casi insignificante.

    RAID software assistito da hardware (Fake RAID)

    È disponibile anche un terzo tipo di RAID chiamato RAID software assistito da hardware , RAID firmware o RAID falso. In genere, questo si trova nella funzionalità RAID all’interno delle schede madri stesse o in schede RAID poco costose. Il RAID software assistito da hardware è un’implementazione che utilizza il firmware sul controller o sulla scheda per gestire il RAID, ma utilizza la normale CPU per gestire l’elaborazione.

    Vantaggi del RAID software assistito da hardware:

    • Supporto per più sistemi operativi: poiché il RAID viene attivato durante l’avvio iniziale e quindi trasferito al sistema operativo, più sistemi operativi possono utilizzare lo stesso array, cosa che potrebbe non essere possibile con il RAID software.

    Svantaggi del RAID software assistito da hardware:

    • Supporto RAID limitato: solitamente sono disponibili solo RAID 0 o RAID 1.
    • Richiede hardware specifico: come il RAID hardware, il RAID software assistito da hardware è legato all’hardware utilizzato per crearlo e gestirlo. Questo problema è ancora più problematico se incluso in una scheda madre, poiché un guasto del controller RAID può significare che è necessario sostituire l’intera scheda madre per accedere nuovamente ai dati.
    • Sovraccarico delle prestazioni: come il RAID software, nessuna CPU è dedicata alla gestione del RAID. L’elaborazione deve essere condivisa con il resto del sistema operativo.

    La maggior parte degli amministratori si tiene alla larga dal RAID software assistito dall’hardware poiché soffre di una combinazione delle insidie ​​​​delle altre due implementazioni.

    La familiarità con alcuni concetti comuni aiuterà a comprendere meglio RAID. Di seguito sono riportati alcuni termini comuni che potresti incontrare:

    • Livello RAID: il livello RAID di un array si riferisce alla relazione imposta sui dispositivi di archiviazione che lo compongono. Le unità possono essere configurate in molti modi diversi, portando a diverse ridondanze dei dati e caratteristiche prestazionali. Consultare la sezione sui livelli RAID per ulteriori informazioni.
    • Striping: lo striping è il processo di divisione delle scritture sull’array su più dischi sottostanti. Questa strategia viene utilizzata da diversi livelli RAID. Quando i dati vengono distribuiti su un array, vengono suddivisi in blocchi e ciascun blocco viene scritto su almeno uno dei dispositivi sottostanti.
    • Dimensione blocco: durante lo striping dei dati, la dimensione del blocco definisce la quantità di dati che ogni blocco conterrà. La regolazione della dimensione del blocco in modo che corrisponda alle caratteristiche di I/O previste può contribuire a influenzare le prestazioni relative dell’array.
    • Parità: la parità è un meccanismo di integrità dei dati implementato calcolando le informazioni dai blocchi di dati scritti nell’array. Le informazioni sulla parità possono essere utilizzate per ricostruire i dati in caso di guasto di un’unità. La parità calcolata viene posizionata su un dispositivo separato rispetto ai dati da cui viene calcolata e, nella maggior parte delle configurazioni, viene distribuita tra le unità disponibili per prestazioni e ridondanza migliori.
    • Array degradati: gli array dotati di ridondanza possono subire diversi tipi di guasti delle unità senza perdere dati. Quando un array perde un dispositivo ma è ancora operativo, si dice che sia in modalità degradata. Gli array danneggiati possono essere ricostruiti in condizioni pienamente operative una volta sostituito l’hardware guasto, ma nel frattempo potrebbero subire una riduzione delle prestazioni.
    • Resilvering: Resilvering, o risincronizzazione, è il termine utilizzato per ricostruire un array danneggiato. A seconda della configurazione RAID e dell’impatto del guasto, ciò avviene copiando i dati dai file esistenti nell’array oppure calcolando i dati valutando le informazioni di parità.
    • Array annidati: gruppi di array RAID possono essere combinati in array più grandi. Questo di solito viene fatto per sfruttare le funzionalità di due o più livelli RAID diversi. Di solito, gli array con ridondanza (come RAID 1 o RAID 5) vengono utilizzati come componenti per creare un array RAID 0 per migliorare le prestazioni.
    • Span: Sfortunatamente, span ha un significato diverso quando si parla di array.
      • In determinati contesti, “span” può significare unire due o più dischi insieme end-to-end e presentarli come un unico dispositivo logico, senza miglioramenti in termini di prestazioni o ridondanza. Questa è anche conosciuta come disposizione lineare quando si ha a che fare con Linux mdadmimplementazione.
      • Uno “span” può anche riferirsi al livello inferiore di array combinati per formare il livello successivo quando si parla di livelli RAID nidificati, come RAID 10.
    • Scrubbing: lo scrubbing, o controllo, è il processo di lettura di ogni blocco in un array per assicurarsi che non vi siano errori di coerenza. Ciò aiuta a garantire che i dati siano gli stessi su tutti i dispositivi di archiviazione e previene situazioni in cui errori silenziosi possono causare danni, soprattutto durante procedure delicate come le ricostruzioni.

    Le caratteristiche di un array sono determinate dalla configurazione e dalla relazione dei dischi, nota come livello RAID . I livelli RAID più comuni sono:

    RAID 0

    RAID 0 combina due o più dispositivi distribuendo i dati su di essi. Come accennato in precedenza, lo striping è una tecnica che suddivide i dati in blocchi e quindi li scrive alternativamente su ciascun disco dell’array. Il vantaggio di ciò è che, poiché i dati sono distribuiti, l’intera potenza di ciascun dispositivo può essere utilizzata sia per le letture che per le scritture. Il profilo prestazionale teorico di un array RAID 0 è semplicemente la prestazione di un singolo disco moltiplicata per il numero di dischi (le prestazioni nel mondo reale saranno inferiori a questo). Un altro vantaggio è che la capacità utilizzabile dell’array è semplicemente la capacità combinata di tutte le unità che lo compongono.

    Sebbene questo approccio offra ottime prestazioni, presenta anche alcuni svantaggi molto importanti. Poiché i dati vengono suddivisi e divisi tra ciascuno dei dischi dell’array, il guasto di un singolo dispositivo causerà il guasto dell’intero array e tutti i dati andranno persi. A differenza della maggior parte degli altri livelli RAID, gli array RAID 0 non possono essere ricostruiti, poiché nessun sottoinsieme di dispositivi componenti contiene informazioni sufficienti sul contenuto per ricostruire i dati. Se si utilizza un array RAID 0, i backup diventano estremamente importanti, poiché l’intero set di dati dipende in egual misura dall’affidabilità di ciascuno dei dischi dell’array.

    RAID 1

    RAID 1 è una configurazione che rispecchia i dati tra due o più dispositivi. Tutto ciò che viene scritto nell’array viene posizionato su ciascuno dei dispositivi del gruppo. Ciò significa che ogni dispositivo ha un set completo di dati disponibili, offrendo ridondanza in caso di guasto del dispositivo. In un array RAID 1, i dati saranno comunque accessibili finché un singolo dispositivo nell’array funziona correttamente. L’array può essere ricostruito sostituendo le unità guaste, a quel punto i dispositivi rimanenti verranno utilizzati per copiare i dati sul nuovo dispositivo.

    Questa configurazione presenta anche alcune penalità. Come RAID 0, la velocità di lettura teorica può ancora essere calcolata moltiplicando la velocità di lettura di un singolo disco per il numero di dischi. Per le operazioni di scrittura, tuttavia, le prestazioni massime teoriche saranno quelle del dispositivo più lento dell’array. Ciò è dovuto al fatto che l’intero dato deve essere scritto su ciascuno dei dischi dell’array. Inoltre, la capacità totale dell’array sarà quella del disco più piccolo. Pertanto un array RAID 1 con due dispositivi di uguali dimensioni avrà la capacità utilizzabile di un singolo disco. L’aggiunta di ulteriori dischi può aumentare il numero di copie ridondanti dei dati, ma non aumenterà la quantità di capacità disponibile.

    RAID 5

    RAID 5 presenta alcune caratteristiche dei due livelli RAID precedenti, ma presenta un profilo prestazionale diverso e diversi inconvenienti. In RAID 5, i dati vengono distribuiti sui dischi più o meno allo stesso modo di un array RAID 0. Tuttavia, per ogni striscia di dati scritta sull’array, le informazioni sulla parità, un valore calcolato matematicamente che può essere utilizzato per la correzione degli errori e la ricostruzione dei dati, verranno scritte su uno dei dischi. Il disco che riceve il blocco di parità calcolata anziché un blocco dati ruoterà con ogni stripe scritto.

    Ciò presenta alcuni vantaggi importanti. Come altri array con striping, le prestazioni di lettura traggono vantaggio dalla capacità di leggere da più dischi contemporaneamente. Gli array RAID 5 gestiscono la perdita di qualsiasi disco nell’array. Se ciò accade, i blocchi di parità consentono la ricostruzione completa dei dati. Poiché la parità è distribuita (alcuni livelli RAID meno comuni utilizzano un’unità di parità dedicata, nella fattispecie RAID 4), ogni disco dispone di una quantità bilanciata di informazioni sulla parità. Mentre la capacità di un array RAID 1 è limitata alla dimensione di un singolo disco (tutti i dischi hanno copie identiche dei dati), con la parità RAID 5 è possibile ottenere un livello di ridondanza al costo dello spazio di un solo disco. Pertanto, quattro unità da 100 G in un array RAID 5 produrrebbero 300 G di spazio utilizzabile (gli altri 100 G sarebbero occupati dalle informazioni di parità distribuite).

    Come gli altri livelli, RAID 5 presenta alcuni inconvenienti significativi che devono essere presi in considerazione. Le prestazioni del sistema possono rallentare notevolmente a causa dei calcoli di parità al volo. Ciò può influire su ogni operazione di scrittura. Se un disco si guasta e l’array entra in uno stato degradato, verrà introdotta anche una penalità significativa per le operazioni di lettura (i dati mancanti dovranno essere calcolati dai dischi rimanenti). Inoltre, quando l’array viene riparato dopo la sostituzione di un’unità guasta, è necessario leggere ciascuna unità e utilizzare la CPU per calcolare i dati mancanti e ricostruirli. Ciò può stressare le unità rimanenti, portando talvolta a ulteriori guasti, con conseguente perdita di tutti i dati.

    RAID 6

    RAID 6 utilizza un’architettura simile a RAID 5, ma con informazioni di doppia parità. Ciò significa che l’array può sopportare il guasto di due dischi qualsiasi. Si tratta di un vantaggio significativo dovuto alla maggiore probabilità che si verifichi un ulteriore guasto del disco durante il processo di ricostruzione intensivo dopo che si è verificato un errore. Come altri livelli RAID che utilizzano lo striping, le prestazioni di lettura sono generalmente buone. Tutti gli altri vantaggi del RAID 5 esistono anche per il RAID 6.

    Per quanto riguarda gli svantaggi, RAID 6 compensa la doppia parità aggiuntiva con la capacità di un disco aggiuntivo. Ciò significa che la capacità totale dell’array corrisponde allo spazio combinato delle unità coinvolte, meno due unità. Il calcolo per determinare i dati di parità per RAID 6 è più complesso di RAID 5, il che può portare a prestazioni di scrittura peggiori rispetto a RAID 5. RAID 6 soffre di alcuni degli stessi problemi di degrado di RAID 5, ma la ridondanza del disco aggiuntivo protegge contro la probabilità che ulteriori errori cancellino i dati durante le operazioni di ricostruzione.

    RAID 10

    RAID 10 può essere implementato in diversi modi, che influiscono sulle sue caratteristiche generali:

    • RAID nidificato 1+0

    Tradizionalmente, RAID 10 si riferisce a un RAID nidificato, creato impostando prima due o più mirror RAID 1 e quindi utilizzandoli come componenti per creare un array RAID 0 con striping su di essi. A volte questo viene ora chiamato RAID 1+0 per essere più espliciti su questa relazione. A causa di questa progettazione, sono necessari almeno quattro dischi per formare un array RAID 1+0 (RAID 0 con striping su due array RAID 1 costituiti da due dispositivi ciascuno).

    Gli array RAID 1+0 hanno le caratteristiche di prestazioni elevate di un array RAID 0, ma invece di fare affidamento su singoli dischi per ciascun componente dello stripe, viene utilizzato un array con mirroring, fornendo ridondanza. Questo tipo di configurazione può gestire i guasti del disco in qualsiasi set RAID 1 con mirroring purché almeno un disco in ciascun RAID 1 rimanga disponibile. L’array complessivo è tollerante agli errori in modo sbilanciato, il che significa che può gestire un numero diverso di errori a seconda di dove si verificano.

    Poiché RAID 1+0 offre sia ridondanza che prestazioni elevate, di solito è un’ottima opzione se il numero di dischi richiesti non è proibitivo.

    • RAID 10 di mdadm

    Quello di Linux mdadmoffre la propria versione di RAID 10, che porta avanti lo spirito e i vantaggi di RAID 1+0, ma altera l’effettiva implementazione per essere più flessibile e offrire alcuni vantaggi aggiuntivi.

    Come RAID 1+0, mdadmRAID 10 consente copie multiple e dati con striping. Tuttavia, i dispositivi non sono disposti in termini di coppie speculari. L’amministratore decide invece il numero di copie che verranno scritte per l’array. I dati vengono suddivisi in blocchi e scritti sull’array in più copie, assicurandosi che ciascuna copia di un blocco venga scritta su un dispositivo fisico diverso. Il risultato finale è che esiste lo stesso numero di copie, ma l’array non è vincolato tanto dalla nidificazione sottostante.

    Questa concezione del RAID 10 presenta alcuni notevoli vantaggi rispetto al RAID 1+0 nidificato. Poiché non si basa sull’utilizzo di array come elementi costitutivi, può utilizzare un numero dispari di dischi e ha un numero minimo di dischi inferiore (sono richiesti solo 3 dispositivi). Anche il numero di copie da conservare è configurabile. La gestione è semplificata poiché è necessario indirizzare un solo array ed è possibile allocare parti di riserva che possono essere utilizzate per qualsiasi disco dell’array invece che per un solo array componente.