Guida pratica all'installazione e configurazione di un Service Provider Shibboleth

Il software Shibboleth è un sistema di Single Sign On (o SSO), cioè un servizio che permette un'autenticazione centralizzata, cioè demandata a un server centrale e non alla risorsa locale cui si cerca di accedere.
Questa configurazione permette che la password venga richiesta una sola volta, anche quando si deve accedere a diverse risorse poste su server diversi, ma gestiti dallo stesso Identity Provider.

Questa guida è destinata agli amministratori di sistema che installeranno e manterranno il software del provider di servizi SAML/Shibboleth per un'applicazione (o un insieme di app ubicate insieme) .
Si suppongono le seguenti competenze di base:
 
  • Familiarità con il sistema operativo locale, inclusa la modalità di installazione del software (su alcuni sistemi UNIX, ciò può significare la compilazione di pacchetti dal codice sorgente o l'utilizzo del pacchetto fornito da ITS)
  • Configurazione del server Web locale (Apache, IIS, ecc.)
  • Conoscenza di base di SSL, incluso come generare una chiave e CSR
  • Conoscenza di base dei documenti XML


Single Sign-On è composto da tre componenti:

  • L'Identity Provider (IdP) è responsabile dell'autenticazione dell'utente e fornisce le informazioni sull'utente al Service Provider (SP). È la parte *server* gestita dall'organizzazione che conserva le informazioni sugli utenti. È quello gestito dall'ASIT;
  • Il *fornitore di servizi* (SP) è responsabile della protezione di una risorsa online e del collegamento con l'IdP (Identity Provider) per ottenere informazioni (attributi) sull'utente che vuole autenticarsi. È la parte *client*, quella che dovrete installare e configurare. È anche l'argomento di questa guida;
  • Il Discovery Service (DS) aiuta il Service Provider (SP) a scoprire il provider di identità (IdP) dell'utente. Può trovarsi ovunque sul Web e non è necessario in tutti i casi. Unipd non ne fa uso, pertanto verrà ignorato.

Il diagramma seguente mostra l'interazione tra l'utente, l'IdP, e l'SP:

Diagramma interazione tra utente, IdP e SP

 

In questa pagina verrà considerata la configurazione probabilmente più diffusa, che vede Apache HTTP server come server web e "Shibboleth SP" come software di Service provider.

Le istruzioni che seguono consentono di installare e configurare una versione minimale funzionante di Service Provider, collegata all'IdP di  Ateneo.

Software

NTP

I server che eseguono Shibboleth devono avere l'ora di sistema sincronizzata per evitare errori di sfasamento dell'orologio.
Si consiglia pertanto di installare ntp o utilizzare un altro meccanismo di sincronizzazione dell'ora.

Shibboleth SP3

Le istruzioni per il download e l'installazione sono disponibili nella pagina di installazione del wiki di Shibboleth Project . Dovrai seguire le informazioni nella sezione per Native Service Provider. Segui le istruzioni specifiche per la tua piattaforma; le opzioni del sistema operativo disponibili sono Linux , Mac OSX e Windows . Quando hai finito di installare Shibboleth, avrai il demone shibd e il modulo mod_shib Apache (se usi Apache) installati nel tuo ambiente host.

(Debian, Ubuntu e derivate)

[sudo] apt install shibboleth-sp-utils libapache2-mod-shib

in alternativa scaricare i file sorgenti da

https://shibboleth.net/downloads/service-provider/latest/ e procedere con l'installazione manuale.

Configurazione "passo a passo"

Riferimenti e casella di posta elettronica

Per prima cosa va definita una persona/ufficio di riferimento e va fornita una casella di posta elettronica (meglio se di gruppo) che sia sempre presidiata.

In caso di variazioni di questa email, o delle persone di riferimento, queste vanno tempestivamente comunicate all'Asit.

DNS

Scegli un nome per il tuo servizio e registralo nel DNS (di Ateneo)

EntityID

Definisci la tua EntityID. Consigliamo la forma: URL https://TUO_SERVIZIO_SP[.dip].unipd.it/shibboleth, cioè un nome derivato dal DNS associato al servizio che non cambierà nel tempo.

Questo attributo definisce il tuo SP

NOTA Modificare il valore di entityID invalida i metadata dell'SP, e blocca la funzionalità di SSO.

Certificato digitale

L'SP richiede un certificato digitale (diverso da quello che il server web usa per le connessioni https) che normalmente è un self signed, con tempo di scadenza di molti anni; il motivo per il quale è bene che la scadenza sia molto avanti nel tempo è che quando il certificato scade il tuo servizio non può più utilizzare il servizio di SSO, fino a quando viene installato un nuovo certificato (che deve essere comunicato anche all'IdP, dal momento che causa una variazione dei metadati dell'SP, che devono quindi essere aggiornati nell'IDP).

