Obsah

MFA

Dokument je zatím stále v přípravě. V žádném případě toto nastavení neprovádějte na produkčním IdP!

Tento dokument popisuje zprovoznění dvoufaktorového ověřování na straně Shibboleth IdP a zavedení podpory pro profil REFEDS MFA. Jsou zde popsány konfigurační kroky na straně IdP a také je zde ukázka pro rozšíření LDAP schématu o atribut, do kterého je nutné uložit „seedu“ pro TOTP.

Vše, co je zde sepsáno, vychází z následujících oficiálních dokumentů:

Modul MFA

Jako první krok je zapnutí modulu MFA v IdP:

cd /opt/shibboleth-idp
./bin/module.sh -e idp.authn.MFA

Nyní je potřeba provést úpravy v konfiguračním souboru pro autentizaci, tedy v conf/authn/authn.properties:

vim conf/authn/authn.properties

Nastavení toku (idp.authn.flows) na MFA a přidání podpory pro profil REFEDS MFA:

idp.authn.flows = MFA
 
idp.authn.MFA.supportedPrincipals = \
    saml2/https://refeds.org/profile/mfa, \
    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
    saml1/urn:oasis:names:tc:SAML:1.0:am:password
 
idp.authn.TOTP.supportedPrincipals = \
    saml2/https://refeds.org/profile/mfa, \
    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken

Dále upravíme v konfiguračním souboru conf/authn/mfa-authn-config.xml MFA:

vim conf/authn/mfa-authn-config.xml

Níže uvedený kód způsobí, že uživatel je při autentizaci vyzván k zadání svého uživatelského jména a hesla. Pokud jsou zadané údaje správné a služba vyžaduje dvoufaktorové ověření, je uživateli předložena žádost o ověření druhého faktoru. Pokud služba doufaktorové ověření nepotřebuje, bude uživatel po zadání správného jména a hesla přesměrován na službu, aniž by musel řešit druhý faktor:

<util:map id="shibboleth.authn.MFA.TransitionMap">
    <!-- First rule runs the Password login flow. -->
    <entry key="">
        <bean parent="shibboleth.authn.MFA.Transition" p:nextFlow="authn/Password" />
    </entry>
 
    <!--
    Second rule runs a function if Password succeeds, to determine whether an additional
    factor is required.
    -->
    <entry key="authn/Password">
        <bean parent="shibboleth.authn.MFA.Transition" p:nextFlowStrategy-ref="checkSecondFactor" />
    </entry>
</util:map>
 
<!-- Example script to see if second factor is required. -->
<bean id="checkSecondFactor" parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript">
    <constructor-arg>
        <value>
        <![CDATA[
            nextFlow = "authn/TOTP";
 
            // Check if second factor is necessary for request to be satisfied.
            authCtx = input.getSubcontext("net.shibboleth.idp.authn.context.AuthenticationContext");
            mfaCtx = authCtx.getSubcontext("net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext");
            if (mfaCtx.isAcceptable()) {
                nextFlow = null;
            }
 
            nextFlow;   // pass control to second factor or end with the first
        ]]>
        </value>
    </constructor-arg>
</bean>

Rozšíření TOTP

Druhý krok na IdP je zapnutí rozšíření TOTP, které je součástí projektu Shibboleth IdP.

cd /opt/shibboleth-idp
./bin/plugin.sh -I net.shibboleth.idp.plugin.authn.totp

Dále je potřeba definovat, ve kterém atributu je v LDAPu uložen tzv. „TOTP seed“, na jehož základě se počítá časově omezený jednorázový kód.

vim conf/attribute-resolver.xml

Atribut se může jmenovat libovolně, nicméně důrazně doporučujeme použít atribut nazvaný tokenSeeds, protože to je výchozí hodnota definovaná v Shibbolethu. Pokud se atribut jmenuje jinak, je nutná dodatečná konfigurace IdP a to považujeme za zbytečné.

<AttributeDefinition xsi:type="Simple" id="tokenSeeds">
    <InputDataConnector ref="myLDAP" attributeNames="tokenSeeds"/>
</AttributeDefinition>

Restartováním Jetty zajistíme nahrání nové konfigurace IdP:

systemctl restart jetty9

Atribut tokenSeeds v LDAP serveru

V LDAP serveru musí být dostupný výše uvedený atribut tokenSeeds, který obsahuje „seed“ pro TOTP.

Definice atributu tokenSeeds v rámci schématu:

attributeTypes: ( tokenSeeds-oid
  NAME 'tokenSeeds'
  DESC 'TOTP Seed'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
  SINGLE-VALUE
  X-ORIGIN 'CESNET'
 )

Atribut tokenSeeds definujeme ve schématu jako volitelný, proto je potřeba umístit ho do „MAY“:

objectClasses: ( tenOrgPerson-oid
   NAME 'tenOrgPerson'
   SUP top STRUCTURAL
   MAY ( aci $
         tokenSeeds $
         cesnetEmplID $
         authorisedMail $
         rfc822ForwardingMailbox $
         memberOf )
   X-ORIGIN 'cesnet.cz'
 )

Testování

Pro testování vícefaktorového ověřování na IdP je dostupná služba na serveru mfa.eduid.cz.

Vyžadování MFA na službě

Dokumentace k vyžadování MFA na webu projektu Shibboleth.