flexway
FRENParler à un expert

Sécurité

Fermé par défaut, identité de bout en bout.

Jetons de plusieurs émetteurs, portées et rôles lus dans le contrat, clés d'API et certificats clients liés à un tenant : ce qui n'est pas déclaré ne passe pas.

11 livrées sur les 12 présentées · depuis v0.1.0

Ce que vous attendez de ce domaine

  • Authentifier applications, utilisateurs et services (OIDC, JWT, mTLS)Livré · depuis v0.1.0
  • Intermédiaire de confiance entre organisationsÉmetteurs multiples, mTLS de partenaires, échange de jeton, chiffrement par champ ; finalité d'usage déclarée : candidatEn partie · suite à dater
  • Consentement, traçabilité des accèsAudit des accès construit ; consentement décidé par le service du client, joignable par external-callEn partie · suite à dater
Toutes les attentes du marché
Identités déclarées au catalogueIdentités déclarées au catalogue
Chaque opération déclare comment on s'y identifie : jeton, clé d'API, mTLS, maillage de confiance ou public ; le catalogue les compte.Capture réelle, données de démonstration · v1.6.3

Ce que ça résout

Problème 1

Un paramètre de trop passe

Un en-tête ou un paramètre inattendu atteint le service.

Réponse de Flexway : Fermé par défaut : en-tête, paramètre, méthode ou origine non déclarés sont refusés.

Problème 2

Chaque service refait l'autorisation

Portées et rôles réimplémentés service par service, avec des écarts.

Réponse de Flexway : Portées et rôles lus dans le security et les tags du contrat, vérifiés une fois.

Problème 3

Un tenant voit les données d'un autre

Le tenant vient d'un en-tête que le client contrôle.

Réponse de Flexway : Le tenant est lu dans l'identité vérifiée ; l'isolation est testée à chaque modification.

Fonctionnement

Chaque étape est une décision lisible dans la trace et dans la console.

Votre infrastructureflexwayPasserelle API, IA et agentsChaîne de décision unifiée401identité refusée : 40140301 Origine02 Identité03 Émetteur04 Portées05 Schéma06 AuditJeton OIDCClé d'APICertificat clientServicesVotre infrastructureflexwayPasserelle API, IA et agentsChaîne de décision unifiée40101 OrigineCORS déclaratif02 IdentitéJWT, clé d'API, mTLS ou jeton opaque03 Émetteuriss et aud vérifiés04 Portéescelles du contrat05 Schémacorps et paramètres validés06 Auditdécision chaînéeJeton OIDCClé d'APICertificat clientServices

Sécurité - Schéma du domaine : qui appelle, les étapes de décision, ce qui est appelé, et le cas de refus.

  • Jeton OIDC
  • Clé d'API
  • Certificat client
  1. Origine
  2. Identité
  3. Émetteur
  4. Portées
  5. Schéma
  6. Audit
  • Services

identité refusée : 401, 403