NOTA La scadenza del certificato crea una situazione di difficile risoluzione, perché un sito che gestiva perfettamente l'autenticazione, smette improvvisamente di funzionare, senza alcun motivo apparente, e senza nessun intervento sulla configurazione

Per crearlo si usa il comando shib-keygen (man shib-keygen per approfondire, in generale, le opzioni di default dovrebbero andare bene)
Il comando viene utilizzato per generare la coppia di chiavi. Per impostazione predefinita, il certificato pubblico verrà creato in /etc/shibboleth/sp-cert.pem e la chiave privata in /etc/shibboleth/sp-key.pem.

In opzione si possono creare due certificati diversi, uno per il 'signing' e uno per 'encryption':

sudo shib-keygen -h TUO_SERVIZIO_SP.unipd.it -e https://TUO_SERVIZIO_SP.unipd.it/shibboleth -n sp-signing

sudo shib-keygen -h TUO_SERVIZIO_SP.unipd.it -e https://TUO_SERVIZIO_SP.unipd.it/shibboleth -n sp-encrypt

La proprietà e i permessi dei certificati deve essere configurata in modo che l'utente del demone shibd possa leggerli.

In Debian: chown _shibd:_shibd sp-{key,cert}.pem ; chmod 600 sp-key.pem ; chmod 644 sp-cert.pem

Configurazione

Shibboleth2.xml

Contiene la configurazione iniziale del SP (in /etc/shibboleth/shibboleth2.xml, se non diversamente specificato).

  • Modifica l'attributo entityID che si trova nell'elemento <ApplicationDefaults> con uno appropriato.
       <ApplicationDefaults entityID="https://TUO_SERVIZIO_SP.unipd.it/shibboleth"
        REMOTE_USER="shib_maildip shib_mailstud shib_id eppn subject-id pairwise-id persistent-id"
        cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1">
  • REMOTE_USER è la variable che viene utilizzata da Apache: dovrebbe rappresentare lo username o comunque un identificativo univoco dell'utente.

  • Stabilisci a quale IdP (produzione o test, mai entrambi!) far puntare il tuo servizio. Per farlo va modificata la proprietà entityID nell'elemento <SSO>.

           IdP di produzione

        <SSO entityID="https://shibidp.cca.unipd.it/idp/shibboleth">
              SAML2
            </SSO>

           oppure IdP di test

        <SSO entityID="https://shibidpdev.cca.unipd.it/idp/shibboleth">
              SAML2
            </SSO>

          Nota che questa proprietà (entityID) ha lo stesso nome di proprietà di quella menzionato sopra, ma funziona al contrario. Questa impostazione definisce l'IdP da utilizzare, mentre quella nel primo passaggio indica l'SP che stai configurando

  • Collega i metadata dell'IdP utilizzando uno o più elementi <MetadataProvider>.

          Ci sono più opzioni:

  • - Ti scarichi (o ottieni in qualche modo) i metadata dell'IdP, li copi in locale in /etc/shibboleth      (sconsigliata)
  • - Se il tuo server può accedere all'IdP via rete, indichi a Shibboleth come raggiungere i metadata dell'IdP:
        <MetadataProvider type="XML" validate="true"
                url="https://shibidp.cca.unipd.it/idp/shibboleth"
              backingFilePath="unipd-metadata.xml" maxRefreshDelay="7200">
        </MetadataProvider>
    
  • - Se il tuo server non può raggiungere direttamente l'IdP, ma può usare un proxy, va configurato l'elemento TransportOption provider, con il nome e la porta del proxy:
        <MetadataProvider type="XML" validate="true" url="https://shibidp.cca.unipd.it/idp/shibboleth" backingFilePath="unipd-metadata.xml" maxRefreshDelay="7200">
            <TransportOption provider="CURL" option="10004">MIO_PROXY.unipd.it:port</TransportOption>
        </MetadataProvider>
  •  
  • Inserisci i certificati generati al passaggio precedente:
        <CredentialResolver type="File" use="signing"
            key="sp-signing-key.pem" certificate="sp-signing-cert.pem"/>
        <CredentialResolver type="File" use="encryption"
            key="sp-encrypt-key.pem" certificate="sp-encrypt-cert.pem"/>
    

    NOTA Modificare i certificati invalida i metadata dell'SP, e blocca la funzionalità di SSO.

