fix(db): moindre privilege pour le user applicatif (drop GRANT ALL) #24

Merged
Corentin merged 1 commit from fix/db-least-privilege into dev 2026-06-16 14:19:59 +02:00
Owner

Finding MEDIUM (audit 2026-06-16)

Le user applicatif wakdo avait GRANT ALL PRIVILEGES ON wakdo.* (comportement par defaut de l'image quand MARIADB_USER est defini), alors que la doc (compose + backup-db.sh) decrivait un moindre privilege jamais applique. Le code back-office expose tournait donc avec DDL/DROP/GRANT inutiles (les migrations tournent en root, pas avec ce user).

Correctif

  • db/init/10-scope-app-user.sh : script d'init MariaDB execute sur volume vierge (/docker-entrypoint-initdb.d). REVOKE ALL puis GRANT le set restreint : SELECT, INSERT, UPDATE, DELETE, SHOW VIEW, TRIGGER, LOCK TABLES sur la base (DML applicatif + besoins mysqldump). Parametre sur MARIADB_USER/MARIADB_DATABASE. Sans DDL, sans GRANT OPTION, sans DROP.
  • docker-compose.yml : montage de ./db/init en initdb.d (ro).
  • backup-db.sh : commentaire aligne sur le set reel.

Verification

  • Volume vierge (MariaDB jetable + script monte) : le user ressort SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, SHOW VIEW, TRIGGER (plus de ALL PRIVILEGES).
  • Base dev (deja initialisee -> scopee manuellement en root, hors initdb.d) : /api/health = 200 (SELECT) et les 13 tests d'integration passent (DML create/update/delete en tant que wakdo).

Note : la base dev existante a ete scopee manuellement (le script init ne rejoue pas sur un volume deja initialise). Pas de label auto-merge.

## Finding MEDIUM (audit 2026-06-16) Le user applicatif `wakdo` avait `GRANT ALL PRIVILEGES ON wakdo.*` (comportement par defaut de l'image quand MARIADB_USER est defini), alors que la doc (compose + backup-db.sh) decrivait un moindre privilege jamais applique. Le code back-office expose tournait donc avec DDL/DROP/GRANT inutiles (les migrations tournent en root, pas avec ce user). ## Correctif - `db/init/10-scope-app-user.sh` : script d'init MariaDB execute sur volume vierge (`/docker-entrypoint-initdb.d`). REVOKE ALL puis GRANT le set restreint : `SELECT, INSERT, UPDATE, DELETE, SHOW VIEW, TRIGGER, LOCK TABLES` sur la base (DML applicatif + besoins `mysqldump`). Parametre sur `MARIADB_USER`/`MARIADB_DATABASE`. Sans DDL, sans GRANT OPTION, sans DROP. - `docker-compose.yml` : montage de `./db/init` en initdb.d (ro). - `backup-db.sh` : commentaire aligne sur le set reel. ## Verification - Volume vierge (MariaDB jetable + script monte) : le user ressort `SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, SHOW VIEW, TRIGGER` (plus de ALL PRIVILEGES). - Base dev (deja initialisee -> scopee manuellement en root, hors initdb.d) : `/api/health` = 200 (SELECT) et les 13 tests d'integration passent (DML create/update/delete en tant que `wakdo`). Note : la base dev existante a ete scopee manuellement (le script init ne rejoue pas sur un volume deja initialise). Pas de label auto-merge.
Corentin added 1 commit 2026-06-16 13:53:40 +02:00
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
b85563b1b8
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).
Corentin merged commit e62a9783b1 into dev 2026-06-16 14:19:59 +02:00
Corentin deleted branch fix/db-least-privilege 2026-06-16 14:19:59 +02:00
Sign in to join this conversation.
No reviewers
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: AcadeNice/corentin_wakdo#24
No description provided.