# BAO - Back-office Admin Operations Toolkit d'administration pour consulter et gérer les données chiffrées de l'API Geosector. ## 🚀 Scripts disponibles | Script | Description | Exemple | |--------|-------------|---------| | `./bin/bao` | Menu interactif principal | `./bin/bao` | | `./bin/search-user` | Rechercher un user par nom/prénom/username/secteur | `./bin/search-user rca dupont` | | `./bin/decrypt-user` | Afficher les infos complètes d'un user | `./bin/decrypt-user rca 123` | | `./bin/reset-password` | Générer et enregistrer un nouveau mot de passe | `./bin/reset-password rca 123` | | `./bin/search-email` | Rechercher par email | `./bin/search-email rca contact@example.com` | | `./bin/list-users` | Lister les utilisateurs | `./bin/list-users dva --entite=5` | | `./bin/search-entite` | Rechercher une entité (mode interactif) | `./bin/search-entite rca plumeliau` | | `./bin/decrypt-entite` | Afficher les infos complètes d'une entité | `./bin/decrypt-entite rca 10` | | `./bin/list-entites` | Lister les entités | `./bin/list-entites dva --stripe` | | `./bin/list-operations` | Lister les opérations | `./bin/list-operations dva --entite=5` | | `./bin/list-sectors` | Lister les secteurs d'une opération | `./bin/list-sectors dva --operation=123` | ## 📋 Vue d'ensemble BAO est un ensemble de scripts **indépendants de l'API** permettant de : - Consulter les données **déchiffrées** des utilisateurs et entités - Rechercher dans les champs chiffrés (username, nom, email) - Réinitialiser les mots de passe utilisateurs - Se connecter aux **3 environnements** (DVA, RCA, PRA) via tunnels SSH - Vérifier l'intégrité du chiffrement AES-256-CBC ## 🏗️ Architecture ### Depuis le PC (via tunnels SSH) ``` PC Bureau (localhost) ↓ SSH Tunnels ├─→ IN3/dva-geo → IN3/maria3:3306 → dva_geo ├─→ IN3/rca-geo → IN3/maria3:3306 → rca_geo └─→ IN4/pra-geo → IN4/maria4:3306 → pra_geo ``` ### Depuis les containers (connexion directe) ``` IN3/dva-geo ──→ 13.23.33.4:3306 (maria3) → dva_geo IN3/rca-geo ──→ 13.23.33.4:3306 (maria3) → rca_geo IN4/pra-geo ──→ 13.23.33.4:3306 (maria4) → pra_geo ``` ### Connexions SSH Les tunnels SSH sont gérés automatiquement via `~/.ssh/config` : - **vpn-dva-geo** : Container DVA sur IN3 (via VPN) - **vpn-rca-geo** : Container RCA sur IN3 (via VPN) - **pra-geo** : Container PRA sur IN4 (désactivé) **Note** : Depuis les containers, les tunnels SSH ne sont **pas nécessaires**. BAO se connecte directement aux bases maria3/maria4. ## 📦 Installation ### 1. Prérequis ```bash # PHP 8.3+ avec extensions php -v php -m | grep -E 'pdo|openssl|mbstring' # SSH configuré dans ~/.ssh/config ssh vpn-dva-geo 'echo OK' ssh vpn-rca-geo 'echo OK' ``` ### 2. Configuration #### Sur le PC ```bash cd /home/pierre/dev/geosector/bao # Copier le template et adapter cp config/.env.example config/.env # Les valeurs par défaut sont configurées pour utiliser les tunnels SSH # vers dva-geo (port 3307) et rca-geo (port 3308) cat config/.env ``` #### Sur les containers (après déploiement) Le script `deploy-bao.sh` copie automatiquement `config/.env.container` vers `config/.env`. Cette configuration utilise les connexions **directes** vers maria3/maria4 (pas de tunnels SSH). ## 📦 Déploiement sur les containers BAO peut être déployé sur les containers pour une utilisation directe sur les serveurs. ### Déployer sur DVA (IN3/dva-geo) ```bash cd /home/pierre/dev/geosector/bao ./deploy-bao.sh ``` ### Déployer sur RECETTE (IN3/rca-geo) ```bash cd /home/pierre/dev/geosector/bao ./deploy-bao.sh rca ``` ### Déployer sur PRODUCTION (IN4/pra-geo) ```bash cd /home/pierre/dev/geosector/bao ./deploy-bao.sh pra ``` ### Utiliser BAO sur un container ```bash # Connexion au container ssh -i ~/.ssh/id_rsa_mbpi root@195.154.80.116 'incus exec rca-geo -- bash' # Lancer BAO cd /var/www/geosector/bao ./bin/bao # Ou directement un script ./bin/search-user rca dupont ``` ## 🚀 Utilisation ### Menu interactif principal ```bash cd /home/pierre/dev/geosector/bao ./bin/bao ``` Menu avec : 1. Sélection de l'environnement (DVA/RCA/PRA) 2. Actions disponibles (liste, recherche, décryptage) 3. Gestion automatique des tunnels SSH ### Scripts individuels #### Rechercher un utilisateur ```bash # Rechercher par nom, prénom, username ou secteur ./bin/search-user dva dupont ./bin/search-user rca pv_admin ./bin/search-user dva jean ``` **Fonctionnalités :** - Déchiffre **tous** les utilisateurs pour chercher - Cherche dans : `encrypted_user_name`, `encrypted_name`, `first_name`, `sect_name` - Affiche un tableau avec les résultats - Propose d'afficher les détails complets si 1 seul résultat #### Décrypter un utilisateur ```bash ./bin/decrypt-user dva 123 ./bin/decrypt-user rca 456 ``` **Affiche :** - Username, email, nom, prénom (déchiffrés) - Téléphones (déchiffrés) - Rôle, entité, dates #### Réinitialiser un mot de passe ```bash ./bin/reset-password dva 123 ./bin/reset-password rca 456 ``` **Fonctionnalités :** - Affiche les infos de l'utilisateur - Demande confirmation - Génère un mot de passe sécurisé (12-20 caractères, conforme aux règles API) - Hash avec bcrypt et met à jour la base - **Affiche le mot de passe en clair** (à sauvegarder) #### Décrypter une entité (amicale) ```bash ./bin/decrypt-entite dva 5 ./bin/decrypt-entite rca 10 ``` **Affiche :** - Nom, email, téléphones (déchiffrés) - Adresse complète - IBAN/BIC (déchiffrés) - Configuration (Stripe, mots de passe, etc.) - Statistiques (nb users, opérations) #### Lister les utilisateurs ```bash # Tous les utilisateurs (limite 50) ./bin/list-users dva # Filtrer par entité ./bin/list-users dva --entite=5 # Filtrer par rôle ./bin/list-users rca --role=2 # Limite personnalisée ./bin/list-users dva --limit=100 # Combinaison de filtres ./bin/list-users dva --entite=5 --role=2 --limit=20 ``` **Affiche :** Tableau avec username, email, nom (déchiffrés) #### Rechercher une entité ```bash # Rechercher par nom, adresse, ville ou email ./bin/search-entite dva plumeliau ./bin/search-entite rca amicale ./bin/search-entite dva appli ``` **Fonctionnalités :** - Déchiffre **toutes** les entités pour chercher - Cherche dans : `encrypted_name`, `encrypted_email`, `adresse1`, `adresse2`, `ville` - Affiche un tableau numéroté avec les résultats - **Mode interactif** : 1. Détail d'une entité → appelle `decrypt-entite` 2. Opérations d'une entité → appelle `list-operations` 3. Membres d'une entité → appelle `list-users` #### Lister les entités ```bash # Toutes les entités ./bin/list-entites dva # Uniquement celles avec Stripe activé ./bin/list-entites dva --stripe # Limite personnalisée ./bin/list-entites rca --limit=20 ``` **Affiche :** Tableau avec nom, email (déchiffrés), stats #### Lister les opérations ```bash # Toutes les opérations ./bin/list-operations dva # Opérations d'une entité spécifique ./bin/list-operations dva --entite=5 # Limite personnalisée ./bin/list-operations rca --entite=10 --limit=20 ``` **Affiche :** Tableau avec entité, libellé, dates, nb passages, nb users, nb secteurs #### Lister les secteurs d'une opération ```bash # Secteurs d'une opération spécifique ./bin/list-sectors dva --operation=123 ./bin/list-sectors rca --operation=456 ``` **Fonctionnalités :** - Affiche le libellé de l'opération - Liste tous les secteurs (actifs et inactifs) - Compte le nombre d'utilisateurs par secteur (depuis `ope_users_sectors`) - Compte le nombre de passages par secteur - Affiche des statistiques globales (total users, passages, secteurs actifs) **Affiche :** Tableau avec ID, libellé, couleur, nb users, nb passages, actif, date création #### Rechercher par email ```bash ./bin/search-email dva contact@example.com ./bin/search-email rca admin@amicale.fr ``` **Fonctionnalités :** - Déchiffre **tous** les emails pour chercher - Affiche **tous** les comptes avec cet email (système autorise les doublons) - Propose d'afficher les détails complets si 1 seul résultat ### Gestion des tunnels SSH ```bash # Afficher l'état des tunnels ./bin/_ssh-tunnel.sh status # Ouvrir un tunnel manuellement ./bin/_ssh-tunnel.sh open dva ./bin/_ssh-tunnel.sh open rca # Fermer un tunnel ./bin/_ssh-tunnel.sh close dva # Fermer tous les tunnels ./bin/_ssh-tunnel.sh close-all ``` ## 📁 Structure du projet ``` bao/ ├── README.md # Cette documentation ├── .gitignore # Exclut config/.env ├── deploy-bao.sh # Script de déploiement vers containers │ ├── config/ │ ├── .env # Configuration locale (gitignored) │ ├── .env.example # Template pour utilisation PC (tunnels SSH) │ ├── .env.container # Template pour utilisation containers (connexion directe) │ └── database.php # Classe DatabaseConfig │ ├── lib/ │ ├── CryptoService.php # Chiffrement/déchiffrement AES-256-CBC │ ├── DatabaseConnection.php # Connexion PDO aux bases │ └── helpers.php # Fonctions utilitaires (affichage, couleurs) │ └── bin/ ├── bao # Script principal (menu interactif) ├── search-user # Rechercher un utilisateur ├── decrypt-user # Décrypter un utilisateur ├── reset-password # Réinitialiser un mot de passe ├── search-email # Rechercher par email ├── list-users # Lister les utilisateurs ├── search-entite # Rechercher une entité (interactif) ├── decrypt-entite # Décrypter une entité ├── list-entites # Lister les entités ├── list-operations # Lister les opérations ├── list-sectors # Lister les secteurs d'une opération └── _ssh-tunnel.sh # Helper gestion tunnels SSH ``` ## 🔐 Sécurité ### Chiffrement L'API utilise **deux méthodes de chiffrement AES-256-CBC** différentes : #### 1. Données "Searchable" (recherche) - **Champs** : `encrypted_user_name`, `encrypted_email` - **IV** : Fixe (16 bytes de `\0`) - **Format** : `base64(encrypted_data)` - **Usage** : Permet la recherche par égalité dans la base #### 2. Données avec IV aléatoire - **Champs** : `encrypted_name`, `encrypted_phone`, `encrypted_mobile`, `encrypted_iban`, `encrypted_bic` - **IV** : Aléatoire (16 bytes) - **Format** : `base64(IV + encrypted_data)` - **Usage** : Sécurité maximale, pas de recherche directe **Clé de chiffrement** : Base64 encodée (32 bytes) partagée avec l'API ### Données chiffrées **Utilisateurs (`users`) :** - `encrypted_user_name` → Username (searchable) - `encrypted_email` → Email (searchable) - `encrypted_name` → Nom complet (IV aléatoire) - `encrypted_phone` → Téléphone fixe (IV aléatoire) - `encrypted_mobile` → Téléphone mobile (IV aléatoire) **Entités (`entites`) :** - `encrypted_name` → Nom de l'amicale (IV aléatoire) - `encrypted_email` → Email (searchable) - `encrypted_phone` → Téléphone (IV aléatoire) - `encrypted_mobile` → Mobile (IV aléatoire) - `encrypted_iban` → Coordonnées bancaires (IV aléatoire) - `encrypted_bic` → Code BIC (IV aléatoire) ### Bonnes pratiques ✅ **Faire :** - Garder `.env` hors du versioning (déjà dans `.gitignore`) - Fermer les tunnels après usage (`Ctrl+C` ou `close-all`) - Utiliser le menu interactif pour les tâches courantes ❌ **Ne pas faire :** - Partager la clé de chiffrement (`ENCRYPTION_KEY`) - Laisser les tunnels ouverts en permanence - Exporter les données déchiffrées sans précaution ## 🛠️ Dépannage ### Erreur : "Impossible d'ouvrir le tunnel SSH" ```bash # Vérifier la connexion SSH ssh dva-geo 'echo OK' # Vérifier qu'aucun processus n'utilise le port lsof -i :3307 lsof -i :3308 lsof -i :3309 # Fermer les tunnels zombies ./bin/_ssh-tunnel.sh close-all ``` ### Erreur : "Impossible de se connecter à la base" #### Depuis le PC ```bash # Vérifier que le tunnel est actif ./bin/_ssh-tunnel.sh status # Tester manuellement la connexion au tunnel nc -zv 127.0.0.1 3307 # Pour DVA nc -zv 127.0.0.1 3308 # Pour RCA ``` #### Depuis un container ```bash # Tester la connexion directe vers maria3/maria4 mysql -h 13.23.33.4 -u dva_geo_user -p dva_geo -e "SELECT 1" ``` ### Erreur : "Échec du déchiffrement" ```bash # Vérifier la clé de chiffrement grep ENCRYPTION_KEY config/.env # Comparer avec l'API grep encryption_key ../api/src/Config/AppConfig.php ``` ### Permissions refusées sur les scripts ```bash # Rendre tous les scripts exécutables chmod +x bin/* ``` ## 📊 Exemples d'utilisation ### Cas d'usage 1 : Rechercher un utilisateur par nom ```bash ./bin/search-user rca dupont ``` Résultat : Tableau des utilisateurs contenant "dupont" (nom, prénom, username ou secteur) ### Cas d'usage 2 : Réinitialiser le mot de passe d'un utilisateur ```bash ./bin/search-user rca martin # Trouver l'ID ./bin/reset-password rca 56930 # Réinitialiser avec l'ID ``` Résultat : Nouveau mot de passe généré et affiché en clair ### Cas d'usage 3 : Trouver tous les comptes d'un email ```bash ./bin/search-email dva contact@amicale.fr ``` Résultat : Liste tous les utilisateurs avec cet email (peut être multiple) ### Cas d'usage 4 : Lister les admins d'une amicale ```bash ./bin/list-users dva --entite=5 --role=2 ``` Résultat : Tableau des administrateurs (rôle 2) de l'entité 5 ### Cas d'usage 5 : Explorer une entité (mode interactif) ```bash ./bin/search-entite rca plumeliau # Rechercher l'entité # Sélectionner n° de ligne: 1 # Choisir action: 2 (Opérations) ``` Résultat : Workflow complet pour explorer une entité et ses données liées ### Cas d'usage 6 : Vérifier les entités avec Stripe ```bash ./bin/list-entites dva --stripe ``` Résultat : Toutes les amicales ayant activé Stripe Connect ### Cas d'usage 7 : Lister les opérations d'une entité ```bash ./bin/list-operations rca --entite=662 ``` Résultat : Tableau des opérations avec stats (passages, users, secteurs) ### Cas d'usage 8 : Explorer les secteurs d'une opération ```bash ./bin/list-sectors dva --operation=123 ``` Résultat : Tableau des secteurs avec nb users/passages + stats globales ### Cas d'usage 9 : Audit complet d'un utilisateur ```bash ./bin/decrypt-user dva 123 ``` Résultat : Toutes les informations déchiffrées + métadonnées ## 🔄 Évolutions futures ### À court terme - [ ] Export CSV avec données déchiffrées - [ ] Statistiques globales par environnement - [x] ~~Recherche par nom (déchiffré)~~ ✓ Implémenté (`search-user`) - [x] ~~Réinitialisation de mots de passe~~ ✓ Implémenté (`reset-password`) ### À moyen terme - [ ] Vérification HIBP pour `reset-password` - [ ] Version Go pour performances accrues - [ ] Cache local des données déchiffrées - [ ] Interface TUI avec bibliotèque comme `gum` ### À long terme - [ ] Modification de données complètes (avec validation) - [ ] Audit trail des accès - [ ] Synchronisation inter-environnements ## 📝 Notes ### Environnement PRA ⚠️ **Attention :** L'environnement PRA n'est **pas encore créé** (base de données inexistante). Pour l'activer : 1. Créer la base `pra_geo` sur IN4/maria4 2. Migrer les données depuis RCA 3. Changer `PRA_ENABLED=true` dans `config/.env` ### Comptes multiples par email Le système Geosector **autorise plusieurs comptes avec le même email** (choix client). Le script `search-email` gère cette particularité en affichant **tous** les comptes trouvés. ## 🤝 Support Pour toute question ou amélioration : 1. Consulter le TECHBOOK de l'API : `../api/docs/TECHBOOK.md` 2. Vérifier les logs SSH : `~/.ssh/` 3. Tester la connexion directe aux containers ## 📜 Licence Usage interne - Projet Geosector © 2025