# ANSSI security guidelines

## Presentation

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