From e62a9783b1beced5a62ff2315d6abdd5aa3bc370 Mon Sep 17 00:00:00 2001 From: Corentin JOGUET Date: Tue, 16 Jun 2026 14:19:58 +0200 Subject: [PATCH] fix(db): moindre privilege pour le user applicatif (drop GRANT ALL) (#24) --- db/init/10-scope-app-user.sh | 25 +++++++++++++++++++++++++ docker-compose.yml | 4 ++++ docker/cron/scripts/backup-db.sh | 7 +++++-- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100755 db/init/10-scope-app-user.sh diff --git a/db/init/10-scope-app-user.sh b/db/init/10-scope-app-user.sh new file mode 100755 index 0000000..bfe271a --- /dev/null +++ b/db/init/10-scope-app-user.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Wakdo - durcissement du privilege du user applicatif (moindre privilege). +# +# L'image mariadb cree MARIADB_USER avec GRANT ALL PRIVILEGES sur la base +# MARIADB_DATABASE. C'est trop large : le code applicatif expose (back-office) +# n'a besoin que de DML, jamais de DDL (CREATE/ALTER/DROP), de GRANT OPTION ni +# de DROP. Les migrations tournent separement en root (db/migrate.sh). +# +# Ce script s'execute UNIQUEMENT au premier demarrage sur volume vierge +# (/docker-entrypoint-initdb.d). Pour une base deja initialisee, appliquer le +# meme REVOKE/GRANT manuellement en root (voir db/init/README ou la PR). +# +# Set retenu : DML (SELECT/INSERT/UPDATE/DELETE) + ce dont mysqldump peut avoir +# besoin (SHOW VIEW, TRIGGER, LOCK TABLES). Pas de DDL, pas de GRANT, pas de DROP. +set -euo pipefail + +mariadb --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" <<-EOSQL + REVOKE ALL PRIVILEGES ON \`${MARIADB_DATABASE}\`.* FROM '${MARIADB_USER}'@'%'; + GRANT SELECT, INSERT, UPDATE, DELETE, SHOW VIEW, TRIGGER, LOCK TABLES + ON \`${MARIADB_DATABASE}\`.* TO '${MARIADB_USER}'@'%'; + FLUSH PRIVILEGES; +EOSQL + +echo "[init] privilege du user '${MARIADB_USER}' restreint au moindre privilege sur '${MARIADB_DATABASE}'." diff --git a/docker-compose.yml b/docker-compose.yml index d273c17..6300881 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -93,6 +93,10 @@ services: volumes: - wakdo_db_data:/var/lib/mysql + # Scripts d'init MariaDB, executes UNIQUEMENT au premier demarrage sur + # volume vierge : durcit le privilege du user applicatif (moindre + # privilege, db/init/10-scope-app-user.sh). Lecture seule. + - ./db/init:/docker-entrypoint-initdb.d:ro networks: - wakdo_internal diff --git a/docker/cron/scripts/backup-db.sh b/docker/cron/scripts/backup-db.sh index 57a17db..141e944 100644 --- a/docker/cron/scripts/backup-db.sh +++ b/docker/cron/scripts/backup-db.sh @@ -13,8 +13,11 @@ # - DB_USER (on utilise le user applicatif, pas root) # - DB_PASSWORD # -# Le USER applicatif doit avoir SELECT + LOCK TABLES + SHOW VIEW sur wakdo. -# (GRANT donnes dans les migrations a venir en P2.) +# Le USER applicatif a un privilege restreint (moindre privilege) : DML +# (SELECT/INSERT/UPDATE/DELETE) + SHOW VIEW, TRIGGER, LOCK TABLES sur wakdo, +# sans DDL ni GRANT OPTION. mysqldump --single-transaction (ci-dessous) n'exige +# que SELECT (+ SHOW VIEW/TRIGGER pour ces objets). Privileges poses par +# db/init/10-scope-app-user.sh (volume vierge) ou manuellement (base existante). # # Exit codes : # 0 - backup OK