Virtual Host

Nel caso dei virtual host, può essere comodo mantenere la stessa configurazione shibboleth di base, variando solo alcune configurazioni specifiche per ogni sito.

Per farlo si ricorre alla direttiva ApplicationOverride

<ApplicationOverride id="IDUNIVOCO" entityID="ENTITYIDUNICO">
        <CredentialResolver type="File" use="signing"
            key="SITO-key.pem" certificate="SITO-cert.pem"/>
        <CredentialResolver type="File" use="encryption"
            key="SITO-key.pem" certificate="SITO-cert.pem"/>
</ApplicationOverride> 

All'interno di ApplicationOverride, si possono inserire quasi tutte le direttive che si possono inserire all'interno di shibboleth2.xml, o anche nessuna.

Configurazione di Apache

All'interno del file di configurazione del virtual host, va richiamato l'ID Univoco dell'ApplicationOverride:

<Location /secure>
              ........
                ShibRequestSetting applicationId IDUNIVOCO
              ........
 </Location>

 

 

Shibboleth Configuration Check

Dalla CLI, eseguire il seguente comando per controllare se Shibboleth Service Provider riesce a caricare la configurazione di default senza errori: sudo shibd -t

È importante che l'ultima riga dell'output sia:
overall configuration is loadable, check console for non-fatal problems
quindi riavviare il servizio:
systemctl restart shibd.service

Shibboleth Quick Test

  •     (Re-) Start il web server e accedi all'URL: `https://TUO_SERVIZIO_SP.unipd.it/Shibboleth.sso/Session`.

    Il web server (or meglio il demone Shibboleth) dovrebbe restituire una pagina che dice: ` A valid session was not found.`

 

  • Generatore dei propri metadata da passare all'IDP accedendo all’url (tali metadata vanno verificati):
    https://TUO_SERVIZIO_SP.unipd.it/Shibboleth.sso/Metadata
  • Verifica del funzionamento dell’autenticazione accedendo all’url:
    https://TUO_SERVIZIO_SP.unipd.it/Shibboleth.sso/Login
  • Una volta effettuata l’autenticazione verificare la creazione della sessione all’url:
    https://TUO_SERVIZIO_SP.unipd.it/Shibboleth.sso/Session
    controllando la presenza dei metadati richiesti all’IdP correttamente compilati.
  • Per chiudere la sessione utilizzare l’url:
    https://TUO_SERVIZIO_SP.unipd.it/Shibboleth.sso/Logout

Shibboleth Secure Folder Test

