# Sécurité FilyX

## Autorisation Kick

Le coffre `apps/bot-engine/runtime/secure/fiIyx-oauth.enc` utilise AES-256-GCM avec :

- une clé de 32 octets fournie par `FILYX_OAUTH_MASTER_KEY` ;
- un nonce aléatoire ;
- une balise d'authentification ;
- une écriture atomique ;
- un format versionné.

Le coffre contient uniquement les jetons OAuth officiels du compte `fiIyx`. La
clé n’y est jamais stockée et les jetons ne sont envoyés ni au panel ni aux logs.
Le renouvellement du jeton est automatique et atomique.

## Webhooks Kick

Le site vérifie `Kick-Event-Signature` avec la clé publique RSA Kick sur le
message canonique `message_id.timestamp.corps_brut`. L’identifiant unique assure
l’idempotence ; seuls les événements d’une chaîne connue entrent dans la file.

## API worker

Chaque requête machine-à-machine signe :

```text
METHOD
/chemin/sans-query-string
timestamp
nonce
sha256(corps)
```

La signature HMAC-SHA256, le timestamp à cinq minutes et le nonce unique empêchent l'usurpation et le rejeu.

## Comptes web

- Argon2id lorsqu'il est disponible ;
- session régénérée après connexion ;
- cookies `HttpOnly`, `Secure` en production et `SameSite=Lax` ;
- CSRF sur les mutations navigateur ;
- journal de connexion avec IP et user-agent hachés ;
- révocation des sessions après réinitialisation ;
- Google limité à `openid email profile`.

## Données sensibles interdites dans les logs

- jetons OAuth Kick et en-têtes d’autorisation ;
- mots de passe et secrets 2FA ;
- clé principale ;
- secret Google ou worker ;
- token OBS complet.

## Points à valider avant production

1. Tester l’adaptateur officiel Kick sur une chaîne dédiée.
2. Activer le webhook public dans Kick Developers.
3. Activer HTTPS et `SESSION_SECURE=true`.
4. Régler les durées RGPD.
5. Configurer les sauvegardes chiffrées.
6. Faire une revue de sécurité externe avant ouverture commerciale.

## Droits sur les données

- `GET /api/account/export` produit un fichier JSON sans mot de passe, secret, cookie ni empreinte de session.
- `POST /api/account/delete` exige une session, un jeton CSRF et la confirmation `SUPPRIMER`.
- La suppression révoque les sessions et droits, désactive les chaînes détenues et anonymise l'identité.
- Les écritures historiques nécessaires à la comptabilité et à l'audit restent référencées par un identifiant interne.

La durée de conservation des journaux, commandes et pièces comptables doit être décidée avec le responsable
de traitement avant la mise en production.
