Skip to content

Restreint local-sign-in derrière des tokens par fournisseur (DP-1855) - #1693

Open
jbfeldis wants to merge 2 commits into
developfrom
feature/dp-1855-security-restreindre-local-sign-in-sur-staging
Open

Restreint local-sign-in derrière des tokens par fournisseur (DP-1855)#1693
jbfeldis wants to merge 2 commits into
developfrom
feature/dp-1855-security-restreindre-local-sign-in-sur-staging

Conversation

@jbfeldis

Copy link
Copy Markdown
Contributor

Contexte

Réponse à l'incident DP-1848 (abus sur staging : créations en masse et tentatives
d'injection via le compte démo, entrées par local-sign-in).

Ce que fait la PR

local-sign-in est protégé par un token secret sur les environnements où des tokens
sont configurés dans les credentials (staging + sandbox).

  • Les tokens sont un dictionnaire nommé par fournisseur de données
    (local_sign_in_tokens: { dgfip: …, api_entreprise: … }) : chaque FD a le sien,
    révocable individuellement. N'importe quel token valide déverrouille.
  • Le fournisseur utilisé est journalisé ([local-sign-in] accès via le token « <fd> » — email=… ip=…), uniquement sur les environnements protégés — brique de traçabilité
    légère (prépare DP-1857).
  • Sans token valide → 404 (mimique la production, muet pour un scanner).
  • Token fourni via ?token=…, validé en temps constant (secure_compare), puis mémorisé
    dans un cookie signé (30 j) : les accès suivants n'ont plus besoin du token.
  • Le panneau « Connexion rapide » est masqué tant que l'environnement n'est pas déverrouillé.
  • Production : inchangé (la route n'existe pas).
  • Développement / test : ouverts par défaut ; protection activable en ajoutant des
    tokens aux credentials de l'environnement.

Une seule règle hors-prod : la protection s'active dès qu'au moins un token existe dans les
credentials — aucun code à toucher pour couvrir un nouvel environnement ou ajouter un FD.

Implémentation

  • LocalSignInPolicy (PORO) : décision pure + matched_provider, testé unitairement.
  • LocalSignInProtection (concern) : lecture params/cookie, pose du cookie, log, head :not_found.

Tests

  • spec/services/local_sign_in_policy_spec.rb — matrice tokens × cookie + matched_provider + cas prod.
  • spec/requests/local_sign_in_spec.rb — bout-en-bout HTTP + aller-retour cookie + log FD + panneau masqué.
  • 19 examples, rubocop clean, brakeman sans nouvelle alerte.

Protège l'endpoint local-sign-in contre les abus (incident DP-1848) sur les
environnements où des tokens sont configurés dans les credentials (staging,
sandbox) ; production inchangée (route absente), dev/test ouverts par défaut.

- Tokens = dictionnaire nommé par fournisseur de données
  (`local_sign_in_tokens`), révocables individuellement ; n'importe quel token
  valide déverrouille.
- Sans token valide : 404 (mimique la prod). Token validé en temps constant
  (secure_compare) puis mémorisé dans un cookie signé (30 j).
- Journalise le fournisseur utilisé (+ email, IP) sur les envs protégés.
- Panneau « Connexion rapide » masqué tant que l'environnement n'est pas déverrouillé.

Logique de décision isolée dans LocalSignInPolicy (PORO testé unitairement) ;
glue HTTP dans le concern LocalSignInProtection.
@linear

linear Bot commented Jul 16, 2026

Copy link
Copy Markdown

DP-1855

@jbfeldis
jbfeldis force-pushed the feature/dp-1855-security-restreindre-local-sign-in-sur-staging branch from 6ac316c to 3140be2 Compare July 17, 2026 14:28
@jbfeldis
jbfeldis marked this pull request as ready for review July 19, 2026 16:10
@skelz0r
skelz0r requested a review from JeSuisUnCaillou July 21, 2026 14:51
@skelz0r

skelz0r commented Jul 21, 2026

Copy link
Copy Markdown
Member

(@JeSuisUnCaillou je t'ai request vu que JB m'avait demandé de repasser dessus imo il devait pensé que j'étais le seul sur le pont)

@JeSuisUnCaillou JeSuisUnCaillou left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il reste un problème selon moi : Toute personne local-signed-in en tant qu'admin peut aller retirer des droits à des FD qui ont des tokens pour l'API Datapass en staging sur leurs comptes nominatif.

Plus quelques commentaires 👇

Comment thread CLAUDE.md
Comment thread CLAUDE.md
#### Protection par token (staging & sandbox)

Sur **staging** et **sandbox**, `local-sign-in` est protégé par un token secret (défense contre les abus,
cf. DP-1855). Il faut ajouter `&token=<secret>` à l’URL. Les tokens vivent dans les credentials chiffrées de

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour faciliter l'utilisation par les partenaires, faudrait mettre un input pour renseigner le token dans l'UI, plutôt que leur faire faire une manip d'url. Ou une alert avec input, quoi.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je vois ton point mais pour moi l'idée c'est d'enlever la surface d'attaque donc pour moi ils mettent à la rigueur le lien en favori. Si on garde une page alors on garde le fait qu'un robot peut tenter d'entrer

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je ne pense pas que cacher la feature aide à sécuriser quoi que ce soit. Le code est open source, un attaquant qui a envie de tenter plein de tokens peut la trouver facilement.

Ca rend juste la vie plus complexe pour les vrais utilisateurs.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Limite vois avec Eva et Natalya ce qu'elles en pensent, c'est une réflexion produit et pas technique, à ce niveau là.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants