From 4548cc6ff22e7ca46d6881cac58515f482c21e2d Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Thu, 11 Jun 2026 06:45:19 +0200 Subject: [PATCH] =?UTF-8?q?[FIX]=20TLS-DB=20nis2:=20guard=20anti-outage=20?= =?UTF-8?q?=E2=80=94=20salta=20SSL=20su=20connessione=20via=20UNIX=20socke?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lezione 2026-06-10 (3 outage): forzare SSL su una connessione via socket (DB_HOST 'localhost'/vuoto/path) da' PDOException [2002] "Cannot connect to MySQL using SSL" su ogni richiesta -> app giu'. sslOptions() ora ritorna [] (resta in chiaro + log) se DB_HOST indica un socket, anche col flag/env attivo. SSL si applica solo alle connessioni TCP. Il socket e' IPC locale: nessun transito di rete da cifrare. Cosi' riaccendere .db_ssl_on mentre l'app e' su socket NON puo' piu' causare outage. Co-Authored-By: Claude Opus 4.8 (1M context) --- application/config/database.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/application/config/database.php b/application/config/database.php index c1cfa1b..a422d58 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -85,6 +85,18 @@ class Database return []; } + // GUARD anti-outage (lezione 2026-06-10, 3 outage): il TLS NON si applica a + // una connessione via UNIX socket (DB_HOST 'localhost', vuoto o path '/...'). + // Forzarlo da' PDOException [2002] "Cannot connect to MySQL using SSL" su OGNI + // richiesta. Il socket e' IPC locale (nessun transito di rete da cifrare): + // restiamo in chiaro + log, anche se il flag/env e' attivo. SSL si applica solo + // alle connessioni TCP (es. 127.0.0.1 o un host di rete). + $host = defined('DB_HOST') ? (string) DB_HOST : ''; + if ($host === '' || strcasecmp($host, 'localhost') === 0 || $host[0] === '/') { + error_log('[Database] DB_SSL attivo ma connessione via UNIX socket (DB_HOST=' . $host . '): SSL non applicabile, resto in chiaro (socket = IPC locale, nessun transito da cifrare).'); + return []; + } + $ca = Env::get('DB_SSL_CA', __DIR__ . '/db-ca.pem'); if (!$ca || !is_file($ca) || !is_readable($ca)) { error_log('[Database] DB_SSL attivo ma CA non trovato/leggibile (' . $ca . '): connessione NON cifrata (serve il CA file).');