Page tree
Skip to end of metadata
Go to start of metadata

MFA:n asennus Shibboleth IdP:hen

Tässä ohjeessa suoritetaan MFA:n konfigurointi olemassa olevaan Shibboleth IdP V3 asennukseen. Shibboleth IdP V3 ympäristöön on mahdollista integroida https://github.com/Digipalvelutehdas/MPASSid-proxy projektin laajennoksia, mm. sen ns. some laajennokset. Yhtä näistä laajennoksista hyväksikäytetään tässä yhteydessä muodostamaan Open ID Connect pohjainen tunnistustapahtuma IdP:n ja MFA proxyn välillä. Tässä IdP:n roolina on toimia ns. relying partynä (rp) ja MFA proxyn roolina on toimia Open ID Connect providerinä (op). 

Valtaosa ohjeista on käytettävissä sellaisenaan mutta loppupään autentikointikonfiguraatiot ovat vain esimerkinomaisia. Jokaisen kotiorganisaation tarpeet määrittelevät lopulta autentikointikonfiguraation lopullisen muodon.

Oletusympäristö

  • Linux
  • Shibboleth IdP V3.3.0
  • Jetty 9.x
  • Java 1.8
  • npm & maven asennettu

MPASSid paketointi

MPASSid:n tarjoamat Social User  - autentikointi laajennokset paketoidaan osaksi idp.war tiedostoa.

Käännä MPASSid

MPASSId projektista käännetään sen viimeinen julkaistu versio. Tarkista versio sivulta https://github.com/Digipalvelutehdas/MPASSid-proxy/releases. Tässä ohjeessa viitataan versioon MPASSid-proxy-0.9.0.

git clone https://github.com/Digipalvelutehdas/MPASSid-proxy

cd MPASSid-proxy/

git checkout MPASSid-proxy-0.9.0

mvn package

MPASSid tiedostot

Kopioidaan  Social User - laajennoksen jar-tiedostot riippuvuuksineen hakemistoon /opt/shibboleth-idp/edit-webapp/WEB-INF/lib.

cp {{ MPASSid-proxy-polku }}/idp-authn-impl-socialuser/target/idp-authn-impl-socialuser-0.9.0.jar /opt/shibboleth-idp/edit-webapp/WEB-INF/lib/.
cp {{ MPASSid-proxy-polku }}/idp-authn-impl-socialuser/target/dependency//opt/shibboleth-idp/edit-webapp/WEB-INF/lib/.

Kopioidaan Social User - laajennoksen vuo-, konfiguraatio- ja näkymä tiedostot paikoilleen.

cp -r {{ MPASSid-proxy-polku }}/idp-authn-impl-socialuser/src/main/resources/conf /opt/shibboleth-idp/.
cp -r {{ MPASSid-proxy-polku }}/idp-authn-impl-socialuser/src/main/resources/flows /opt/shibboleth-idp/.
cp -r {{ MPASSid-proxy-polku }}/idp-authn-impl-socialuser/src/main/resources/views /opt/shibboleth-idp/.

Annotaatiot

Muokkaa idp.xml tiedostoa niin että Jetty hakee määritellyistä jar-tiedostoista annotaatio tietoa. Jos käytät jotain muuta containeria niin tee vastaavat määritykset.

/opt/shibboleth-idp/jetty-base/webapps/idp.xml

<Call name="setAttribute">
  <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
  <Arg>.*/idp-authn-impl-socialuser[^/]*\.jar$</Arg>
</Call>

Liitä MPASSid/Social User osaksi  Shibboleth IdP pakettia

Aja seuraava komento saattaksesi tekemäsi muutokset voimaan.

/opt/shibboleth-idp/bin/build.sh

Nyt Social User - laajennokset on paketoitu mukaan idp.war - tiedostoon.


Open ID Connect RP konfigurointi ja rekisteröinti

Tässä osiossa konfiguroit  Open ID Connect autentikoinnin IdP:n ja MFA proxyn välillä.

Avainten luonti

MFA proxy olettaa että IdP allekirjoittaa pyyntönsä luotetulla avaimella.  Ohessa esimerkki jonka mukaisesti voit luoda avaimen.

openssl genrsa -out /opt/shibboleth-idp/credentials/mfaclient.pem 2048
chmod 750 /opt/shibboleth-idp/credentials/mfaclient.pem
chown root:jetty /opt/shibboleth-idp/credentials/mfaclient.pem
openssl rsa -in /opt/shibboleth-idp/credentials/mfaclient.pem -outform PEM -pubout -out /opt/shibboleth-idp/credentials/mfaclientpublic.pem

