ANSSI security guidelines

anssi-logo

Presentation

_images/anssi-recommandations-oidc-cover.png

The Agence Nationale de la Sécurité des Systèmes d’Information (ANSSI) is a French Agency for the Security of Information Systems.

They published a document to securize OpenID Connect. It contains around fifty recommandations to strengthen your OIDC service, as OpenID provider or relying party.

We describe here how to configure LemonLDAP::NG to match the majority of these recommandations. You can find the list at the end of the page (in French language, as the original document).

Directly implemented in LL::NG

A lot of recommandations are built-in features of LemonLDAP::NG, so there is nothing to configure to respect them:

  • R6 Vérifier le nom de domaine

  • R10 Systématiser l’envoi du paramètre state

  • R11 Générer aléatoirement le paramètre state

  • R13 Utiliser les cookies de session

  • R15 Générer aléatoirement le paramètre nonce

  • R17 Se protéger contre les redirections ouvertes

  • R18 Générer aléatoirement les authorization code

  • R20 Associer le code authorization code au client OIDC

  • R24 Générer aléatoirement les access token

  • R26 Vérifier l’intégrité de l’ID Token

  • R28 Vérifier les informations d’un ID Token

  • R29 Vérifier le niveau d’authentification de l’utilisateur

  • R30 Rendre inutilisables les authorization code

  • R31 Transmettre les access token par l’entête Authorization

  • R33 Restreindre la durée de validité d’un access token

  • R34 Croiser les informations du UserInfo et de l’ID Token

  • R47 Journaliser les évènements importants

Some other are not directly related to LemonLDAP::NG, but come with a correct configuration of the web server or the global infrastructure:

  • R3 Mettre en œuvre HTTPS : lié au serveur Web

  • R4 Appliquer les recommandations de sécurité relatives à TLS

  • R5 Imposer aux clients OIDC des suites cryptographiques recommandées pour les communications serveur à serveur

  • R46 Mettre en oeuvre un système de journalisation

LL::NG as OpenID Connect Provider

  • R1 Utiliser en priorité la cinématique authorization code pour les applications Web

This is the default configuration, be sure to not enable Implicit or Hybrid flows in OpenID Connect Service > Security.

  • R9 Imposer un mode de transmission des paramètres dans une demande d’authentification

You need to fix the access mode for each relying party in Options > Security > Require JWS for authorization requests

  • R12 Détecter les demandes d’authentification sans le paramètre state

Require the state parameter in Options > Security > Require "state" in authorization request

  • R16 Détecter les demandes d’authentification sans le paramètre nonce

Require the nonce parameter in Options > Security > Require "nonce" in authorization request

  • R19 Limiter la durée de vie d’un authorization code

The default value is already quite low (1 minute) but you can still change it in OpenID Connect Service > Timeouts > Authorization Codes. You can configure timeouts for other tokens too.

  • R21 Stocker les authorization code sous forme d’empreinte

  • R25 Stocker les access token sous formes d’empreintes

Enable hashed session in General Parameters > Advanced parameters > Security > Hashed session storage

  • R23 Utiliser une authentification du client OIDC adaptée

Require JWS authentication on token endpoint in Options > Security > Token endpoint authentication method You can also enforce this for userinfo endpoint.

  • R32 Ne pas écrire dans les journaux les access token

Configure the log level to info or notice (access tokens can be seen in debug level).

  • R35 Générer aléatoirement les secrets d’authentification partagés

Use a random value for client_secret (for example with command pwgen)

  • R36 Renouveler les secrets d’authentification partagés

There is no automatic renewal of client_secret, you need to plan it on your side.

  • R37 Utiliser un secret différent par client OIDC

Simple. Just be sure to have different client_secret values for each configured relying party.

  • R38 Restreindre l’accès au secret d’authentification

  • R40 Restreindre l’accès à la clé privée de signature

Quite simple. Be sure your manager is well protected, and your configuration backend too.

  • R42 Utiliser des fonctions de hachage recommandées

  • R43 Utiliser des mécanismes de signature recommandés

  • R44 Fixer l’algorithme utilisé pour le JWS

Forbid the use of HS algorithms, prefer those with public/private keys. You can configure the algorithm of JWS (ID Token, and if configured as JWT, access token and userinfo) in Options > Algorithms.

  • R48 Désactiver la découverte automatisée

Configuration metadata are available anonymously, you can disable access in OpenID Connect Service > Security > Don't display metadata

  • R49 Ne pas utiliser l’enrôlement automatisé

