# Sécurité

## Frontière des secrets

| Secret                  | Lu par                | Jamais                   |
| ----------------------- | --------------------- | ------------------------ |
| `MATOMO_TOKEN_AUTH`     | `serverConfigFromEnv` | Variable `NEXT_PUBLIC_*` |
| `RYBBIT_API_KEY`        | Fabrique serveur      | Bundle navigateur        |
| `OPENOBSERVE_AUTH`      | Collecteur OTLP       | Application              |
| Mots de passe des bases | Compose uniquement    | Dépôt                    |

`browserConfigFromEnv` ne lit **que** des variables `NEXT_PUBLIC_*` : la fonction n'a aucun chemin
d'accès aux jetons d'écriture, même par erreur de câblage.

Vérification après chaque build :

```bash
grep -rl "MATOMO_TOKEN_AUTH\|RYBBIT_API_KEY\|rb_org_" .next-saclay/static/ && echo "FUITE" || echo "aucun secret dans le bundle"
```

## L'application n'écrit pas dans le stockage

Le collecteur OTLP est le seul composant à porter les identifiants OpenObserve. L'application ne
connaît que l'adresse du collecteur. Compromettre le conteneur applicatif ne donne donc pas accès
au stockage de télémétrie.

## Exposition réseau

Tous les ports du POC sont liés à `127.0.0.1`. Pour un déploiement distant, seuls les endpoints
d'ingestion doivent être publics ; les bases et les interfaces d'administration restent privées.

**`/api/send` d'Umami n'exige aucune authentification.** Exposé tel quel, il permet à quiconque
d'injecter des événements. Une limitation de débit au niveau du proxy est indispensable avant toute
exposition publique.

## Caviardage, deux niveaux

1. **Application** : schéma d'événement (vocabulaire fermé), puis caviardage des clés interdites et
   des motifs sensibles.
2. **Collecteur** : suppression de `http.request.header.authorization`, `cookie`, `set-cookie`,
   `user.email` et `enduser.id` avant écriture.

Le second niveau existe parce que le premier peut être contourné par une instrumentation
automatique qui ajouterait des attributs sans passer par la façade.

## Identifiants par défaut

Ceux du POC (`Complexpass#123`, `umami`, `MatomoLocal!2026`, `RybbitLocal!2026`) sont des valeurs de
poste local. Ils figurent dans `.env.example`, jamais dans un `.env` versionné. Ils doivent être
remplacés hors de ce poste.

## Ce qui n'est pas fait

- Pas de TLS entre l'application et le collecteur.
- Pas de limitation de débit sur les endpoints d'ingestion.
- Pas d'analyse de vulnérabilité des images (Trivy) ni de détection de secrets (Gitleaks) en CI.
- Conteneurs non durcis : pas d'utilisateur non privilégié imposé, pas de système de fichiers en
  lecture seule.
