The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Shibboleth::SP - sample settings for a Shibboleth Service Provider with Apache2

DESCRIPTION

The Shibboleth System is a standards based software package for web single sign-on across or within organizational boundaries. It supports authorization and attribute exchange using the OASIS SAML protocol.

This document aims to describe how to set a service provider with Apache2.

The good way to set a shibboleth service provider is to use HTTP and HTTPS for each VirtualHost. You need to add all hostnames in the certificate with the X.509v3 subjectAltName extension.

You will find here how to use use only HTTP. This is LESS SECURE but you don't need to change your certificates for each new application.

SYNOPSIS

We will use three virtualhost :

sp.univ.fr: Service provider with https access and X509 certificates used by the shibd daemon.

www1.univ.fr: jifty web application with fastcgi

www2.univ.fr: other web application

Apache config

a virtualhost for a Jifty application with Apache2 and FastCgi.

For a Jifty application we only need to protect /shibblogin to catch shibboleth authentication.

    FastCgiServer /home/www/Uads/bin/jifty -initial-env JIFTY_COMMAND=fastcgi -processes 3
    <VirtualHost 160.160.160.57:80>
    ServerName www1.univ.fr
    
    .....
    
    # required for fastcgi
    <Location />
      AuthType shibboleth
      Require shibboleth
    </Location>
    
    # protected dir for www1 *applicationId*
    <Location /shibblogin>
      ShibRequestSetting applicationId www1
      AuthType shibboleth
      ShibRequestSetting requireSession 1
      require valid-user
    </Location>
    
    </VirtualHost>

Service provider

The shibd daemon will set environnement variables for mod_shib.

Our service provider is "sp.univ.fr". It needs X509 certificates.

In shibboleth2.xml we define applicationId an internal name and entityID a public name. entityID looks like a web url but it doesn't need to be accessible.

shibboleth2.xml

    <RequestMapper type="Native">
        <RequestMap applicationId="default">
            <Host name="sp.univ.fr">
                <Path name="testshib" authType="shibboleth" requireSession="true"/>
            </Host>
  
             <Host name="www2.univ.fr" applicationId="www2" authType="shibboleth" requireSession="true"/>
             <Host name="www1.univ.fr" applicationId="www1" authType="shibboleth" requireSession="false"/>
  
        </RequestMap>
    </RequestMapper>
    
    .....
    <SessionInitiator type="Chaining" Location="/WAYF" id="WAYF" relayState="cookie" >
       <SessionInitiator type="SAML2" acsIndex="1" template="bindingTemplate.html"/>
       <SessionInitiator type="Shib1" acsIndex="5"/>
       <SessionInitiator type="WAYF" acsIndex="5" URL="http://www.univ.fr/simplewayf/"/>
    </SessionInitiator>
    .....
    
    <ApplicationDefaults id="default" policyId="default"
        entityID="https://sp.univ.fr/shibboleth"
        homeURL="https://sp.univ.fr"
        REMOTE_USER="eppn persistent-id targeted-id"
        signing="false" encryption="false"
        >
    
    .....
        <ApplicationOverride id="www2" entityID="http://www2.univ.fr/shibboleth" REMOTE_USER="eppn persistent-id targeted-id" signing="false" encryption="false" />
        <ApplicationOverride id="www1" entityID="http://www1.univ.fr/shibboleth" REMOTE_USER="eppn persistent-id targeted-id email" signing="false" encryption="false" />
  
    </ApplicationDefaults>

Note: REMOTE_USER for www1 is override to ask email attribute

attribute-map.xml

we will use the name eppn instead of eduPersonPrincipalName

    <Attribute name="urn:mace:dir:attribute-def:eduPersonPrincipalName" id="eppn">
        <AttributeDecoder xsi:type="ScopedAttributeDecoder"/>
    </Attribute>
    <Attribute name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" id="eppn">
        <AttributeDecoder xsi:type="ScopedAttributeDecoder"/>
    </Attribute>

Federation Metadata

Each entityID can use our sp certificat. Location go back to our http application. Firefox sets a warning about changes from https to http.

