4.9 KiB
4.9 KiB
type, milestone, date, project
| type | milestone | date | project |
|---|---|---|---|
| testing | M3 | 2026-05-11 | Metamorph |
Testing M3 — RBAC, groups, users, invitations
1. Lancement de la stack
make clean # reset complet si une stack tournait déjà
make up # build + start db/api/front
make migrate # applique le schéma (head)
DoD réussie quand :
http://localhost:8080répond et la home indique « M3 milestone (RBAC) »make logs-api | grep INSTALLmontre le bandeau du token d'install (1ʳᵉ fois)make logs-api | grep metamorph.permissions.seededconfirmeperms_total: 31au boot
2. Tests automatisés
make test-api # 39 tests pytest, dont 15 nouveaux sur RBAC
make e2e # 28 tests Playwright, dont 8 M3
make e2e-report # ouvre le rapport HTML
Le rapport JUnit est dans e2e/playwright-report/junit.xml.
3. Procédure manuelle (smoke navigateur)
Pré-requis
- Stack up via
make up. make print-install-token→ noter le token (oumake logs-apipour le bandeau).
3.1 Bootstrap admin
- Visiter
http://localhost:8080/setup→ coller le token, créeradmin@metamorph.local/AdminPass1234!. - Redirection auto vers
/loginaprès ~1.5 s. - Se connecter avec les mêmes identifiants.
- La barre de nav fait apparaître les liens Users / Groups / Invitations (visibles uniquement quand
is_admin === true).
3.2 Page Groups (/admin/groups)
- Cliquer + New group → modale
new group. - Nom :
pentest-2026-Q2, description libre. - Cocher uniquement
mission.readetmission.write_red_fieldsdans la grille de permissions. - Create group → la carte apparaît dans la liste avec les badges
2 perms. - Ouvrir le groupe
admin(système) — le champNamedoit être désactivé et la mention « System groups cannot be renamed. » visible. - Tenter de supprimer le groupe
admin→ bouton Delete invisible (les groupes système sont protégés côté UI et serveur).
3.3 Page Invitations (/admin/invitations)
- Cliquer + New invitation → modale
new invitation. - Email hint :
alice@metamorph.local. Cocherpentest-2026-Q2. - Generate link → modale
invitation linkmontrant l'URL one-shot ; bouton Copy disponible. - Coller l'URL dans un onglet privé → page
/registerpré-remplie avec l'email hint. Compléter le mot de passe, valider.
3.4 Page Users (/admin/users)
- Liste les comptes existants. Chercher
alicedans le champ Search. - Cliquer Edit sur Alice → modale
alice@metamorph.local. Vérifier ses groupes (cochés :pentest-2026-Q2). - Décocher
pentest-2026-Q2, cocherredteam. Save changes. - Recharger la page → Alice a maintenant le badge
redteam.
3.5 Last-admin protection
- Tenter de soft-delete l'admin courant via l'API :
Réponse : 409
ACCESS=$(curl -s -X POST http://localhost:8080/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"admin@metamorph.local","password":"AdminPass1234!"}' | jq -r .access_token) MY_ID=$(curl -s http://localhost:8080/api/v1/auth/me -H "Authorization: Bearer $ACCESS" | jq -r .id) curl -i -X DELETE http://localhost:8080/api/v1/users/$MY_ID -H "Authorization: Bearer $ACCESS"{"error":"last_admin_protected"}.
3.6 Vérification RBAC côté serveur (non-admin)
- Se connecter en tant qu'Alice (membre uniquement de
redteamaprès l'étape 3.4) :ACCESS=$(curl -s -X POST http://localhost:8080/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"alice@metamorph.local","password":"<son password>"}' | jq -r .access_token) /users→ 403 :redteamn'a pasuser.read.POST /groups→ 403 :redteamn'a pasgroup.create.- Naviguer dans le browser sur
/admin/users→ redirige vers/(RequireAdmin client-side).
3.7 Catalogue permissions
curl -s http://localhost:8080/api/v1/permissions -H "Authorization: Bearer $ACCESS_ADMIN" | jq '.items | length'
Doit retourner 31 (cf. app/services/permissions_seed.py:PERMISSION_CATALOGUE).
4. Points de contrôle critiques
- Les 3 groupes système (
admin,redteam,blueteam) existent avecis_system=trueet leurs perms bind par défaut. - Le seed est idempotent : booter,
make migrate, rebooter → toujoursperms_total: 31,perms_created: 0. - Un non-admin reçoit 403 sur tout endpoint protégé par
@require_permqu'il ne couvre pas. - L'admin bypass est effectif (
is_admin→ toujours OK même sans perm explicite). - Les noms et perms des groupes système ne sont pas modifiables côté UI (champs disabled, bouton Delete masqué).
- Le dernier admin ne peut pas être désactivé / supprimé / retiré du groupe
admin. /admin/users,/admin/groups,/admin/invitationsmasqués pour les non-admin (nav + RequireAdmin)./diag/resetréinitialise aussi les compteurs rate-limit (utile entre tests Playwright).