Files
admin-netmonster-db/sql/migration_security_hardening.sql
2026-10-21 21:54:23 +02:00

62 lines
3.1 KiB
SQL

-- migration_security_hardening.sql
--
-- Migration de durcissement securite suite a l'audit du 20/09/2026,
-- POUR UNE BASE DEJA EN PRODUCTION (schema anterieur a la fusion en
-- install_full_schema.sql). Si vous demarrez une installation NEUVE,
-- n'utilisez PAS ce fichier : utilisez install_full_schema.sql qui
-- inclut deja tout ce qui suit.
--
-- Contenu :
-- 1. Table login_attempts pour un rate limiting stocke en base,
-- independant de la session PHP du visiteur (donc non
-- contournable en vidant les cookies ou en ouvrant une navigation
-- privee). Utilisee par admin/admin_auth.php et admin/login.php.
-- 2. Ajout de la valeur 'cellmapper_import' a l'ENUM `source` de
-- staging_cells : admin/cellmapper_import.php insere des lignes
-- avec source = "cellmapper_import", ce qui echoue (ou tronque
-- silencieusement selon le mode strict SQL) si l'ENUM d'origine ne
-- contient que ('ntm_import','manual_form'). Sans ce correctif,
-- tout import CellMapper sur une base anterieure a la fusion du
-- schema echoue en base malgre un code PHP fonctionnel.
--
-- Les roles admin_users (admin/reviewer) sont volontairement REPORTES
-- a une migration future : tant qu'un seul compte administrateur est
-- utilise, ajouter une colonne role non appliquee partout donnerait
-- une fausse impression de securite sans reel controle d'acces.
--
-- A executer une seule fois sur la base existante :
-- mysql --defaults-extra-file=/etc/netmonster/.my.cnf netmonster < migration_security_hardening.sql
-- ---------------------------------------------------------------------
-- 1. Rate limiting de connexion
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS login_attempts (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
username_normalized VARCHAR(190) NOT NULL,
ip_address VARCHAR(45) NOT NULL,
attempted_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
success TINYINT(1) NOT NULL DEFAULT 0,
turnstile_verified TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
KEY idx_username_ip_time (username_normalized, ip_address, attempted_at),
KEY idx_ip_time (ip_address, attempted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Purge recommandee via cron (pas dans cette migration), pour eviter
-- que la table ne grossisse indefiniment :
-- DELETE FROM login_attempts WHERE attempted_at < NOW() - INTERVAL 30 DAY;
-- ---------------------------------------------------------------------
-- 2. Ajout de 'cellmapper_import' a l'ENUM source de staging_cells
--
-- MODIFY COLUMN reconstruit l'ENUM avec la valeur supplementaire, sans
-- toucher aux lignes existantes (leurs valeurs actuelles 'ntm_import'
-- et 'manual_form' restent valides et inchangees dans le nouvel ENUM).
-- Operation instantanee ou quasi-instantanee selon la version
-- MySQL/MariaDB (pas de reecriture de table necessaire pour un ajout
-- de valeur en fin d'ENUM sur les versions recentes).
-- ---------------------------------------------------------------------
ALTER TABLE staging_cells
MODIFY COLUMN source ENUM('ntm_import','manual_form','cellmapper_import')
NOT NULL DEFAULT 'ntm_import';