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. 12) 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 aura 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 son compte FranceConnect
  • on peut rehausser le niveau en n'acceptant que les authentifications FranceConnect avec mfa ou avec un niveau minimum eidas2 

→ Limite : tous les utilisateurs ne peuvent pas avoir de compte FranceConnect (étranger avec un séjour de moins de 5 ans...)

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

  • 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 Apereo CAS.

Il est par exemple possible de conditionner le déclenchement du MFA dans Apereo 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 Apereo 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 à Apereo 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 && !service.id.startsWith("https://esup-otp-manager.example.org/") {
        def message = "Vous n'avez pas encore activé votre authentification renforcée avec ESUP-OTP, il serait souhaitable de le faire."
        def links = ["Application ESUP-OTP" : "https://esup-otp-manager.example.org/preferences"]
        def block = false
        def ssoEnabled = false
        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 et que le service désiré n'est pas esup-otp-manager  :

    • il affiche un message incitant à activer le MFA ; ce message est affiché dès la première authentification (TGT), mais aussi à chaque authentification sur chaque service (ST), ce grâce au ssoEnabled valué à false.

    • il fournit un lien vers esup-otp-manager ;

    • tout en lui permettant tout de même d'accéder au service demandé, ce grâce au block valué à false.

  • 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