Jeton OIDC
Un appelant muni d'un jeton OIDC : Flexway en vérifie la signature, l'émetteur, l'audience et les portées avant tout relais.
Clé d'API
Un appelant muni d'une clé d'API : la clé est une identité de premier plan, liée à des opérations et à un tenant.
Certificat client
Un appelant authentifié par certificat client (mTLS) : le certificat porte l'identité et le tenant de l'appelant.
Origine
L'origine d'un navigateur est vérifiée selon la politique CORS déclarée ; une origine non déclarée reçoit 403.
Identité
Flexway vérifie qui appelle (jeton OIDC, clé d'API ou certificat client) et lit le tenant dans l'identité ; sans identité valide : 401.
Émetteur
L'émetteur (iss) et l'audience (aud) du jeton sont vérifiés ; plusieurs émetteurs peuvent cohabiter.
Portées
Les portées et les rôles exigés viennent du contrat ; un appelant hors portée reçoit 403.
Schéma
Les paramètres et le corps sont validés contre le schéma du contrat ; une requête non conforme reçoit 422 sans atteindre l'amont.
Audit
Chaque décision d'autorisation est journalisée dans un audit chaîné et vérifiable, sans contenu de requête.
Services
Vos services REST et gRPC : ils ne reçoivent que les requêtes que Flexway a laissées passer, sous délai et coupe-circuit.
  • Ligne : un trajet
  • Correspondance : décision partagée
  • Requête
  • Refus
  • Votre infrastructure
  1. OrigineCORS déclaratif
  2. IdentitéJWT, clé d'API, mTLS ou jeton opaque
  3. Émetteuriss et aud vérifiés
  4. Portéescelles du contrat
  5. Schémacorps et paramètres validés
  6. Auditdécision chaînée

Déployer Flexway : topologies et cycle de configuration GitOps

En détail

L'essentiel de chaque sujet, avec son statut dans la version publiée ; dépliez une carte pour le texte complet.

Jetons de plusieurs émetteurs, vérifiés à chaque requête

En partie

Les JWT de plusieurs émetteurs sont vérifiés à chaque requête avec des clés en cache, et les jetons opaques par introspection RFC 7662.

  • JWKS en cache, rotation sans vague de 401
  • iss et aud vérifiés, plusieurs émetteurs
  • none et HS* refusés par défaut
Voir le détailMasquer le détail - Jetons de plusieurs émetteurs, vérifiés à chaque requête

Flexway valide les JWT avec des clés JWKS découvertes et mises en cache en arrière-plan ; la rotation des clés se fait sans redémarrage ni vague de 401. L'émetteur (iss) et l'audience (aud) sont vérifiés, et plusieurs émetteurs de fournisseurs différents cohabitent dans une même configuration (auth.issuers). Un émetteur peut accepter plusieurs audiences le temps d'un renommage. Par défaut seuls les algorithmes asymétriques sont admis : none et HS* sont refusés.

Les jetons opaques sont vérifiés par introspection RFC 7662 (opaque_tokens), avec les mêmes règles qu'un JWT et une réponse gardée en cache sans dépasser son expiration ; un fournisseur injoignable donne 503. La passerelle consomme des identités, elle n'en émet pas : l'émetteur reste celui de votre organisation.

Lier un jeton à son porteur, par certificat mTLS (RFC 8705) ou par preuve de possession DPoP (RFC 9449), est à venir ; le choix entre les deux reste ouvert.

Tous les points

  • JWKS en cache, rotation sans vague de 401
  • iss et aud vérifiés, plusieurs émetteurs
  • none et HS* refusés par défaut
  • Jetons opaques par introspection RFC 7662
  • Jetons liés au porteur : prévu

Fonctionnalités et statut

  • Validation JWT, clés JWKS en cache avec rotationLivré · v0.1.0
  • iss et aud vérifiés ; plusieurs émetteurs dans une même configurationLivré · v0.1.0
  • Introspection de jeton opaque (RFC 7662)Livré · v0.1.0
  • Jetons liés au porteur : mTLS (RFC 8705) ou DPoP (RFC 9449)Prévu
Lire dans la documentation : Brancher son fournisseur d'identité

Portées et rôles lus dans le contrat

Livré · v0.1.0

L'exigence d'authentification vient du security du contrat : aucune opération n'est servie avec une exigence plus faible que celle déclarée.

  • security du contrat = exigence appliquée
  • Portées oauth2 et openIdConnect, rôles bearer
  • 401 et 403 distincts, WWW-Authenticate
Voir le détailMasquer le détail - Portées et rôles lus dans le contrat

L'exigence d'authentification vient du security du contrat, pas d'une table à côté : portées pour oauth2 et openIdConnect, rôles pour http bearer, complétés par x-flexway-scopes. Une opération sans alternative anonyme exige une identité ; les tags ne portent aucune exigence. Aucune opération n'est servie avec une exigence plus faible que celle déclarée.

Les rôles se lisent dans la claim désignée par roles_claim ; sans elle, aucun rôle n'est satisfait. Les refus suivent la sémantique HTTP - 401 quand l'identité manque ou ne vérifie pas, 403 quand elle ne suffit pas - avec WWW-Authenticate et un corps RFC 9457. L'appartenance d'une ressource à un tenant reste vérifiée par le service, seul à connaître sa donnée.

Tous les points

  • security du contrat = exigence appliquée
  • Portées oauth2 et openIdConnect, rôles bearer
  • Pas de claim de rôles : aucun rôle satisfait
  • 401 et 403 distincts, WWW-Authenticate

Fonctionnalités et statut

  • Portées et rôles déduits du security du contratLivré · v0.1.0
  • Sémantique RFC 9110 : 400/422, 401/403, 404/405, 429/503, 502/504Livré · v0.1.0
  • En-têtes normatifs de refus : WWW-Authenticate, Allow, Retry-After, RateLimit-*Livré · v0.1.0
Lire dans la documentation : Identité et zéro confiance

Fermé par défaut, validé contre le schéma

Livré · v0.1.0

Ce qui n'est pas déclaré ne passe pas, et le corps comme les paramètres sont validés contre le schéma du contrat, avec un 422 qui nomme chaque champ.

  • En-tête, paramètre, méthode, origine non déclarés : refusés
  • 422 qui nomme chaque champ
  • RFC 9457, catalogue fermé de codes
Voir le détailMasquer le détail - Fermé par défaut, validé contre le schéma

Ce qui n'est pas déclaré ne passe pas : un en-tête non déclaré est retiré, un paramètre de requête non déclaré est refusé par son nom, une méthode non déclarée reçoit 405 avec Allow, une origine non admise est refusée. CORS se déclare comme une politique, globale ou par hôte, et les en-têtes de sécurité de réponse sont posés sur chaque réponse.

Le corps et les paramètres sont validés contre le schéma du contrat : 422 qui nomme chaque champ en erreur, avec un code repris du mot-clé JSON Schema et renommable (errors.field_codes). Le corps n'est lu que si l'opération en déclare un, dans la borne server.limits.max_body (413 au-delà). Le mode se règle par hôte ou par opération (x-flexway-validation) - full, params ou off - et la liste blanche des en-têtes et paramètres est maintenue dans tous les modes.

Aucune erreur amont n'est relayée telle quelle : les refus de la passerelle suivent RFC 9457, avec un catalogue fermé de codes et un request_id et un trace_id dans la réponse, le détail restant au journal.

Tous les points

  • En-tête, paramètre, méthode, origine non déclarés : refusés
  • 422 qui nomme chaque champ
  • Corps borné, lu seulement s'il est déclaré
  • RFC 9457, catalogue fermé de codes

Fonctionnalités et statut

  • Fermé par défaut : en-tête, paramètre, méthode ou origine non déclarés refusésLivré · v0.1.0
  • Corps et paramètres validés contre le schéma du contratLivré · v0.1.0
  • En-têtes de sécurité de réponse et CORS déclaratifLivré · v0.1.0
  • Aucune erreur amont relayée telle quelleLivré · v0.1.0
  • RFC 9457 sur toutes les routes produit ; type stable et redirigeableLivré · v0.1.0
Lire dans la documentation : Erreurs

Clés d'API et certificats clients, liés et bornés

Livré · v0.1.0

Une clé d'API ou un certificat client reste possible, encadré par construction : lié à un tenant et à des opérations, jamais transmis à l'amont.

  • Clé en en-tête seulement, empreinte SHA-256
  • Liée à un tenant, à des opérations et à une échéance
  • mTLS client vérifié ou attesté par un pair de confiance
Voir le détailMasquer le détail - Clés d'API et certificats clients, liés et bornés

Quand un appelant ne peut produire ni identité de charge de travail ni jeton OAuth, une clé d'API reste possible, encadrée par construction. Elle se présente en en-tête seulement (Authorization: ApiKey), jamais en paramètre d'URL ; un schéma apiKey placé ailleurs est refusé au chargement. Le magasin ne garde que l'empreinte SHA-256, comparée à temps constant, et la clé n'existe en clair qu'une fois, à sa création. Chaque clé est liée à un tenant, à des opérations nommées et à une expiration obligatoire.

La rotation tient deux entrées actives le temps de la bascule ; la révocation consiste à retirer l'entrée, relue par chaque réplique à son rechargement, sans redémarrage. Un préfixe stable (fwk_) permet aux analyseurs de secrets de repérer une clé publiée par erreur, et chaque appel porte l'identifiant de la clé, jamais sa valeur, dans la trace et le journal.

Un certificat client est vérifié par l'écouteur TLS (server.tls) ou attesté par le bord via x-forwarded-client-cert, cru d'un pair de confiance seulement ; il est lié à un tenant et à des opérations (auth.mtls.clients). Le contrat décide quel mécanisme satisfait quelle alternative : un jeton ne remplace jamais une clé, ni l'inverse. Ni la clé ni le certificat attesté n'atteignent l'amont, et une clé d'API reste une identité, pas une autorisation.

Tous les points

  • Clé en en-tête seulement, empreinte SHA-256
  • Liée à un tenant, à des opérations et à une échéance
  • Rotation à deux entrées, révocation au rechargement
  • mTLS client vérifié ou attesté par un pair de confiance

Fonctionnalités et statut

  • Clés d'API et mTLS client comme identités de premier planLivré · v0.1.0
Lire dans la documentation : Clés d'API

Isolation des tenants

Livré · v1.1.0

Le tenant vient de l'identité vérifiée, jamais d'un en-tête client, et les compteurs comme le cache authentifié lui sont propres, sans partage possible.

  • Tenant lu dans le jeton, en-tête client écrasé
  • Compteurs indexés par tenant
  • Cache authentifié : clé tenant et sujet, testée en continu
Voir le détailMasquer le détail - Isolation des tenants

Le tenant vient de l'identité vérifiée - la claim déclarée par l'émetteur (tenant_claim) - et jamais d'un en-tête fourni par le client, qui se forge. La passerelle l'écrit vers l'amont sous auth.tenant_header ; un en-tête de tenant entrant est écrasé. Les compteurs de débit et de quota sont indexés par tenant, sans partage possible.

Le débit se compte par appelant (émetteur et sujet, sinon l'adresse du client derrière server.trusted_proxies), jamais par pod appelant : deux utilisateurs derrière un même client serveur ont des compteurs distincts. Une réponse authentifiée n'est mise en cache qu'avec une clé de tenant et de sujet, déclarée par l'opération seule ; sans tenant et sujet, rien n'est caché.

Cette isolation du cache est tenue par un test bloquant rejoué à chaque modification, avec un contre-test qui ampute la clé du sujet. Un accès inter-tenant est traité comme une faille critique, pas comme un défaut.

Tous les points

  • Tenant lu dans le jeton, en-tête client écrasé
  • Compteurs indexés par tenant
  • Débit par appelant, pas par pod
  • Cache authentifié : clé tenant et sujet, testée en continu

Fonctionnalités et statut

  • Débit par appelant (seau à jetons)Livré · v0.1.0
  • Test d'isolation inter-tenant continu, préalable bloquantLivré · v1.1.0
  • Cache authentifié, isolé par tenant et par sujetLivré · v1.1.0
Lire dans la documentation : Isolation multi-tenant

Audit chaîné des décisions d'autorisation

Livré · v0.1.0

Chaque décision d'autorisation peut laisser une ligne d'audit chaînée à la précédente, ce qui rend une suppression ou une altération vérifiable.

  • Une ligne par décision, sujet haché
  • Chaînage seq, prev, hash vérifiable
  • Image distroless non root, signée
Voir le détailMasquer le détail - Audit chaîné des décisions d'autorisation

audit.decisions écrit une ligne authz_decision par décision - toutes, ou les refus seulement - avec l'opération, le gabarit de chemin, le sujet haché et la chaîne d'agents. Chaque ligne est chaînée à la précédente (seq, prev, hash) par réplique, ce qui rend une suppression ou une altération vérifiable. Le journal ne contient aucune donnée personnelle en clair.

Le reste de la défense en profondeur tient au produit lui-même : image distroless non root, système de fichiers en lecture seule, SBOM, signature et attestation sur le digest de l'image, aucun greffon natif ni script dans la configuration. La surface d'administration est sur un port distinct et n'accepte aucune clé. Un audit horodaté, corrélé et vérifiable vous aide à répondre aux exigences de journalisation et de cybersécurité qui s'appliquent à votre plateforme.

Tous les points

  • Une ligne par décision, sujet haché
  • Chaînage seq, prev, hash vérifiable
  • Image distroless non root, signée
  • Aucun code tiers dans le processus

Fonctionnalités et statut

  • Journal d'audit chaîné des décisions d'autorisationLivré · v0.1.0
  • SBOM, signature et attestation sans clé sur le digestLivré · v0.1.0
Lire dans la documentation : Posture de sécurité

Configuration

L'exemple identity-and-cors, tel qu'il est livré avec Flexway v1.6.3.

examples/identity-and-cors/flexway.yaml
# Two identity providers at once, the tenant from a signed claim, a browser application on its own
# origin. What each operation requires is in the contract, never here.
version: 1
contracts:
  openapi: ./openapi.yaml
upstreams:
  default:
    url: http://orders.internal:8080
auth:
  tenant_header: X-Tenant                       # written toward the upstream; a caller's value is overwritten
  issuers:
    - name: staff
      discovery: https://id.example.com/realms/staff/.well-known/openid-configuration
      audience: api
      roles_claim: realm_access.roles
    - name: customers
      discovery: https://login.example.net/.well-known/openid-configuration
      audience: api
      tenant_claim: org
policies:
  definitions:
    browser:
      type: cors
      config:
        allow_origins: ["https://app.example.com"]
        allow_credentials: true
        max_age: 10m
  chains:
    global: [browser]

Fonctionnalités

Ce qui est livré dans la version publiée v1.6.3, et ce qui vient ; une fonctionnalité n'est jamais présentée comme livrée avant sa version.

FonctionnalitéStatut
Validation JWT, clés JWKS en cache avec rotationLivré · v0.1.0
iss et aud vérifiés ; plusieurs émetteurs dans une même configurationLivré · v0.1.0
Portées et rôles déduits du security du contratLivré · v0.1.0
Fermé par défaut : en-tête, paramètre, méthode ou origine non déclarés refusésLivré · v0.1.0
Corps et paramètres validés contre le schéma du contratLivré · v0.1.0
Clés d'API et mTLS client comme identités de premier planLivré · v0.1.0
Introspection de jeton opaque (RFC 7662)Livré · v0.1.0
Journal d'audit chaîné des décisions d'autorisationLivré · v0.1.0
Jetons liés au porteur : mTLS (RFC 8705) ou DPoP (RFC 9449)Prévu
Chaîne de politiques effective par routeLivré · v0.1.0
Comptes locaux et premier admin, sans fournisseur d'identité : mot de passe initial généré, changement forcé, TOTP des admins, verrou partagéLivré · v0.1.0
Gestion des comptes locaux dans la console : invitation, rôle et tenant, réinitialisation, MFA, désactivationLivré · v0.1.0

Toutes les fonctionnalités

Les autres attentes de ce domaine

  • Coordination entre exploitations et servicesÉchange inter-organisations à finalité déclarée : candidatÀ dater
  • Coordination entre acteursÉmetteurs multiples, mTLS de partenaires, échange de jeton, chiffrement par champ ; finalité d'usage déclarée : candidatÀ dater

Les autres domaines

Parlons de votre passerelle

Flexwiz est une jeune entreprise : vous parlez directement avec la personne qui la fonde. Dites-nous ce que vous voulez faire passer par Flexway. Nous parlons de votre infrastructure et de vos exigences de souveraineté numérique.

La prise de rendez-vous en ligne arrive bientôt ; d'ici là, un e-mail suffit.