This is the defaut configuration, be sure to keep this disabled in OpenID Connect Service > Dynamic registration > Activation

LL::NG as OpenID Connect Relying Party

  • R8 Utiliser un JWS protégé par un HMAC

  • R8+ Utiliser un JWS protégé par une signature

  • R42 Utiliser des fonctions de hachage recommandées

  • R43 Utiliser des mécanismes de signature recommandés

  • R44 Fixer l’algorithme utilisé pour le JWS

Set method and algoroithm in Options > Protocol > Authentication method for authorization code request and Signature algorithm for authorization code authentication. Forbid the use of HS algorithms, prefer those with public/private keys.

  • R14 Systématiser l’envoi du paramètre nonce

This is the default configuration, check it in Options > Protocol > Use nonce

  • R23 Utiliser une authentification du client OIDC adaptée

Set authentication on token endpoint in Options > Protocol > Token endpoint authentication method, prefer JWS authentication method.

  • R32 Ne pas écrire dans les journaux les access token

Configure the log level to info or notice (access tokens can be seen in debug level).

  • R38 Restreindre l’accès au secret d’authentification

  • R40 Restreindre l’accès à la clé privée de signature

Quite simple. Be sure your manager is well protected, and your configuration backend too.

List of recommandations

  • R1 Utiliser en priorité la cinématique authorization code pour les applications Web

  • R2 Mettre en place une politique de sécurité

  • R3 Mettre en œuvre HTTPS

  • R4 Appliquer les recommandations de sécurité relatives à TLS

  • R5 Imposer aux clients OIDC des suites cryptographiques recommandées pour les communications serveur à serveur

  • R6 Vérifier le nom de domaine

  • R7 Utiliser le certificate pinning

  • R8 Utiliser un JWS protégé par un HMAC

  • R8+ Utiliser un JWS protégé par une signature

  • R9 Imposer un mode de transmission des paramètres dans une demande d’authentification

  • R10 Systématiser l’envoi du paramètre state

  • R11 Générer aléatoirement le paramètre state

  • R12 Détecter les demandes d’authentification sans le paramètre state

  • R13 Utiliser les cookies de session

  • R14 Systématiser l’envoi du paramètre nonce

  • R15 Générer aléatoirement le paramètre nonce

  • R16 Détecter les demandes d’authentification sans le paramètre nonce

  • R17 Se protéger contre les redirections ouvertes

  • R18 Générer aléatoirement les authorization code

  • R19 Limiter la durée de vie d’un authorization code

  • R20 Associer le code authorization code au client OIDC

  • R21 Stocker les authorization code sous forme d’empreinte

  • R22 Vérifier le paramètre state associé à la session de l’utilisateur

  • R23 Utiliser une authentification du client OIDC adaptée

  • R24 Générer aléatoirement les access token

  • R25 Stocker les access token sous formes d’empreintes

  • R26 Vérifier l’intégrité de l’ID Token

  • R27 Utiliser un secret partagé différent du client_secret pour générer le HMAC de l’ID Token

  • R28 Vérifier les informations d’un ID Token

  • R29 Vérifier le niveau d’authentification de l’utilisateur

  • R30 Rendre inutilisables les authorization code

  • R31 Transmettre les access token par l’entête Authorization

  • R32 Ne pas écrire dans les journaux les access token

  • R33 Restreindre la durée de validité d’un access token

  • R34 Croiser les informations du UserInfo et de l’ID Token

  • R35 Générer aléatoirement les secrets d’authentification partagés

  • R36 Renouveler les secrets d’authentification partagés

  • R37 Utiliser un secret différent par client OIDC

  • R38 Restreindre l’accès au secret d’authentification

  • R39 Utiliser des certificats pour authentifier les JWS

  • R40 Restreindre l’accès à la clé privée de signature

  • R41 Vérifier la révocation des certificats

  • R42 Utiliser des fonctions de hachage recommandées

  • R43 Utiliser des mécanismes de signature recommandés

  • R44 Fixer l’algorithme utilisé pour le JWS

  • R45 Sécuriser l’application Web OIDC

  • R46 Mettre en oeuvre un système de journalisation

  • R47 Journaliser les évènements importants

  • R48 Désactiver la découverte automatisée

  • R49 Ne pas utiliser l’enrôlement automatisé

  • R50 Sécuriser l’interface Web de configuration d’un client OIDC

  • R51 Vérifier l’identité des fournisseurs de service