groupe-meditation/docs/80_SECURITE.md

164 lines
4 KiB
Markdown
Raw Normal View History

2026-05-31 23:57:49 -04:00
# Sécurité et confidentialité
Statut: référence opérationnelle
Public: exploitants, sysadmin, mainteneurs, exécutifs
Dernière révision: 2026-06-01
## Principes
L'application doit minimiser les données personnelles, isoler les groupes et permettre au groupe de comprendre qui a changé quoi. Le journal ne sert pas à surveiller les membres; il sert à protéger l'historique et corriger les erreurs.
## Authentification
- Connexion par groupe, identifiant/courriel et PIN à 4 chiffres.
- PIN haché côté serveur.
- Session JWT.
- Durée normale: 30 jours.
- Durée avec `Se souvenir de moi`: 90 jours.
- Un membre inactif ne peut pas se connecter.
## Sysadmin
Le compte `Sysadmin`:
- existe au déploiement initial;
- a tous les accès;
- ne doit pas être supprimé;
- peut impersonifier un membre;
- peut gérer les groupes;
- doit être utilisé avec retenue.
Le PIN initial `0000` doit être changé ou encadré selon la politique du groupe après installation réelle.
## Impersonification
Quand Sysadmin agit comme un autre membre, le jeton conserve l'identité sysadmin dans `adm`. La journalisation peut donc distinguer:
- le membre au nom duquel l'action est faite;
- le sysadmin qui a causé l'action.
## Autorisations
Les accès ordinaires viennent:
- des postes actifs;
- des permissions de modules associées aux postes;
- de la catégorie `executif`.
Le frontend masque les modules non visibles, mais le backend doit toujours vérifier l'autorisation.
## Isolation multi-groupe
Chaque lecture ou modification doit être bornée au `groupe_id` du membre courant. Une route qui reçoit un identifiant doit vérifier l'appartenance de l'objet au groupe courant.
Voir [Multi-groupe](93_MULTI_GROUPE.md).
## Journalisation
Sont journalisées automatiquement:
- méthodes `POST`, `PUT`, `PATCH`, `DELETE`;
- routes sous `/api/`;
- actions réussies;
- membre;
- sysadmin d'origine si impersonification;
- chemin;
- statut HTTP;
- IP;
- user-agent;
- paramètres sûrs.
L'historique métier peut conserver:
- domaine;
- objet;
- ancienne valeur;
- nouvelle valeur;
- raison automatique;
- membre responsable.
## Données personnelles
Données membres typiques:
- prénom;
- nom optionnel;
- téléphone;
- identifiant/courriel;
- date d'abstinence optionnelle;
- PIN haché;
- préférences de notifications.
Le prénom est conservé lors du droit à l'oubli afin que l'historique reste lisible.
## Droit à l'oubli
Le droit à l'oubli ne supprime pas l'enregistrement du membre. Il anonymise:
- nom;
- téléphone;
- courriel ou identifiant de connexion;
- date d'abstinence;
- PIN;
- préférences;
- abonnements push.
Sont conservés:
- ID technique;
- prénom;
- relations historiques.
## Notifications push
Les notifications sont opt-in. Le membre choisit les catégories. Le navigateur peut refuser ou bloquer les notifications.
Les catégories applicatives sont:
- gouvernance;
- trésorerie;
- membres;
- postes;
- rencontres;
- littérature;
- événements;
- système.
## Secrets
Les secrets ne doivent pas être committés en clair.
Secrets principaux:
- mot de passe PostgreSQL applicatif;
- secret JWT;
- variables de notification push si utilisées;
- accès SSH Ansible.
Le fichier `ansible/group_vars/vault.yml` doit être chiffré avec Ansible Vault lorsqu'il contient des valeurs réelles.
## Sauvegardes
Les sauvegardes PostgreSQL doivent être protégées comme des données personnelles. Elles contiennent l'historique complet du groupe.
## Points de fracture
Risques principaux:
- mauvais groupe sélectionné à la connexion;
- utilisation prolongée de `Sysadmin`;
- permissions trop larges accordées à un poste;
- sauvegardes non testées;
- perte d'accès au serveur;
- conflit social autour du journal;
- absence de reprise papier.
Mesures:
- vérifier régulièrement les permissions;
- imprimer ou savoir produire les rapports clés;
- tester les sauvegardes;
- expliquer le rôle du journal;
- garder l'application comme outil, pas comme autorité.