ESUP-OTP

Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

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.

Les approche possible consiste Less approches possibles consistent à

A - Activer les codes de secours 

...

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 :

Bloc de code
languagejava
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 :

Bloc de code
languagejava
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 :

Bloc de code
languagetext
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 :


Bloc de code
languagejava
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.