ESUP-OTP

Arborescence des pages

Vous regardez une version antérieure (v. /wiki/spaces/esupotp/pages/1549008900/FAQ) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 7) afficher la version suivante »

Comment permettre aux utilisateurs de réinitialiser leur deuxième facteur de manière autonome en cas d’impossibilité de l’utiliser (vol ou perte de l’appareil servant à récupérer le code OTP, par exemple) ?

La gestion de ce type de situation est actuellement laissée à l’appréciation de chaque établissement, car les procédures de réinitialisation dépendent fortement de leur organisation interne et de leur PSSI.

Less approches possibles consistent à

A - Activer les codes de secours 

  • Activer la méthode bypass et inviter les utilisateurs à générer un ou plusieurs (à paramétrable) codes de secours qui leur permettront de réinitialiser leurs facteurs d'authentification

→ l'inconvénient principal, c'est que l'utilisateur peut ne pas avoir généré son code de secours ou ne l'aura pas avec lui le jour où il en a besoin

B - Activer la méthode mail

  • les utilisateurs pourront recevoir un code OTP par mail

→ avantage : pratique pour l'utilisateur final

→ inconvénient : dépendant d'un mail perso. Si l'utilisateur se fait usurper son mail perso, le 2nd facteur est compromis

C - FranceConnect (délégation tiers de confiance)

  • autoriser les utilisateurs à accéder au manager via un son compte FranceConnect
  • on peut rehausser le niveau en n'acceptant que les authentifications FranceConnect avec mfa

→ Limite : tous les utilisateurs n'ont pas de compte FranceConnect (mineur, étudiant étranger...)

D - Authentification NFC (carte multi-service étudiant / professionnel)

  • activer l'authentification NFC pour tout utilisateur ayant activé la MFA
  • l'utilisateur peut s'authentifier en badgeant avec sa carte multiservice sur l'application mobile Esup Auth

→ l'utilisateur doit être muni d'un dispositif avec lecteur NFC

Comment générer un code OTP pour un utilisateur via l'API ?

1. Appeler PUT /protected/users/:uid/methods/bypass/activate pour activer la méthode,

2. Puis POST /protected/users/:uid/methods/bypass/secret?codes_number=1 pour générer un code à usage unique.

PS : pour les méthodes /protected , bien mettre l'api_password dans le header headers.Authorization = 'Bearer ' + api_password; 

Comment proposer dans esup-otp-cas le MFA uniquement à ceux qui ont au moins une méthode de MFA d'activée ?

Différentes configurations permettent de déclencher ou non le MFA dans CAS.

Il est par exemple possible de conditionner le déclenchement du MFA dans CAS en utilisant un script Groovy, configuré dans le fichier cas.properties :

cas.authn.mfa.groovy-script.location=file:/etc/cas/config/mfaGroovyTrigger.groovy

Un tel script doit retourner l'ID du mfa à déclencher par CAS, ou null si le MFA ne doit pas être déclenché.

Dans esup-otp–cas, l'ID définit pour esup-otp est "mfa-esupotp".

Le script peut permettre de décider dynamiquement, pour chaque utilisateur, chaque service consommé, si le MFA doit être activé.

Il peut s’appuyer ainsi sur :

  • les attributs récupérés (LDAP) ;

  • le nom/identifiant du service accédé ;
  • des appels à des API distantes ;

  • ou encore, les services/librairies internes à CAS, y compris ceux issus du module esup-otp-cas.

Voici un exemple concret de script Groovy qui interroge le service esupOtpService pour vérifier si l’utilisateur dispose d’au moins une méthode d’authentification forte activée dans esup-otp et qui déclenche la MFA uniquement si c'est le cas :

import java.util.*

class SampleGroovyEventResolver {
    def String run(service, registeredService, authentication, httpRequest, logger, ... args) {
        def ctx = org.apereo.cas.util.spring.ApplicationContextProvider.getApplicationContext()
        def esupOtpService = ctx.getBean("esupOtpService")
        def esupOtpUserInfos = esupOtpService.getUserInfos(authentication.principal.id)
        def esupOtpMethods = esupOtpUserInfos.get("user").get("methods").toMap().values()
        def oneMfaMethodIsActive = esupOtpMethods.stream().anyMatch { method ->
            method instanceof Map && method.get("active")
        }
        return oneMfaMethodIsActive ? "mfa-esupotp" : null
    }
}

Comment inciter l'activation du MFA via esup-otp-cas lors de l'authentification CAS ?

Il est possible d’afficher un message d’interruption pendant l’authentification CAS, afin de sensibiliser ou inciter l’utilisateur à activer l’authentification multifacteur (MFA) via esup-otp-cas.

Ce mécanisme d’interrupt peut notamment être piloté à l’aide d’un script Groovy. Il suffit de spécifier le chemin du script dans le fichier cas.properties :

cas.interrupt.groovy.location=file:/etc/cas/config/interrupt.groovy

Ce script est exécuté après l’authentification, mais avant la redirection finale vers le service cible.

Il peut afficher un message personnalisé, accompagné de liens, et peut également bloquer ou non la suite du processus (en empêchant éventuellement l’établissement d’une session SSO).

Le script peut s’appuyer sur :

  • les attributs récupérés (LDAP) ;

  • le nom/identifiant du service accédé ;
  • des appels à des API distantes ;

  • ou encore, les services/librairies internes à CAS, y compris ceux issus du module esup-otp-cas.

Voici un exemple de script Groovy qui utilise esupOtpService pour détecter si l’utilisateur n’a activé aucune méthode de MFA, et lui propose alors un message d’incitation avec un lien vers l’interface d’activation :


import java.util.*
import org.apereo.cas.interrupt.InterruptResponse

def run(principal, attributes, service, registeredService, requestContext, logger, ... args) {
    def ctx = org.apereo.cas.util.spring.ApplicationContextProvider.getApplicationContext()
    def esupOtpService = ctx.getBean("esupOtpService")
    def esupOtpUserInfos = esupOtpService.getUserInfos(principal.id)
    def esupOtpMethods = esupOtpUserInfos.get("user").get("methods").toMap().values()
    def oneMfaMethodIsActive = esupOtpMethods.stream().anyMatch { method ->
        method instanceof Map && method.get("active")
    }
    if (!oneMfaMethodIsActive) {
        def message = "Vous n'avez pas encore activé votre authentification renforcée avec ESUP-OTP, il serait souhaitable de le faire."
        def links = ["Accéder à ESUP-OTP pour activer l'authentification renforcée" : "https://esup-otp-manager.univ-ville.fr/preferences"]
        def block = false       // L'utilisateur peut continuer sans activer le MFA
        def ssoEnabled = false  // On n’établit pas de session SSO tant qu’il n’a pas vu ce message
        return new InterruptResponse(message, links, block, ssoEnabled)
    }
    return null
}

✅ Ce que fait ce script :

  • Il interroge le service esupOtpService pour connaître les méthodes MFA activées de l’utilisateur.

  • Si aucune méthode n’est active :

    • Il affiche un message incitant à activer le MFA ;

    • Il fournit un lien vers l’interface de gestion des préférences MFA ;

    • Il désactive le SSO (ssoEnabled = false) pour forcer l’affichage de ce message à chaque authentification tant que le MFA n’est pas activé.

  • Si au moins une méthode est active, aucun message n’est affiché.

💡 Cette approche est non bloquante mais pédagogique, et permet de faire évoluer progressivement la population vers l’activation du MFA.



  • Aucune étiquette