Guides: Debian GNU/Linux 5.0 with backports packages Debian GNU/Linux 5.0 from sources Linux with RPM packages Windows with IIS Solaris from sources Mac OS X with MacPorts
URL: https://help.switch.ch/aai/docs/shibboleth/SWITCH/2.3/sp/deployment/debian-lenny-source.html Author: Halm Reusser - SWITCH $Date: 2010-12-22 11:06:13 +0100 (Mi, 22 Dez 2010) $ $Revision: 1106 $
This guide describes the installation & configuration of a Shibboleth Sevice Provider (SP) 2.3.1 on a Debian GNU/Linux 5.0 from sources. It covers the installation of the Shibboleth Webserver authentication module as well as the Shibboleth daemon and its configuration for the SWITCHaai federation.
For further information about Shibboleth Sevice Provider, take a look at the references.
openssl
and not gnutls
.
For convenience, you may decide to dynamically profile your setup by providing some information about your environment in the this step.
If you are in a hurry and know the whole setup process, you can download all relevant configuration files here:
export MYBUILD=~/shibsp2.3.1-build mkdir $MYBUILD
wget http://shibboleth.internet2.edu/downloads/log4shib/latest/log4shib-1.0.4.tar.gz -P $MYBUILD wget http://shibboleth.internet2.edu/downloads/opensaml/cpp/latest/xmltooling-1.3.3.tar.gz -P $MYBUILD wget http://shibboleth.internet2.edu/downloads/opensaml/cpp/latest/opensaml-2.3.tar.gz -P $MYBUILD wget http://shibboleth.internet2.edu/downloads/shibboleth/cppsp/latest/shibboleth-sp-2.3.1.tar.gz -P $MYBUILD
for f in $MYBUILD/*.tar.gz; do tar -xzvf $f -C $MYBUILD; done
SHIB_HOME
if the target directory is somewhere else: export SHIB_HOME=/opt/shibboleth-sp-2.3.1/
sudo mkdir $SHIB_HOME
cd $MYBUILD/log4shib-1.0.4/ ./configure --disable-static --disable-doxygen --prefix=$SHIB_HOME make sudo make install
cd $MYBUILD/xmltooling-1.3.3/ ./configure --with-log4shib=$SHIB_HOME --prefix=$SHIB_HOME -C make sudo make install
cd $MYBUILD/opensaml-2.3/ ./configure --prefix=$SHIB_HOME --with-log4shib=$SHIB_HOME -C make sudo make install
cd $MYBUILD/shibboleth-2.3.1/ ./configure --with-saml=$SHIB_HOME --enable-apache-22 --with-log4shib=$SHIB_HOME --with-xmltooling=$SHIB_HOME --prefix=$SHIB_HOME -C make sudo make install
if [ -L /opt/shibboleth-sp2 ] ; then sudo rm /opt/shibboleth-sp2 ; fi; sudo ln -sf $SHIB_HOME /opt/shibboleth-sp2
# Load the shibboleth module LoadModule mod_shib /opt/shibboleth-sp2/lib/shibboleth/mod_shib_22.so
# Global Configuration # This is the XML file that contains all the global, non-apache-specific # configuration. Look at this file for most of your configuration parameters. ShibConfig /etc/shibboleth/shibboleth2.xml # Used for example logo and style sheet in error templates. <IfModule mod_alias.c> <Location /shibboleth-sp> Allow from all </Location> Alias /shibboleth-sp/main.css /opt/shibboleth-sp2/share/doc/shibboleth/main.css Alias /shibboleth-sp/logo.jpg /opt/shibboleth-sp2/share/doc/shibboleth/logo.jpg </IfModule>
... ... # This file is generated from envvars-std.in # export LD_LIBRARY_PATH=/opt/shibboleth-sp2/lib
sudo a2enmod shib
sudo cp $SHIB_HOME/etc/shibboleth/shibd-debian /etc/init.d/shibdAdjust the init script:
PATH=/sbin:/bin:/usr/sbin:/usr/bin DESC="Shibboleth 2 daemon" NAME=shibd SHIB_HOME=/opt/shibboleth-sp2/ SHIBSP_CONFIG=/etc/shibboleth/shibboleth2.xml LD_LIBRARY_PATH=$SHIB_HOME/lib DAEMON=$SHIB_HOME/sbin/shibd SCRIPTNAME=/etc/init.d/$NAME PIDFILE=/var/run/$NAME.pid ...Install the init script:
sudo chmod +x /etc/init.d/shibd sudo update-rc.d shibd defaults
sudo mkdir /etc/shibboleth/ sudo cp $SHIB_HOME/etc/shibboleth/native.logger /etc/shibboleth/ sudo cp $SHIB_HOME/etc/shibboleth/shibd.logger /etc/shibboleth/ sudo cp $SHIB_HOME/etc/shibboleth/syslog.logger /etc/shibboleth/
sudo mkdir -p /var/log/shibboleth/ sudo touch /var/log/shibboleth/shibd.log sudo touch /var/log/shibboleth/native.log sudo chgrp www-data /var/log/shibboleth/native.log sudo chmod g+w /var/log/shibboleth/native.log
For creating a self signed certificate follow these steps:
cd /etc/shibboleth/ sudo sh /opt/shibboleth-sp-2.3.1/etc/shibboleth/keygen.sh -h sp.example.org -y 3 -e https://sp.example.org/shibboleth
The Shibboleth Apache module log is configured by /etc/shibboleth/native.logger
The Shibboleth daemon and the transaction log are configured by /etc/shibboleth/shibd.logger
<SPConfig xmlns="urn:mace:shibboleth:2.0:native:sp:config" xmlns:conf="urn:mace:shibboleth:2.0:native:sp:config" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" logger="syslog.logger" clockSkew="180"> <!-- The OutOfProcess section contains properties affecting the shibd daemon. --> <OutOfProcess logger="/etc/shibboleth/shibd.logger"> <!-- <Extensions> <Library path="odbc-store.so" fatal="true"/> </Extensions> --> </OutOfProcess> <!-- The InProcess section conrains settings affecting web server modules/filters. --> <InProcess logger="/etc/shibboleth/native.logger"> <ISAPI normalizeRequest="true"> <!-- Maps IIS Instance ID values to the host scheme/name/port/sslport. The name is required so that the proper <Host> in the request map above is found without having to cover every possible DNS/IP combination the user might enter. The port and scheme can usually be omitted, so the HTTP request's port and scheme will be used. --> <Site id="1" name="sp.example.org"/> </ISAPI> </InProcess> <!-- Only one listener can be defined, to connect in process modules to shibd. --> <!-- Unix based systems --> <!-- <UnixListener address="shibd.sock"/> --> <!-- Windows systems --> <!-- <TCPListener address="127.0.0.1" port="1600" acl="127.0.0.1"/> --> <UnixListener address="shibd.sock" /> <!-- This set of components stores sessions and other persistent data in daemon memory. --> <StorageService type="Memory" id="mem" cleanupInterval="900"/> <SessionCache type="StorageService" StorageService="mem" cacheTimeout="3600" inprocTimeout="900" cleanupInterval="900"/> <ReplayCache StorageService="mem"/> <ArtifactMap artifactTTL="180"/> <!-- This set of components stores sessions and other persistent data in an ODBC database. --> <!-- <StorageService type="ODBC" id="db" cleanupInterval="900"> <ConnectionString> DRIVER=drivername;SERVER=dbserver;UID=shibboleth;PWD=password;DATABASE=shibboleth;APP=Shibboleth </ConnectionString> </StorageService> <SessionCache type="StorageService" StorageService="db" cacheTimeout="3600" inprocTimeout="900" cleanupInterval="900"/> <ReplayCache StorageService="db"/> <ArtifactMap StorageService="db" artifactTTL="180"/> --> <!-- To customize behavior, map hostnames and path components to applicationId and other settings. --> <RequestMapper type="Native"> <RequestMap applicationId="default"> <!-- The example requires a session for documents in /secure on the containing host with http and https on the default ports. Note that the name and port in the <Host> elements MUST match Apache's ServerName and Port directives or the IIS Site name in the <ISAPI> element below. --> <Host name="sp.example.org"> <!-- <Path name="secure" authType="shibboleth" requireSession="true"/> --> </Host> </RequestMap> </RequestMapper> <!-- The ApplicationDefaults element is where most of Shibboleth's SAML bits are defined. Resource requests are mapped by the RequestMapper to an applicationId that points into to this section. --> <ApplicationDefaults id="default" policyId="default" entityID="https://sp.example.org/shibboleth" homeURL="https://sp.example.org/" REMOTE_USER="eppn persistent-id targeted-id" signing="false" encryption="false"> <!-- Controls session lifetimes, address checks, cookie handling, and the protocol handlers. You MUST supply an effectively unique handlerURL value for each of your applications. The value can be a relative path, a URL with no hostname (https:///path) or a full URL. The system can compute a relative value based on the virtual host. Using handlerSSL="true" will force the protocol to be https. You should also add a cookieProps setting of "; path=/; secure" in that case. Note that while we default checkAddress to "false", this has a negative impact on the security of the SP. Stealing cookies/sessions is much easier with this disabled. --> <Sessions lifetime="28800" timeout="3600" checkAddress="false" handlerURL="/Shibboleth.sso" handlerSSL="true" exportLocation="http://localhost/Shibboleth.sso/GetAssertion" idpHistory="false" idpHistoryDays="7"> <!-- For an http only (non SSL) service, set handlerSSL="false". Assure that the URLs in the metadata (resource registry) are set appropiate --> <!-- SessionInitiators handle session requests and relay them to a Discovery page, or to an IdP if possible. Automatic session setup will use the default or first element (or requireSessionWith can specify a specific id to use). --> <!-- Default example supporting the new-style of discovery service. --> <SessionInitiator type="Chaining" Location="/DS" id="DS" relayState="cookie" isDefault="true"> <SessionInitiator type="SAML2" acsByIndex="false" acsIndex="1" template="bindingTemplate.html" /> <SessionInitiator type="Shib1" acsIndex="5"/> <SessionInitiator type="SAMLDS" URL="https://wayf.switch.ch/SWITCHaai/WAYF"/> </SessionInitiator> <!-- An example using an old-style WAYF, which means Shib 1 only unless an entityID is provided. --> <!-- <SessionInitiator type="Chaining" Location="/WAYF" id="WAYF" relayState="cookie"> <SessionInitiator type="SAML2" acsByIndex="false" acsIndex="1" template="bindingTemplate.html"/> <SessionInitiator type="Shib1" acsIndex="5"/> <SessionInitiator type="WAYF" acsIndex="5" URL="https://wayf.switch.ch/SWITCHaai/WAYF"/> </SessionInitiator> --> <!-- An example directs to a specific IdP's SSO service (favoring SAML 2 over Shib 1). --> <!-- <SessionInitiator type="Chaining" Location="/Login" id="MyIdP" relayState="cookie" entityID="https://idp.example.org/idp/shibboleth"> <SessionInitiator type="SAML2" acsByIndex="false" acsIndex="1" template="bindingTemplate.html" outgoingBindings="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" /> <SessionInitiator type="Shib1" acsIndex="5"/> </SessionInitiator> --> <!-- md:AssertionConsumerService locations handle specific SSO protocol bindings, such as SAML 2.0 POST or SAML 1.1 Artifact. The isDefault and index attributes are used when sessions are initiated to determine how to tell the IdP where and how to return the response. --> <md:AssertionConsumerService Location="/SAML2/POST" index="1" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/> <md:AssertionConsumerService Location="/SAML2/POST-SimpleSign" index="2" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"/> <md:AssertionConsumerService Location="/SAML2/Artifact" index="3" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"/> <md:AssertionConsumerService Location="/SAML2/ECP" index="4" Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS"/> <md:AssertionConsumerService Location="/SAML/POST" index="5" Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post"/> <md:AssertionConsumerService Location="/SAML/Artifact" index="6" Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"/> <!-- LogoutInitiators enable SP-initiated local or global/single logout of sessions. --> <LogoutInitiator type="Chaining" Location="/Logout" relayState="cookie"> <!--<LogoutInitiator type="SAML2" template="bindingTemplate.html"/>--> <LogoutInitiator type="Local"/> </LogoutInitiator> <!-- md:SingleLogoutService locations handle single logout (SLO) protocol messages. --> <md:SingleLogoutService Location="/SLO/SOAP" Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"/> <md:SingleLogoutService Location="/SLO/Redirect" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"/> <md:SingleLogoutService Location="/SLO/POST" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/> <md:SingleLogoutService Location="/SLO/Artifact" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"/> <!-- md:ManageNameIDService locations handle NameID management (NIM) protocol messages. --> <md:ManageNameIDService Location="/NIM/SOAP" Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"/> <md:ManageNameIDService Location="/NIM/Redirect" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"/> <md:ManageNameIDService Location="/NIM/POST" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/> <md:ManageNameIDService Location="/NIM/Artifact" conf:template="bindingTemplate.html" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"/> <!-- md:ArtifactResolutionService locations resolve artifacts issued when using the SAML 2.0 HTTP-Artifact binding on outgoing messages, generally uses SOAP. --> <md:ArtifactResolutionService Location="/Artifact/SOAP" index="1" Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"/> <!-- Extension service that generates "approximate" metadata based on SP configuration. --> <Handler type="MetadataGenerator" Location="/Metadata" signing="false"/> <!-- Status reporting service. --> <!-- Please note that the IP 130.59.138.32 is used by the AAI Resource Registry. By allowing the Resource Registry to periodically access the status handler, it is possible to monitor this Service Provider and to specifically alert administrators in case of configuration or security relevant issues. If you feel uncomfortable with this, set acl="127.0.0.1" --> <Handler type="Status" Location="/Status" acl="127.0.0.1 ::1 130.59.138.32"/> <!-- Session diagnostic service. --> <Handler type="Session" Location="/Session"/> </Sessions> <!-- You should customize these pages! You can add attributes with values that can be plugged into your templates. You can remove the access attribute to cause the module to return a standard 403 Forbidden error code if authorization fails, and then customize that condition using your web server. --> <Errors session="sessionError.html" metadata="metadataError.html" access="accessError.html" ssl="sslError.html" localLogout="localLogout.html" globalLogout="globalLogout.html" supportContact="aai@example.org" logoLocation="http://www.switch.ch/aai/design/images/SWITCHaai.gif" styleSheet="http://www.switch.ch/aai/design/shib-error.css"/> <!-- Uncomment and modify to tweak settings for specific IdPs or groups. --> <!-- <RelyingParty Name="SpecialFederation" keyName="SpecialKey"/> --> <!-- Chains together all your metadata sources. --> <MetadataProvider type="Chaining"> <!-- Example of remotely supplied batch of signed metadata. --> <MetadataProvider type="XML" uri="http://metadata.aai.switch.ch/metadata.switchaai.xml" backingFilePath="/etc/shibboleth/metadata.switchaai.xml" reloadInterval="3600"> <MetadataFilter type="RequireValidUntil" maxValidityInterval="604800"/> <MetadataFilter type="Signature" verifyName="false"> <TrustEngine type="StaticPKIX" verifyDepth="5"> <CredentialResolver type="File"> <Certificate format="PEM"> <Path>/etc/shibboleth/SWITCHaaiRootCA.crt.pem</Path> </Certificate> </CredentialResolver> </TrustEngine> </MetadataFilter> </MetadataProvider> <!-- Example of locally maintained metadata. --> <!-- <MetadataProvider type="XML" file="partner-metadata.xml"/> --> </MetadataProvider> <!-- Chain the two built-in trust engines together. --> <TrustEngine type="Chaining"> <TrustEngine type="ExplicitKey"/> <TrustEngine type="PKIX"/> </TrustEngine> <!-- Map to extract attributes from SAML assertions. --> <AttributeExtractor type="XML" path="/etc/shibboleth/attribute-map.xml"/> <!-- Attribute map fresh from resource registry --> <!-- <AttributeExtractor type="XML" uri="https://rr.aai.switch.ch/gen_attribute-map.php"/> --> <!-- Use a SAML query if no attributes are supplied during SSO. --> <AttributeResolver type="Query"/> <!-- Default filtering policy for recognized attributes, lets other data pass. --> <AttributeFilter type="XML" path="/etc/shibboleth/attribute-policy.xml"/> <!-- Attribute policy fresh from resource registry --> <!-- <AttributeExtractor type="XML" uri="https://rr.aai.switch.ch/gen_attribute-policy.php"/> --> <!-- Simple file-based resolver for using a single keypair. --> <CredentialResolver type="File" key="/etc/shibboleth/sp-key.pem" certificate="/etc/shibboleth/sp-cert.pem"/> <!-- Example of a second application (using a second vhost) that has a different entityID. --> <!-- <ApplicationOverride id="admin" entityID="https://admin.example.org/shibboleth"/> --> </ApplicationDefaults> <!-- Each policy defines a set of rules to use to secure messages. --> <SecurityPolicies> <!-- The predefined policy enforces replay/freshness and permits signing and client TLS. --> <Policy id="default" validate="false"> <PolicyRule type="MessageFlow" checkReplay="true" expires="60"/> <PolicyRule type="ClientCertAuth" errorFatal="true"/> <PolicyRule type="XMLSigning" errorFatal="true"/> <PolicyRule type="SimpleSigning" errorFatal="true"/> </Policy> </SecurityPolicies> </SPConfig>
sudo wget -nc https://help.switch.ch/aai/docs/shibboleth/SWITCH/2.3/sp/deployment/download/attribute-map.xml -P /etc/shibboleth/
sudo wget -nc https://help.switch.ch/aai/docs/shibboleth/SWITCH/2.3/sp/deployment/download/attribute-policy.xml -P /etc/shibboleth/
sudo wget http://ca.aai.switch.ch/SWITCHaaiRootCA.crt.pem -P /etc/shibboleth/
Compare the certificate fingerprint with the fingerprint of the SWITCHaai Root CA certificate shown on https://www.switch.ch/pki/aai/:
openssl x509 -in /etc/shibboleth/SWITCHaaiRootCA.crt.pem -fingerprint -sha1 -noout
SHA1 Fingerprint=3C:E2:5A:E0:9D:B4:BB:2B:FD:33:3C:22:80:39:F7:FC:4A:F9:2C:E9
It is recommened to enable at the entityID URL (https://sp.example.org/shibboleth) access to the metadata of the Service Provider.
<VirtualHost sp.example.org:443> ... Redirect seeother /shibboleth https://sp.example.org/Shibboleth.sso/Metadata </VirtualHost>
sudo /opt/shibboleth-sp2/sbin/shibd -t -c /etc/shibboleth/shibboleth2.xml
sudo /etc/init.d/shibd start
sudo apache2ctl configtest sudo apache2ctl restart
... <!-- Status reporting service. --> <Handler type="Status" Location="/Status" acl="127.0.0.1"/> ...
In order to activate your Service Provider within the federation you need to register it with the Resource Registry.
The purpose of the Resource Registry is to have an up-to date list of all Identity Providers and Service Providers in the SWITCHaai Federation.
(See the information about the Resource Registry).
<VirtualHost sp.example.org:443> ... <Location /secure> AuthType shibboleth ShibRequireSession On require valid-user </Location> </VirtualHost>
sudo apache2ctl restart
After restarting Apache, try to access: https://sp.example.org/secure/,
the authentication should be initiated and you should be redirected either to the WAYF
or to an Identity Provider.
Upon successful authentication, you will probably encounter a 404
(File not found) error, because there might be no /secure.
Anyway, if you can access
https://sp.example.org/Shibboleth.sso/Session
to get information about the session like the issuer (IdP) and released
attributes,
this proofs the proper operation of the Service Provider.
<html><body><pre> <?php print_r($_SERVER); ?> </pre></body></html>This PHP script has to be placed in a Shibboleth protected directory (e.g. /secure from above). If successfully authenticated and authorized, you should see some environment variables contain your user attributes.
If some of the above tests are not successful, we recommend to do the following:
log4j.appender.native_log.fileName
defined in log4j.appender.shibd_log.fileName
set in
WARN
and ERROR
messages.
/var/log/shibboleth/native.log
and /var/log/shibboleth/shibd.log
.
log4j.rootCategory
) of /etc/shibboleth/native.logger and
/etc/shibboleth/shibd.logger to DEBUG
. WARN
or INFO
to prevent your log files from growing too big.
In case you don't understand or don't find the cause of the error, have a look at the Internet2 Shibboleth SP 2.x - Common Errors web page.
Some good practices according Service Provider productionalization:
<Errors session="sessionError.html" metadata="metadataError.html" access="accessError.html" ssl="sslError.html" localLogout="localLogout.html" globalLogout="globalLogout.html" supportContact="aai@example.org" logoLocation="http://www.switch.ch/aai/design/images/SWITCHaai.gif" styleSheet="http://www.switch.ch/aai/design/shib-error.css"/>Adjust at minimum the logoLocation and styleSheet. You may want to fully customize the html pages.
-- $Id: index.php 1106 2010-12-22 10:06:13Z reusser $