Test di una cartella protetta da shibboleth nel web server

  • Creare la cartella `/secure` dentro `/var/www/html`
  • Definire in apache l'accesso per la cartella `/secure`:
    
        <Location /secure>
             Authtype shibboleth
             ShibRequireSession On 
             require valid-user 
        </Location> 
        
  • Verificare che per accedere all’url `https://TUO_SERVIZIO_SP.unipd.it/secure` venga richiesta l’autenticazione Shibboleth

Importante

Controllare SEMPRE i metadata prima di inviarli

I metadata generati sono un ottimo punto di partenza e spesso non richiedono modifiche manuali; tuttavia controllare:

  • che l'entityID del servizio corrisponda a quanto definito
  • che sia presente l'elemento <KeyDescriptor use="encryption"> oppure l'elemento <KeyDescriptor> privo dell'attributo "use"

Verificare la propria installazione

Verificare che la configurazione del servizio sia utilizzabile, tramite ad esempio il servizio https://samltest.id/; se non funziona, non funzionerà nemmeno la registrazione presso l'Identity Provider di Ateneo

Guida a samltest.id

A questo link trovate una breve guida all'uso di samltest.id per controllare la propria configurazione.

Single Logout

Il "Single LogOut"  riguarda la "disconnessione" dal servizio di SSO; ciò significa che questo logout ha effetto su TUTTI i servizi sotto Single Sign On di Ateneo a cui sei collegato. Un esempio: sei collegato al sito di helpdesk e a quello di webmail (con autenticazione SSO). Se effettui il logout dal servizio di helpdesk, vieni "scollegato" anche da quello di webmail; il logout locale, invece, riguarda il solo servizio sul quale effettui il logout.
Il logout globale, o "Single LogOut" è stato ufficialmente implementato su Shibboleth solo di recente, ma noi abbiamo costruito una nostra implementazione, le informazioni sono qui sotto:  

Supponendo che:

il link per il single logout è il seguente:

https://shibidp.cca.unipd.it/ssologout/logout.jsp?returl=https://tuosp.dip.unipd.it/Shibboleth.sso/Logout?return%3Dhttps%3A%2F%2Ftuosp.dip.unipd.it%2Flogout.php

Si nota che nell'ultima parte si utilizzano caratteri quali %3D, %3A, ecc.ecc.: si tratta della versione "URL encoded" dei caratteri che normalmente compongono l'URL (%3A è ":", %2F è "/").

https://shibidp.cca.unipd.it/ssologout/logout.jsp: questa parte e' fissa (rimuove i cookie IDP).

returl=https://tuosp.dip.unipd.it/Shibboleth.sso/Logout : e' l'url di logout del tuo SP (in questo caso l'esempio e' per Shibboleth SP (rimuove i cookie SP).

return%3Dhttps%3A%2F%2Ftuosp.dip.unipd.it%2Flogout.php: sempre nell'esempio di Shibboleth SP, e' l'url (urlencoded) al quale andare dopo il logout dall'SP. Servirebbe per effettuare il logout dall'applicativo o per rimandare l'utente ad una pagina specifica post logout.

Nota: Dal punto di vista SAML l'importante e' rimuovere i cookie dell'IDP e dell'SP.

Informazioni in breve

url metadata ed entityID IDP produzione: https://shibidp.cca.unipd.it/idp/shibboleth

url metadata ed entityID IDP test: https://shibidpdev.cca.unipd.it/idp/shibboleth

Scope: @unipd.it

Federazioni di appartenenza: IDEM, eduGain

Link utili

AncoraLink utili nel service provider
Link Significato
https://tuoserver/Shibboleth.sso/Login Effettua il login con Single Sign On
https://tuoserver/Shibboleth.sso/Logout Effettua il logout locale
https://tuoserver/Shibboleth.sso/Session Visualizza informazioni sulla sessione SSO attiva
https://tuoserver/Shibboleth.sso/Metadata Visualizza i metadata del service provider