Autenticar aplicacions de correu web via Shibboleth

Objectiu:

Aplicacions de correu web com ara RoundCube o Horde autentiquen els usuaris mitjançant una pàgina típica però, després, utilitzen les credencials subministrades constantment amb els servidors IMAP, CardDAV i/o CalDAV. Si autentiquem l’usuari mitjançant Shibboleth en aquestes aplicacions no es disposarà de la contrasenya per accedir als serveis dels que depenen.

El que aquesta entrada explica és com subministrar la contrasenya com a atribut entre l’idp i l’sp. És important notar que aquesta configuració només s’hauria d’aplicar en entorns controlats i mai enviar la contrasenya a proveïdors de serveis fora de l’organització. Precisament la gràcia de Shibboleth és abstreure la capa d’autenticació de les aplicacions web, si tornem a enviar la contrasenya a aquestes aplicacions no estem aconseguint res. El cas de les aplicacions de correu web és un cas molt particular i, com a tal, s’ha de tractar.

Nota prèvia:

Com aquest procediment es considera altament perillós, l’idp “oblida”, per defecte, les credencials dels usuaris tan aviat com aquests les entren. Per tant, primer s’ha de canviar aquest procediment tal i com es descriu en l’entrada de configuració de l’idp. Concretament s’ha de posar a true el paràmetre retainSubjectsPrivateCredentials a l’arxiu /usr/local/src/shibboleth-2.4/src/main/webapp/WEB-INF/web.xml i reinstal·lar l’idp.

Procediment:

El procediment és força simple. Només s’ha d’afegir un nou atribut a subministrar des de l’idp. Així doncs, a l’arxiu /opt/shibboleth/conf/attribute-resolver.xml afegirem el següent atribut:

...
    <resolver:AttributeDefinition id="password" xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad">
       <resolver:AttributeEncoder xsi:type="SAML1String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:mace:dir:attribute-def:password" />
       <resolver:AttributeEncoder xsi:type="SAML2String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:1.3.6.1.4.1.1466.115.121.1.40" friendlyName="password" />
       <Script>
               <![CDATA[
                  importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider);
                  importPackage(Packages.edu.internet2.middleware.shibboleth.idp.authn.provider);

                  password = new BasicAttribute("password");
                  userSubject = requestContext.getUserSession().getSubject();

                  i = userSubject.getPrivateCredentials(edu.internet2.middleware.shibboleth.idp.authn.provider.UsernamePasswordCredential).iterator();

                  while (i.hasNext()) {
                       password.getValues().add(i.next().getPassword());
                  }
               ]]>
       </Script>
    </resolver:AttributeDefinition>
...

A continuació, a l’arxiu /opt/shibboleth/conf/attribute-filter.xml afegirem aquest atribut als serveis als que el volguem subministrar. Aquest punt és clau. Només s’ha d’afegir a aquelles aplicacions que realment el necessitin:

...
    <afp:AttributeFilterPolicy>
        <afp:PolicyRequirementRule xsi:type="basic:AttributeRequesterString" value="https://sp.domain.org/shibboleth" />
...
        <afp:AttributeRule attributeID="password">
            <afp:PermitValueRule xsi:type="basic:ANY" />
        </afp:AttributeRule>
...
    </afp:AttributeFilterPolicy>
...

Finalment reiniciem el servei:

$ service tomcat6 restart

Configuració de l’sp:

En aquest cas l’única cosa que s’ha de fer és afegir a la configuració de l’arxiu /etc/shibboleth/attribute-map.xml la definició del nou atribut:

...
    <Attribute name="urn:mace:dir:attribute-def:password" id="password"/>
    <Attribute name="urn:oid:1.3.6.1.4.1.1466.115.121.1.40" id="password"/>
...

Finalment reiniciem el servei:

$ service shibd restart