Access Control Matrix (ACM)
Statut : draft à valider. Matrice rôles × ressources × actions pour la plateforme Nex. Document de référence pour audits et revues de privilèges.
1. Principes
- Authentification = preuve que l'acteur est bien celui qu'il prétend être (token Firebase, JWT internal-service, login admin).
- Autorisation = preuve que cet acteur peut faire cette action sur cette ressource (rôle, scope, ownership).
- Auditabilité = toute opération sensible produit une trace identifiable par acteur (
user_id, timestamp, action, ressource).
2. Catégories d'acteurs
Acteurs externes (utilisateurs finaux)
| Acteur | Source d'authentification | Token porté |
|---|---|---|
| Consumer | phone + PIN → Firebase custom token | Firebase ID token (Bearer) |
| Agent / Master-agent | phone + PIN, rôle simple_agent / master_agent | Firebase ID token |
| Merchant member | phone + PIN, rôle issu de merchant_members (cf. ADR-0004) | Firebase ID token + header X-Merchant-Id |
Acteurs internes (équipes Nex)
| Acteur | Source d'authentification | Outil |
|---|---|---|
| Ops / Support / KAM | login CMMS [À CONFIRMER mode] | CMMS |
| Administration plateforme | login Backoffice | Backoffice |
| Compliance officer | login CMMS, rôle dédié | CMMS |
| Tech ops / SRE | accès Doppler, AWS, GitLab | Outils tiers |
Acteurs techniques (services)
| Acteur | Source | Token |
|---|---|---|
| Service Nex → Service Nex | JWT internal-service avec scope (risk:evaluate, ledger:write, internal-service-jwt) | Bearer JWT signé |
| External Secrets Operator → Doppler | API key Doppler | Hors-bande |
| GitLab CI → Cloudflare Pages | Wrangler API token | Hors-bande |
3. Rôles utilisateurs finaux
Consumer (app Nex)
| Ressource | Action | Autorisé |
|---|---|---|
| Son propre wallet | lecture solde, historique | ✅ |
| Son propre profil | update infos non-KYC | ✅ |
| Son propre PIN | changer (avec ancien PIN) | ✅ |
| Sa propre identité KYC | upload documents | ✅ |
| Wallet d'un autre utilisateur | lecture | ❌ |
| Création intent P2P/cash-out/payment | initier | ✅ (limité par risk-engine + KYC level) |
| Endpoints admin | toute action | ❌ |
Agent (Nex Pro) — simple_agent
| Ressource | Action | Autorisé |
|---|---|---|
| Sa propre caisse | lecture | ✅ |
| Initiation cash-in / cash-out | initier au nom d'un consumer | ✅ |
| Liste des agents (autres) | lecture | ❌ |
| Audit trail d'un autre agent | lecture | ❌ |
Master-agent (Nex Pro) — master_agent (cf. ADR-0042)
| Ressource | Action | Autorisé |
|---|---|---|
| Caisses des agents de son réseau | lecture | ✅ |
| Réapprovisionnement d'un agent | initier | ✅ |
| Activation / désactivation agent | initier | ✅ (avec validation backoffice ?) [À CONFIRMER] |
| Master-agents tiers | lecture | ❌ |
Merchant members (Nex Business) — rôles owner, admin, operator, cashier, accountant
| Rôle | Encaisser | Voir historique | Gérer équipe | KYB | Cards |
|---|---|---|---|---|---|
owner | ✅ | ✅ tous POS | ✅ | ✅ | ✅ |
admin | ✅ | ✅ tous POS | ✅ (sauf owners) | ⚠️ partiel | ✅ |
operator | ✅ | ✅ tous POS | ❌ | ❌ | ❌ |
cashier | ✅ (POS rattaché) | ✅ POS rattaché uniquement | ❌ | ❌ | ❌ |
accountant | ❌ | ✅ lecture seule | ❌ | ❌ | ❌ |
Invariant DB : au moins 1 owner actif par merchant en permanence (assertNotLastActiveOwner). Invariant DB : cashier requiert un posId (CHECK).
4. Rôles équipes internes (CMMS, Backoffice)
[À CONFIRMER en détail avec l'équipe — la liste suivante est une proposition à valider]
| Rôle interne | CMMS — actions principales | Backoffice — actions principales |
|---|---|---|
support-l1 | Lire fiche client, historique tx, déclencher reset-pin (workflow) | ❌ |
support-l2 | + déblocage compte, traitement litige | ❌ |
kam | + création merchant, lien user → merchant | ❌ |
compliance-officer | + validation KYC/KYB, gestion alertes risk, SAR | ❌ |
tech-ops | Lire dashboards monitoring | + déploiement, env vars |
admin-platform | + lecture audit trail global | + tout (création rôles, paramétrage) |
5. Matrice service-à-service (JWT internal-service)
Scopes JWT inter-services attribués par le service auth :
| Scope | Délivré à | Permet d'appeler |
|---|---|---|
internal-service-jwt | Tous les services Nex | Endpoints /internal/* du service appelé |
risk:evaluate | orchestrator | POST /risk/evaluate (risk-engine) |
risk:evaluate:trusted | orchestrator (uniquement) | POST /risk/evaluate avec champ prefetched contexte (sans policy/limits — cf. ADR-0007) |
ledger:read | orchestrator, risk-engine, logs-reporting [à confirmer] | Lecture wallets, transactions |
ledger:write | orchestrator (uniquement) | Écriture ledger via POST /transition |
kyc:read | orchestrator, risk-engine | Lecture statut KYC |
kyc:write | orchestrator, customer-profiles-kyc | Mise à jour statut KYC |
notifications:send | orchestrator, auth | Envoi SMS / push / email |
files:upload | orchestrator | Upload via file-service |
files:read | orchestrator, customer-profiles-kyc (KYC review) | Lecture / signed URL |
6. Matrice accès infrastructure (admin plane)
| Système | Qui a accès ? | MFA ? | Audit log ? |
|---|---|---|---|
| AWS console | [À CONFIRMER : liste] | ✅ MFA obligatoire | ✅ CloudTrail |
| EKS kubectl | tech-ops, plateforme via Doppler kube creds | [À CONFIRMER] | ⚠️ à activer (audit K8s) |
| Doppler | tech-ops, plateforme | [À CONFIRMER] | ✅ natif Doppler |
| Cloudflare dashboard | tech-ops, plateforme | [À CONFIRMER] | ✅ natif CF |
| Firebase console | plateforme | [À CONFIRMER] | ✅ natif Firebase |
| GitLab self-hosted | tous les devs | [À CONFIRMER] | ✅ natif GitLab |
| RDS PostgreSQL prod | SELECT-only depuis bastions identifiés [À CONFIRMER] ; écritures via services uniquement | n/a | ⚠️ à enrichir (logs query) |
| Backoffice prod | admin-platform uniquement | [À CONFIRMER] | ⚠️ via logs-reporting (à implémenter) |
7. Privilèges DB (RBAC PostgreSQL)
Convention : un user PostgreSQL par service, accès limité au schéma propre du service (ADR-0014).
| Service | User PG | Privilèges sur son schéma | Privilèges cross-schema |
|---|---|---|---|
auth | nex_auth | USAGE + SELECT/INSERT/UPDATE/DELETE sur tables de auth.* | ❌ aucun |
ledger-wallets | nex_ledger | idem sur ledger.* | ❌ |
customer-profiles-kyc | nex_customer | idem sur customer.* | ❌ |
| (et ainsi de suite pour chaque service) | … | … | ❌ |
| Bastion read-only (debug humain) | nex_readonly | USAGE + SELECT sur tous les schémas | aucune écriture |
8. Gestion du cycle de vie des accès
| Événement | Action obligatoire |
|---|---|
| Onboarding salarié / prestataire | Provisioning des accès selon rôle, signature de la charte sécurité, formation. |
| Changement de rôle | Re-évaluation des accès dans la semaine. Retrait des accès non justifiés. |
| Offboarding | Révocation immédiate (≤ 4 h) de tous les accès, rotation des secrets partagés. Checklist documentée. |
| Accès prestataire externe (auditeur, pentester) | Accès limité dans le temps (≤ 30 j renouvelable), MFA, scope minimal. |
| Revue trimestrielle | Re-certification de la liste des accès admin par le RSSI. |
9. Logs d'accès et auditabilité
| Action | Source d'audit | État |
|---|---|---|
| Login utilisateur | service auth (table sessions) | ✅ |
| Action ledger (écriture) | service ledger-wallets (ledgers append-only) | ⚠️ created_by non rempli — dette documentée dans audit ledger |
| Action admin CMMS / Backoffice | service logs-reporting | ❌ à implémenter (service stub) |
| Pull secret Doppler | logs Doppler natifs | ✅ |
| Action AWS / Cloudflare | CloudTrail / CF audit log | ✅ |
10. Gaps connus
- Pas d'audit centralisé des actions admin internes (service
logs-reportingnon implémenté). ledgers.created_bynon rempli — réconciliation manuelle nécessaire.- Maker-checker sur paiements bulk non enforced.
- Pas de MFA généralisé sur tous les outils admin
[À CONFIRMER]. - Pas de re-certification trimestrielle des accès admin formalisée.
Voir /security/known-gaps pour le suivi avec sévérité et tickets.