Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
148 lines
10 KiB
HTML
148 lines
10 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="it">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>NIS2 — Piano database privato + cifratura (socket → TCP)</title>
|
|
<style>
|
|
:root{
|
|
--cy:#06B6D4; --cy-d:#0e7490; --ink:#0f172a; --mut:#64748b; --line:#e2e8f0;
|
|
--ok:#16a34a; --okbg:#dcfce7; --warn:#ea580c; --warnbg:#fff7ed; --bad:#dc2626; --badbg:#fee2e2;
|
|
--bg:#f8fafc; --card:#fff; --app:#3B82F6; --agile:#8b5cf6;
|
|
}
|
|
*{box-sizing:border-box}
|
|
body{font-family:'Segoe UI',system-ui,Arial,sans-serif;color:var(--ink);background:var(--bg);margin:0;line-height:1.55;font-size:15px}
|
|
.wrap{max-width:1080px;margin:0 auto;padding:28px 20px 70px}
|
|
header.hero{background:linear-gradient(135deg,#0f172a,#0e7490);color:#fff;border-radius:18px;padding:30px 34px;margin-bottom:22px}
|
|
header.hero .tag{display:inline-block;background:rgba(255,255,255,.16);padding:4px 12px;border-radius:999px;font-size:12px;letter-spacing:1px;text-transform:uppercase}
|
|
header.hero h1{margin:12px 0 6px;font-size:26px}
|
|
header.hero p{margin:0;opacity:.92;max-width:760px}
|
|
h2{font-size:20px;margin:34px 0 4px;border-left:5px solid var(--cy);padding-left:12px}
|
|
h2 small{display:block;font-size:13px;color:var(--mut);font-weight:400;padding-left:1px;margin-top:2px}
|
|
/* diagram */
|
|
.diagrid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:16px}
|
|
@media(max-width:820px){.diagrid{grid-template-columns:1fr}}
|
|
.panel{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px;display:flex;flex-direction:column}
|
|
.panel .ph{font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:.5px;margin-bottom:10px}
|
|
.panel.now .ph{color:var(--mut)} .panel.bad .ph{color:var(--bad)} .panel.good .ph{color:var(--ok)}
|
|
.flow{display:flex;flex-direction:column;align-items:center;gap:6px;flex:1;justify-content:center}
|
|
.node{width:100%;border-radius:10px;padding:10px 12px;text-align:center;font-size:13.5px;font-weight:600;border:2px solid}
|
|
.n-app{border-color:var(--app);background:#eff6ff;color:#1e40af}
|
|
.n-db{border-color:#94a3b8;background:#f1f5f9;color:#334155}
|
|
.n-gate{border-color:var(--warn);background:var(--warnbg);color:#9a3412}
|
|
.n-db-ok{border-color:var(--ok);background:var(--okbg);color:#166534}
|
|
.arrow{font-size:20px;color:var(--mut);line-height:1}
|
|
.lbl{font-size:11.5px;color:var(--mut);font-style:italic}
|
|
.verdict{margin-top:12px;border-radius:8px;padding:8px 10px;font-size:12.5px;font-weight:600;text-align:center}
|
|
.v-now{background:#f1f5f9;color:#475569} .v-bad{background:var(--badbg);color:#991b1b} .v-good{background:var(--okbg);color:#166534}
|
|
/* steps */
|
|
.steps{margin-top:14px;border-left:3px solid var(--cy);padding-left:0}
|
|
.step{display:flex;gap:12px;padding:12px 14px;border:1px solid var(--line);border-left:none;border-radius:0 12px 12px 0;background:#fff;margin:0 0 10px 16px;position:relative}
|
|
.step .num{position:absolute;left:-31px;top:12px;width:28px;height:28px;border-radius:50%;background:var(--cy);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center;font-size:13px}
|
|
.step .body{flex:1}
|
|
.step .who{display:inline-block;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;padding:2px 8px;border-radius:999px;margin-bottom:4px}
|
|
.w-agile{background:#ede9fe;color:#6d28d9} .w-app{background:#dbeafe;color:#1d4ed8} .w-all{background:#f1f5f9;color:#475569}
|
|
.step h4{margin:0 0 3px;font-size:15px}
|
|
.step p{margin:0;font-size:13.5px;color:#475569}
|
|
.box{border-radius:12px;padding:16px 18px;margin-top:16px;font-size:14px}
|
|
.box.warn{background:var(--warnbg);border:1px solid #fed7aa;color:#9a3412}
|
|
.box.gold{background:#fffbeb;border:1px solid #fde68a;color:#92400e}
|
|
.box.ok{background:var(--okbg);border:1px solid #bbf7d0;color:#166534}
|
|
.legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12.5px;color:var(--mut);margin-top:10px}
|
|
.legend b{padding:2px 8px;border-radius:999px}
|
|
footer{margin-top:36px;border-top:1px solid var(--line);padding-top:14px;font-size:12px;color:var(--mut)}
|
|
.key{font-family:ui-monospace,Menlo,Consolas,monospace;background:#f1f5f9;padding:1px 6px;border-radius:5px;font-size:12.5px}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="wrap">
|
|
|
|
<header class="hero">
|
|
<span class="tag">Piano operativo · spiegato semplice</span>
|
|
<h1>NIS2 — Database privato + cifratura (TLS)</h1>
|
|
<p>Dare a NIS2 il suo database, cifrato come gli altri prodotti. Stanotte 3 disservizi: ora sappiamo perché e c'è la strada che funziona. Metafora: <b>casa condivisa</b> vs <b>stanza tutta tua</b>.</p>
|
|
</header>
|
|
|
|
<h2>1. Il prima, il problema, la soluzione
|
|
<small>Lo stesso "motore" dell'app (i worker che servono le pagine), tre scenari</small>
|
|
</h2>
|
|
<div class="diagrid">
|
|
|
|
<div class="panel now">
|
|
<div class="ph">● Oggi — funziona ma non cifrabile</div>
|
|
<div class="flow">
|
|
<div class="node n-app">🟦 App NIS2</div>
|
|
<div class="arrow">⬇</div>
|
|
<div class="lbl">corridoio interno (socket)</div>
|
|
<div class="node n-db">🏠 DB casa condivisa<br>(host MySQL)</div>
|
|
</div>
|
|
<div class="verdict v-now">Verde, ma il corridoio è dentro casa: niente da cifrare, e se ci provi crolla</div>
|
|
</div>
|
|
|
|
<div class="panel bad">
|
|
<div class="ph">✗ Tentativo — TCP verso la casa condivisa</div>
|
|
<div class="flow">
|
|
<div class="node n-app">🟦 App NIS2</div>
|
|
<div class="arrow">⬇</div>
|
|
<div class="lbl">esce in rete…</div>
|
|
<div class="node n-gate">🚪 Cancello (gateway)<br>ti scambia per uno sconosciuto</div>
|
|
<div class="arrow">⬇</div>
|
|
<div class="node n-db">🏠 DB host → ❌ <b>1045</b> respinto</div>
|
|
</div>
|
|
<div class="verdict v-bad">Il "cancello" cambia l'identità → il DB ti respinge. È il guaio dei 3 disservizi.</div>
|
|
</div>
|
|
|
|
<div class="panel good">
|
|
<div class="ph">✓ Soluzione — il database tutto suo</div>
|
|
<div class="flow">
|
|
<div class="node n-app">🟦 App NIS2</div>
|
|
<div class="arrow">⬇</div>
|
|
<div class="lbl">rete interna diretta · 🔒 cifrata</div>
|
|
<div class="node n-db-ok">🚪➡🛏 Stanza accanto<br>DB privato <span class="key">nis2-db</span></div>
|
|
</div>
|
|
<div class="verdict v-good">Stessa rete, niente cancello → niente rifiuto. Qui il TLS si accende davvero. ✓ verificato dal worker reale</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<h2>2. Chi fa cosa — i passi (tutti reversibili in 30 secondi)
|
|
<small>Verde = già verificato funzionante dal vero motore dell'app</small>
|
|
</h2>
|
|
<div class="legend">
|
|
<span><b class="w-agile">Agile / VIGILE</b> tocca il database</span>
|
|
<span><b class="w-app">App (io)</b> tocca il codice/config</span>
|
|
<span><b class="w-all">Insieme</b> verifica</span>
|
|
</div>
|
|
<div class="steps">
|
|
<div class="step"><div class="num">1</div><div class="body"><span class="who w-agile">Agile</span><h4>Backup</h4><p>Copia di sicurezza prima di toccare qualsiasi cosa.</p></div></div>
|
|
<div class="step"><div class="num">2</div><div class="body"><span class="who w-agile">Agile</span><h4>Riempire il database privato — <b>migrando i dati veri dall'host</b></h4><p>Oggi il container è <b>vuoto (0 utenti)</b>. I dati reali (19 utenti, org Agile Technology, assessment…) sono nella casa condivisa. ⚠️ <b>Migrare, NON ripartire da zero</b> (altrimenti si perde tutto).</p></div></div>
|
|
<div class="step"><div class="num">3</div><div class="body"><span class="who w-app">App (io)</span><h4>Spostare l'app sul container, in TCP</h4><p>Cambio una riga: <span class="key">DB_HOST = 172.21.0.4</span> (l'indirizzo numerico del container — <b>non il nome</b>, perché il motore dell'app non risolve i nomi).</p></div></div>
|
|
<div class="step"><div class="num">4</div><div class="body"><span class="who w-all">Verifica</span><h4>Login vero</h4><p>Faccio un <b>login reale + apro una dashboard</b>. Deve rispondere normale (200/401), mai errore. Se va male → torno indietro in 30 secondi.</p></div></div>
|
|
<div class="step"><div class="num">5</div><div class="body"><span class="who w-app">App (io)</span><h4>Accendere la cifratura (TLS)</h4><p>Attivo il flag + uso la CA del container (già quella giusta). Verifico di nuovo dal login reale che giri <b>cifrato</b> (TLSv1.3).</p></div></div>
|
|
<div class="step"><div class="num">6</div><div class="body"><span class="who w-agile">Agile</span><h4>Mettere l'obbligo</h4><p>Solo dopo il mio "TLS verde": <span class="key">REQUIRE SSL</span> sull'utente del database. Da quel momento il non-cifrato è rifiutato.</p></div></div>
|
|
<div class="step"><div class="num">7</div><div class="body"><span class="who w-app">App (io)</span><h4>Staccare il vecchio aggancio + tenere la rete di sicurezza</h4><p>NIS2 diventa indipendente come gli altri. Resta attivo il <b>guard anti-disservizio</b> già messo nel codice.</p></div></div>
|
|
</div>
|
|
|
|
<h2>3. La decisione che serve da Agile</h2>
|
|
<div class="box warn">
|
|
<b>⚠️ Migrare i dati, non ripartire da zero.</b> Il database privato è vuoto; quello vero (host) ha <b>19 utenti e 60 tabelle reali</b> — utenti, organizzazione Agile Technology, assessment, incidenti. "Ripartire puliti" significherebbe <b>cancellarli</b>. Per dati reali va fatta la <b>copia (migrazione)</b>. La scelta è di Agile, perché i dati li tocca solo Agile.
|
|
</div>
|
|
|
|
<h2>4. La regola d'oro</h2>
|
|
<div class="box gold">
|
|
<b>Verificare sempre dal vero motore dell'app (un login reale), mai dalle scorciatoie</b> (pagina di stato, riga di comando, "a memoria"). Stanotte le scorciatoie hanno ingannato 3 volte: la riga di comando diceva "funziona" mentre l'app vera cadeva.
|
|
</div>
|
|
|
|
<div class="box ok" style="margin-top:18px">
|
|
<b>In una riga:</b> Agile copia i dati veri nel database privato di NIS2 → io sposto l'app lì (in TCP, con l'indirizzo numerico), accendo la cifratura e verifico col login vero → Agile mette l'obbligo. Risultato: <b>NIS2 indipendente e cifrato come gli altri</b>, senza più passare dal "cancello" che faceva cadere tutto.
|
|
</div>
|
|
|
|
<footer>
|
|
NIS2 Agile · piano TLS-DB (socket → TCP container) · documento esplicativo interno · 2026-06-11.
|
|
Stato attuale: app <b>verde</b> (socket clear, cifratura non ancora attiva, guard anti-disservizio inserito).
|
|
</footer>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|