fix(db): moindre privilege pour le user applicatif (drop GRANT ALL)
All checks were successful
CI / secret-scan (pull_request) Successful in 8s
CI / static-tests (pull_request) Successful in 34s
CI / auto-merge (pull_request) Successful in 5s
CI / php-lint (pull_request) Successful in 22s
CI / secret-scan (push) Successful in 9s
CI / php-lint (push) Successful in 24s
CI / static-tests (push) Successful in 37s
CI / auto-merge (push) Has been skipped

L'image mariadb cree MARIADB_USER avec GRANT ALL PRIVILEGES sur la base, ce qui
donnait au code back-office expose un acces DDL/DROP/GRANT dont il n'a aucun
usage (les migrations tournent en root). La doc (compose, backup-db.sh) decrivait
pourtant un moindre privilege jamais applique.

- db/init/10-scope-app-user.sh : script d'init MariaDB (volume vierge) qui REVOKE
  ALL puis GRANT le set restreint SELECT/INSERT/UPDATE/DELETE + SHOW VIEW/TRIGGER/
  LOCK TABLES (DML + besoins mysqldump), parametre sur MARIADB_USER/DATABASE.
- docker-compose.yml : montage de db/init en /docker-entrypoint-initdb.d (ro).
- backup-db.sh : commentaire aligne sur le set reel (mysqldump --single-transaction
  n'exige que SELECT + SHOW VIEW/TRIGGER).

Verifie : sur volume vierge le user ressort scope (plus de ALL PRIVILEGES) ; sur
la base dev (scopee manuellement, hors volume vierge) /api/health=200 (SELECT) et
les 13 tests d'integration passent (DML create/update/delete en tant que wakdo).
This commit is contained in:
Imugiii 2026-06-16 11:53:38 +00:00
parent ad5203d3fc
commit b85563b1b8
3 changed files with 34 additions and 2 deletions

25
db/init/10-scope-app-user.sh Executable file
View file

@ -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}'."

View file

@ -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

View file

@ -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