define

  entityID="http://www1.univ.fr/shibboleth"
  ....
  <ds:X509SubjectName>CN=sp.univ.fr,OU=CRIUM,O=UNIVERSITE METZ,L=Metz,ST=fr,C=FR</ds:X509SubjectName>
  ....
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="http://www1.univ.fr/Shibboleth.sso/SLO/SOAP"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://www1.univ.fr/Shibboleth.sso/SLO/Redirect"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://www1.univ.fr/Shibboleth.sso/SLO/POST"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="http://www1.univ.fr/Shibboleth.sso/SLO/Artifact"/>
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="http://www1.univ.fr/Shibboleth.sso/NIM/SOAP"/>
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://www1.univ.fr/Shibboleth.sso/NIM/Redirect"/>
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://www1.univ.fr/Shibboleth.sso/NIM/POST"/>
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="http://www1.univ.fr/Shibboleth.sso/NIM/Artifact"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://www1.univ.fr/Shibboleth.sso/SAML2/POST" index="1"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="http://www1.univ.fr/Shibboleth.sso/SAML2/POST-SimpleSign" index="2"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="http://www1.univ.fr/Shibboleth.sso/SAML2/Artifact" index="3"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Location="http://www1.univ.fr/Shibboleth.sso/SAML2/ECP" index="4"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="http://www1.univ.fr/Shibboleth.sso/SAML/POST" index="5"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="http://www1.univ.fr/Shibboleth.sso/SAML/Artifact" index="6"/>
  ....

Identity provider

All Identity Provider (idp) need to allow access, for each SP entityID, to required attributes in attribute-filter.xml

  ...
   <AttributeFilterPolicy id="groupeExemple1">
  
   <PolicyRequirementRule xsi:type="basic:OR">
      <basic:Rule xsi:type="basic:AttributeRequesterRegex" regex="https://.*\.univ\.fr/.*" />
      <basic:Rule xsi:type="basic:AttributeRequesterRegex" regex="http://.*\.univ\.fr/.*" />
      <basic:Rule xsi:type="basic:AttributeRequesterString" value="https://sp.univ.fr/shibboleth" />
      <basic:Rule xsi:type="basic:AttributeRequesterString" value="https://www.something.fr/workflow"/>
   </PolicyRequirementRule>
  
    <AttributeRule attributeID="displayName">
        <PermitValueRule xsi:type="basic:ANY"/>
    </AttributeRule>
  
    <AttributeRule attributeID="eduPersonPrincipalName">
        <PermitValueRule xsi:type="basic:ANY"/>
    </AttributeRule>
  
    <AttributeRule attributeID="mail">
        <PermitValueRule xsi:type="basic:ANY"/>
    </AttributeRule>
  
    <AttributeRule attributeID="eduPersonPrimaryAffiliation">
        <PermitValueRule xsi:type="basic:ANY"/>
    </AttributeRule>
  
  </AttributeFilterPolicy>
  ...

Simple WAYF

A simple Where Are Your From with HTML::Mason

  <form method="post" action=""> 
      <select name="user_idp">
        <option value="" >Choose your organisation</option>
            <option value="urn:mace:cru.fr:fed:univ2.fr">University 2</option>
            <option value="https://idp.univ.fr/idp/shibboleth">University 1</option>
    </select>
  </form>
  
  <%args>
  $user_idp => ''
  </%args>
  
  <%init>
  use constant REDIRECT => 302;
  my %SHIB =  ( 'https://idp.univ.fr/idp/shibboleth' => 'https://idp.univ.fr/idp/profile/Shibboleth/SSO',
    'urn:mace:cru.fr:fed:univ2.fr' => 'https://idp.univ2.fr/idp/profile/Shibboleth/SSO' );
  if ($user_idp) {
    $r->headers_out->set("Location" => $SHIB{$user_idp}.'?'.$ENV{QUERY_STRING});
    $r->status(REDIRECT);
    return;
  };
  </%init>

In this example SHIB keys look like Idp entityID.

The requests, with query string, are redirected to urn:mace:shibboleth:1.0:profiles:AuthnRequest location.

LINKS

Understanding Shibboleth: https://spaces.internet2.edu/display/SHIB2/UnderstandingShibboleth

Service Provider: https://spaces.internet2.edu/display/SHIB2/NativeSPApplication

Single Logout: https://spaces.internet2.edu/display/SHIB2/SLOIssues

AUTHOR

Yves Agostini