.. ja muokataan JWK muotoon (https://tools.ietf.org/html/rfc7517) julkaistavaksi https protokollalla.

yum install npm
npm install -g pem-jwk
mkdir -p {{ YOUR_WEBROOT }}/keys
pem-jwk /opt/shibboleth-idp/credentials/mfaclientpublic.pem > {{ YOUR_WEBROOT }}/keys/mfaclientkeyset.jwk

Tiedosto mfaclientkeyset.jwk tulee nyt julkaista https lokaatiossa joka ilmoitetaan rekisteröinnin yhteydessä.

Rekisteröinti

Ota yhteyttä osoitteeseen haka@csc.fi rekisteröidäksesi IdP:si MFA proxyn asiakkaaksi. Prosessin seurauksena sinulla on arvot parametereille CLIENT_ID ja PROVIDER_METADATA_LOCATION. Rekisteröinnin vastapuoli saa puolestaan tietoonsa lokaation avaimellesi sekä käyttämäsi redirect URI:n joka on muotoa "https://{{ IDP_FQDN }}/idp/Authn/SocialUserOpenIdConnectEnd".

MFA-Bean konfigurointi - rekisteröinti tiedot käyttöön

Lisää JWTPrivateKey-bean. Huomaa että resource kentän arvon tulee osoittaa aiemmin luomaasi yksityiseen avaimeen.

Korvaa olemassaoleva SetOIDCInformation -bean esimerkin mukaiseksi. Huomaa kentät CLIENT_ID ja PROVIDER_METADATA_LOCATION jotka sait rekisteröinnin yhteydessä. Varmista että kenttä redirectURI osoitteena on oma IdP:si ja että osoite on sama minkä ilmoitit rekisteröitymisen yhteydessä.

Konfiguraatiossa olevat arvot uidstepupEPPN ja mobile vastaavat IdP:n resolvoimia attribuutteja (stepupEPPN konfiguroidaan myöhemmin attribute-resolver.xml tiedostoon). Oletuksena on että IdP kykenee resolvoimaan mainitut attribuutit.

/opt/shibboleth-idp/flows/authn/SocialUserOpenIDConnect/socialuseropenidconnect-authn-beans.xml

        <bean id="JWTPrivateKey"
            class="net.shibboleth.ext.spring.factory.PrivateKeyFactoryBean"
            p:resource="../../../credentials/mfaclient.pem" />
         
        <bean id="SetOIDCInformation" class="fi.okm.mpass.idp.authn.impl.SetOIDCInformation"
            p:privKey-ref="JWTPrivateKey" p:responseType="id_token">
            <property name="clientId" value="{{ CLIENT_ID }}" />
            <property name="providerMetadataLocation" value="{{ PROVIDER_METADATA_LOCATION }}" />
            <property name="redirectURI"
                value="https://{{ IDP_FQDN }}/idp/Authn/SocialUserOpenIdConnectEnd/>
            <property name="Acr">
                <list>
                    <value>https://refeds.org/profile/mfa</value>
                </list>
            </property>
            <property name="requestClaims">
                <map>
                    <entry key="sub" value="uid" />
                    <entry key="eppn" value="stepupEPPN" />
                    <entry key="mobile" value="mobile" />
                </map>
            </property>
        </bean>


MFA-vuon konfigurointi

Tässä osiossa otat Open ID Connect autentikoinnin osaksi MFA-vuota.

Tässä osiossa kuvataan hyvin yksinkertainen lähtökohtaesimerkki MFA:n suorittamiseksi. Seuraavilla konfiguraatioilla IdP tulee suorittamaan MFA:n aina sitä pyydettäessä ja ensitunnistusmenetelmänä käytetään aina perinteistä tunnus/salasana-metodia. Nyt on huomattava että organisation moninaiset tarpeet tulevat näkymään juurikin seuraavien kahden tiedoston muokkaamisena.

Itse MFA-vuo voidaan muokata suorittamaan vahvempi tunnistus ehdollisena, riippuen esimerkiksi kirjatumisen kohteena olevasta palvelusta, käyttäjän attribuuteista jne. Esimerkin tapauksessa käytetty tunnistusmenetelmä on aina https://refeds.org/profile/mfa mikä monimutkaisemmassa tapauksessa ei enää olisi ainut mahdollinen lopputulos. Tämä tulisi siinä tapauksessa ottaa huomioon myös autentikointi vuoiden esittelyssä. Haka operaattori antaa mielellään tukea organisaatio kohtaisen konfiguraation rakentamisessa.


Lisää allaolevat autentikointi voiden esittelyt  authn/SocialUserOpenIDConnect ja authn/MFA viimeisiksi autentikointi menetelmien listassa. Poista mahdolliset samannimiset olemassa olevat vuot listasta.
/opt/shibboleth-idp/conf/authn/general-authn.xml.

<!-- only to be used by mfa, not to be activated separately -->
<bean id="authn/SocialUserOpenIDConnect" parent="shibboleth.AuthenticationFlow"
    p:nonBrowserSupported="false" p:forcedAuthenticationSupported="true">
    <property name="supportedPrincipals">
        <list>
            <bean parent="shibboleth.SAML2AuthnContextClassRef"
                c:classRef="https://refeds.org/profile/mfa" />
        </list>
    </property>
</bean>
<bean id="authn/MFA" parent="shibboleth.AuthenticationFlow"
    p:passiveAuthenticationSupported="false"
    p:forcedAuthenticationSupported="true">
    <property name="supportedPrincipals">
        <list>
            <bean parent="shibboleth.SAML2AuthnContextClassRef"
                c:classRef="https://refeds.org/profile/mfa" />
        </list>
    </property>
</bean>

 

Itse MFA-vuo konfiguroidaan tiedostossa /opt/shibboleth-idp/conf/authn/mfa-authn-config.xml. Poista alkuperäinen shibboleth.authn.MFA.TransitionMap-map ja sen viittaama checkSecondFactor-bean. Muokkaa esimerkin mukaiseksi.

/opt/shibboleth-idp/conf/authn/mfa-authn-config.xml

   <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 oidc mfa flow if password authentication succeeds. -->
        <entry key="authn/Password">
            <bean parent="shibboleth.authn.MFA.Transition"
                p:nextFlowStrategy-ref="doSecondFactor" />
        </entry>
    </util:map>
    <!-- Resolves attributes and then runs oidc mfa flow. -->
    <bean id="doSecondFactor" parent="shibboleth.ContextFunctions.Scripted"
        factory-method="inlineScript" p:customObject-ref="shibboleth.AttributeResolverService">
        <constructor-arg>
            <value>
            <![CDATA[
            nextFlow = "authn/SocialUserOpenIDConnect";
            

            // Set up for an attribute lookup.
            authCtx = input.getSubcontext("net.shibboleth.idp.authn.context.AuthenticationContext");
            mfaCtx = authCtx.getSubcontext("net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext");
            

            // Attributes are resolved to pass for second factor.
            resCtx = input.getSubcontext(
            "net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext"true);

                          // Look up the username and resolve attributes
            usernameLookupStrategyClass = Java.type("net.shibboleth.idp.session.context.navigate.CanonicalUsernameLookupStrategy");
            usernameLookupStrategy = new usernameLookupStrategyClass();
            resCtx.setPrincipal(usernameLookupStrategy.apply(input));

            resCtx.getRequestedIdPAttributeNames().add("uid");
            resCtx.getRequestedIdPAttributeNames().add("stepupEPPN");
            resCtx.getRequestedIdPAttributeNames().add("mobile");
            resCtx.resolveAttributes(custom);
            

            //Pass the resolved attributes to context
            suCtx = authCtx.getSubcontext("fi.okm.mpass.idp.authn.impl.SocialUserOpenIdConnectContext"true);
            suCtx.setResolvedIdPAttributes(resCtx.getResolvedIdPAttributes());
            input.removeSubcontext(resCtx);
            nextFlow; // pass control to oidc flow
            ]]>
         </value>
   </constructor-arg>
</bean>

stepupEPPN

MFA-vuo resolvoi stepupEPPN nimisen attribuutin. Tämä attribuutti pitää määritellä vielä /opt/shibboleth-idp/conf/attribute-resolver.xml tiedostoon. Tarve erilliselle attribuutille tulee siitä että haluamme käsitellä eppn:ää  skoopittomana attribuuttina.
/opt/shibboleth-idp/conf/attribute-resolver.xml

<resolver:AttributeDefinition xsi:type="ad:Simple"
    id="stepupEPPN" sourceAttributeID="eduPersonPrincipalName">
    <resolver:Dependency ref="myLDAP" />
</resolver:AttributeDefinition>

Huomaa myLDAP riippuvuus sekä nimiavaruuksien käyttö/käyttämättömyys.

Aktivoidaan MFA-vuo

Otetaan MFA-vuo käyttöön yhtenä mahdollisena autentikointivuona. Esimerkissä on MFA aktivoitu Passwordin lisäksi.
 /opt/shibboleth-idp/conf/idp.properties

 idp.authn.flows= Password|MFA

Uudelleenkäynnistä Shibboleth IdP

Käynnistä Shibboleth IdP uudelleen muutosten voimaan saattamiseksi.