45
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
# 01 — Inscriptions d'application Entra et groupes AD
|
||||
|
||||
Deux inscriptions d'application (App Registrations), toutes deux **mono-tenant** (CABM) :
|
||||
|
||||
| Inscription | Rôle | Variables alimentées |
|
||||
| --- | --- | --- |
|
||||
| CABM Signatures - Add-in | Jeton NAA de l'add-in, audience de l'API | `ADDIN_CLIENT_ID`, `API_SCOPE` (add-in), `ADDIN_API_AUDIENCES` (backend) |
|
||||
| CABM Signatures - Back-office | SSO du back-office et du portail, synchro Graph | `GRAPH_CLIENT_ID`, `GRAPH_CLIENT_SECRET` |
|
||||
|
||||
L'ID du tenant (`ENTRA_TENANT_ID`) se lit dans Entra > Vue d'ensemble.
|
||||
|
||||
---
|
||||
|
||||
## 1. Inscription « CABM Signatures - Add-in »
|
||||
|
||||
Entra admin center > Applications > Inscriptions d'applications > Nouvelle inscription.
|
||||
|
||||
1. **Nom** : `CABM Signatures - Add-in` — **Types de comptes** : comptes de cet annuaire uniquement.
|
||||
2. **Authentification** > Ajouter une plateforme > **Application monopage (SPA)**, URI de redirection :
|
||||
- `brk-multihub://signature.beziers-mediterranee.fr` (obligatoire pour NAA)
|
||||
- `https://signature.beziers-mediterranee.fr/addin/taskpane.html`
|
||||
3. **Exposer une API** :
|
||||
- URI d'ID d'application : `api://signature.beziers-mediterranee.fr/<ID client de l'add-in>`
|
||||
(le domaine doit être un domaine vérifié du tenant : c'est le cas de beziers-mediterranee.fr).
|
||||
- Ajouter une étendue : nom `access_as_user`, consentement « Administrateurs et utilisateurs »,
|
||||
libellé « Obtenir sa signature email ».
|
||||
4. **Manifeste** (éditeur JSON de l'inscription) : `"requestedAccessTokenVersion": 2`
|
||||
(propriété `api.requestedAccessTokenVersion`, ou `accessTokenAcceptedVersion` selon l'affichage).
|
||||
5. **Autorisations de l'API** > Ajouter > Mes API > CABM Signatures - Add-in > déléguée `access_as_user`.
|
||||
Conserver Microsoft Graph `User.Read` (déléguée).
|
||||
Puis **Accorder le consentement administrateur pour CABM** : c'est ce qui permet au jeton d'être
|
||||
obtenu silencieusement dans l'événement, sans fenêtre.
|
||||
|
||||
Reporter :
|
||||
- `addin/.env` : `ENTRA_TENANT_ID`, `ADDIN_CLIENT_ID`, `API_SCOPE=api://signature.beziers-mediterranee.fr/<ID client>/access_as_user`
|
||||
- `backend/.env` : `ADDIN_CLIENT_ID`, `ADDIN_API_AUDIENCES=<ID client>,api://signature.beziers-mediterranee.fr/<ID client>`
|
||||
|
||||
## 2. Inscription « CABM Signatures - Back-office »
|
||||
|
||||
1. **Nom** : `CABM Signatures - Back-office` — mono-tenant.
|
||||
2. **Authentification** > plateforme **Web**, URI de redirection :
|
||||
- `https://signature.beziers-mediterranee.fr/auth/callback`
|
||||
- (dev Laragon) `https://addinoutlook.test/auth/callback`
|
||||
3. **Certificats et secrets** > Nouveau secret client, durée 24 mois → `GRAPH_CLIENT_SECRET`.
|
||||
Créer un rappel GLPI deux mois avant l'expiration.
|
||||
4. **Autorisations de l'API** (Microsoft Graph) :
|
||||
- **Application** : `User.Read.All`, `GroupMember.Read.All`
|
||||
- **Déléguées** : `openid`, `profile`, `email`, `User.Read`
|
||||
- **Accorder le consentement administrateur**.
|
||||
5. Entra > Applications d'entreprise > CABM Signatures - Back-office :
|
||||
- « Affectation requise » : **Non** (tous les agents accèdent au portail `/me`) ;
|
||||
- Accès conditionnel : inclure cette application dans une stratégie **MFA**.
|
||||
|
||||
Reporter dans `backend/.env` : `GRAPH_CLIENT_ID`, `GRAPH_CLIENT_SECRET`, `ENTRA_TENANT_ID`.
|
||||
|
||||
## 3. Groupes AD (synchronisés par Entra Connect)
|
||||
|
||||
Seuls les groupes dont le nom commence par `signature_` sont lus par l'application.
|
||||
Vérifier qu'ils sont dans une OU incluse dans le périmètre Entra Connect.
|
||||
|
||||
| Groupe | Usage |
|
||||
| --- | --- |
|
||||
| `signature_mail_agents`, `signature_mail_directeurs`, … | Affectation des templates (priorité réglée dans le back-office) |
|
||||
| `signature_role_superadmin` | Rôle super-admin (paramètres, rôles, champs modifiables) |
|
||||
| `signature_role_admin` | Rôle administrateur (templates, affectations, publication) |
|
||||
| `signature_role_editeur` | Rôle éditeur (service communication : templates et campagnes sans publication) |
|
||||
| `signature_pilote` (optionnel) | Ciblage du déploiement de l'add-in pendant les vagues |
|
||||
|
||||
Les groupes imbriqués sont pris en compte (appartenance transitive).
|
||||
Le rôle est recalculé à chaque connexion au back-office.
|
||||
|
||||
## 4. Déploiement de l'add-in (Integrated Apps)
|
||||
|
||||
Un add-in à activation automatique **ne se déclenche que s'il est déployé par un administrateur**.
|
||||
|
||||
1. Centre d'administration Microsoft 365 > Paramètres > **Applications intégrées** > Charger des applications personnalisées.
|
||||
2. Type : **Complément Office**, fichier `manifest.xml` produit par `npm run build` (dossier `addin/dist`).
|
||||
3. Affecter : groupe `signature_pilote` pour le lot 1, puis élargir vague par vague.
|
||||
4. Propagation : jusqu'à 24 h, parfois plus. Pour la vague concernée, retirer SignITC dans la même opération.
|
||||
|
||||
Pour un test individuel avant déploiement : Outlook web > Paramètres > Compléments > Mes compléments >
|
||||
Ajouter un complément personnalisé > À partir d'un fichier.
|
||||
@@ -0,0 +1,100 @@
|
||||
# 02 — Déploiement sur le serveur Debian DMZ
|
||||
|
||||
Cible : serveur Debian 13 existant en DMZ, déjà équipé de Docker et hébergeant d'autres applications.
|
||||
La stack « signature » est isolée : projet Compose `signature`, conteneurs `signature_*`, réseau `signature_net`,
|
||||
volumes dédiés, ports choisis parmi les ports libres. Elle ne touche à aucune autre application.
|
||||
|
||||
```
|
||||
Internet ──443──► Stormshield (NAT) ──► serveur DMZ :HTTPS_PORT ──► signature_nginx ──► signature_app (PHP-FPM)
|
||||
└► signature_db (MariaDB)
|
||||
signature_scheduler : synchro Graph toutes les 15 min + complète la nuit
|
||||
```
|
||||
|
||||
## 1. Pousser le projet dans le dépôt Git interne (poste de dev)
|
||||
|
||||
Le dépôt doit contenir le back-office **complet** (après `install-backend.ps1`), sans `vendor`, sans `.env`.
|
||||
|
||||
```powershell
|
||||
cd C:\laragon\www\AddinOutlook
|
||||
git init -b main
|
||||
git add .
|
||||
git status # vérifier : ni backend\.env, ni addin\.env, ni vendor, ni node_modules, ni certificats
|
||||
git commit -m "Signatures CABM : lots 0 et 1"
|
||||
git remote add origin <URL du dépôt interne>
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
## 2. Prérequis réseau
|
||||
|
||||
| Élément | Valeur |
|
||||
| --- | --- |
|
||||
| DNS public | `signature.beziers-mediterranee.fr` → IP publique **dédiée** (ou IP partagée dont le 443 est libre) |
|
||||
| NAT Stormshield | IP publique:443 → serveur DMZ:`HTTPS_PORT` (proposé par le script, 443 si libre, sinon 8443…) |
|
||||
| NAT facultatif | IP publique:80 → serveur DMZ:`HTTP_PORT` (redirection vers HTTPS) |
|
||||
| Filtrage entrant | 443 depuis Internet (OWA et Outlook mobile sont utilisés hors réseau) |
|
||||
| Sortant serveur | 443 vers `login.microsoftonline.com`, `graph.microsoft.com` + Docker Hub, npm, Packagist, dépôts Debian (build) |
|
||||
| Vers le LAN | **aucun flux** |
|
||||
|
||||
Le NAT doit conserver l'IP source (pas de SNAT) : le filtrage de `/admin` repose sur l'IP du client.
|
||||
Si le Stormshield fait du SNAT, filtrer `/admin` au niveau du pare-feu.
|
||||
|
||||
## 3. Première installation (serveur)
|
||||
|
||||
```bash
|
||||
sudo git clone <URL du dépôt interne> /opt/signature
|
||||
cd /opt/signature
|
||||
# Copier le certificat wildcard (PEM chaîne complète + clé) quelque part sur le serveur, puis :
|
||||
sudo ./deploy/deploy.sh
|
||||
```
|
||||
|
||||
Le script, interactif :
|
||||
1. vérifie les prérequis et détecte les ports déjà pris (système et conteneurs existants) ;
|
||||
2. propose les ports HTTPS/HTTP de la stack et génère `deploy.env` (mot de passe MariaDB aléatoire) ;
|
||||
3. installe le certificat dans `docker/certs/` et vérifie que certificat et clé correspondent ;
|
||||
4. demande les identifiants Entra (tenant, back-office, secret masqué, add-in) ;
|
||||
5. génère `backend/.env` (production) et `addin/.env` (URL publiques) ;
|
||||
6. construit l'image (add-in compilé + back-office), démarre la stack, attend `/up` ;
|
||||
7. initialise la base (tenant, template par défaut) et lance une synchro annuaire complète ;
|
||||
8. contrôle le manifeste et l'absence d'en-tête X-Frame-Options sur `/addin`.
|
||||
|
||||
Les fichiers `deploy.env`, `backend/.env`, `addin/.env` et la clé du certificat sont en `chmod 600` et ignorés par Git.
|
||||
|
||||
Ensuite :
|
||||
- **Logo** : `sudo docker compose --env-file deploy.env cp logo-cabm.png app:/var/www/html/public/img/logo-cabm.png`
|
||||
- **Entra** : ajouter l'URI `https://signature.beziers-mediterranee.fr/auth/callback` (plateforme **Web**) à l'inscription Back-office.
|
||||
Les URI localhost de dev peuvent rester pour le poste de développement.
|
||||
- **Test externe** (4G) : `https://signature.beziers-mediterranee.fr/up` → 200, puis `/admin` depuis le LAN.
|
||||
|
||||
## 4. Pilote DSI
|
||||
|
||||
1. Créer le groupe `signature_pilote` (membres DSI) et attendre la synchro.
|
||||
2. Centre d'admin M365 > Paramètres > Applications intégrées > Charger des applications personnalisées >
|
||||
Complément Office > **Fournir le lien** `https://signature.beziers-mediterranee.fr/addin/manifest.xml`.
|
||||
3. Affecter au groupe `signature_pilote`, puis retirer SignITC pour ces mêmes utilisateurs.
|
||||
4. Propagation : jusqu'à 24 h, parfois plus.
|
||||
5. Retirer le complément chargé manuellement (localhost) dans Outlook web des testeurs, pour éviter un doublon.
|
||||
|
||||
## 5. Mise à jour
|
||||
|
||||
```bash
|
||||
cd /opt/signature && sudo ./deploy/deploy.sh
|
||||
```
|
||||
`git pull`, reconstruction, redémarrage ; migrations et caches rejoués au démarrage de `signature_app`.
|
||||
Un échec de migration n'empêche pas le conteneur de démarrer : il est signalé dans les logs.
|
||||
|
||||
Si le manifeste change (nouveaux événements, boutons), incrémenter `<Version>` dans `addin/manifest.xml`
|
||||
puis mettre à jour le complément dans Applications intégrées. Une modification de template ne demande aucune mise à jour.
|
||||
|
||||
## 6. Exploitation
|
||||
|
||||
| Besoin | Commande (dans `/opt/signature`) |
|
||||
| --- | --- |
|
||||
| Logs | `sudo docker compose --env-file deploy.env logs -f app scheduler nginx` |
|
||||
| Logs Laravel | `sudo docker compose --env-file deploy.env exec app tail -f storage/logs/laravel-$(date +%F).log` |
|
||||
| Artisan | `sudo docker compose --env-file deploy.env exec -u www-data app php artisan <commande>` |
|
||||
| Synchro manuelle | bouton du tableau de bord, ou `… exec -u www-data app php artisan signature:sync --full` |
|
||||
| Sauvegarde base | `sudo docker compose --env-file deploy.env exec -T db sh -c 'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE"' > signature-$(date +%F).sql` |
|
||||
| Supervision | LibreNMS : HTTP(S) sur `/up` et expiration du certificat |
|
||||
| Renouvellement certificat | remplacer les fichiers de `docker/certs/` puis `sudo docker compose --env-file deploy.env restart nginx` |
|
||||
|
||||
Sauvegarde : la VM est sauvegardée par Veeam ; ajouter le dump quotidien ci-dessus en tâche cron pour une restauration fine.
|
||||
Reference in New Issue
Block a user