La seguente guida illustra come configurare un'applicazione web per agganciarsi all'autenticazione fornita dall'Identity Provider SAML 2.0 dell'INFN (Identity Check) idp.infn.it.
simpleSAMLphp perfette di implementare l'autenticazione autorizzazione via SAML in un qualsiasi script PHP.
La documentazione di trova alla pagina http://simplesamlphp.org/docs/stable/simplesamlphp-install.
Il download è disponibile a https://simplesamlphp.org/download.
# yum install epel-release # yum install httpd mod_ssl php php-xml php-mcrypt php-mbstring # curl -L https://simplesamlphp.org/download?latest | tar -C /var -xzvf - # mv /var/simplesamlphp-* /var/simplesamlphp
Documentazione: http://simplesamlphp.org/docs/stable/simplesamlphp-sp
Scaricare i metadati dell'IdP nel file: metadata/saml20-idp-remote.php
# curl -o /var/simplesamlphp/metadata/saml20-idp-remote.php https://idp.infn.it/metadata/idp.infn.it-idp_saml20-prod-metadata.simplesamlphp.txt
# curl -o /var/simplesamlphp/metadata/saml20-idp-remote.php https://idp.infn.it/metadata/idp.infn.it-idp_saml20-test-metadata.simplesamlphp.txt
Modificare il file: /var/simplesamlphp/config/config.php
'auth.adminpassword
''secretsalt
'. Si può generare con il comando # head -c 2048 /dev/urandom | sha256sum
'technicalcontact_email
''authproc.sp' ⇒ array(
10 => array( 'class' => 'core:AttributeMap', 'removeurnprefix' ), 20 => array( 'class' => 'core:AttributeMap', 'oid2name' ),
# cd /var/simplesamlphp/cert/ # openssl req -new -x509 -newkey rsa:2048 -days 3652 -nodes -out saml.crt -keyout saml.key -subj /CN=`hostname -f`/OU=SAML-SP/
Modificare il file: /var/simplesamlphp/config/authsources.php
Impostare l'IdP di riferimento: Produzione
'idp' => 'https://idp.infn.it/saml2/idp/metadata.php'
Test
'idp' => 'https://idp.infn.it/testing/saml2/idp/metadata.php',
Aggiungere il seguente codice dopo la linea 'discoURL' ⇒ null,
// Certificates 'privatekey' => 'saml.key', 'certificate' => 'saml.crt', 'redirect.sign' => true, 'redirect.validate' => true, 'metadata.sign.enable' => true, 'sign.authnrequest' => true,
Modificare il file /etc/httpd/conf.d/ssl.conf
:
Prima di </VirtualHost>
, inserire:
Alias /simplesaml /var/simplesamlphp/www <Directory "/var/simplesamlphp/www"> Options FollowSymLinks AllowOverride None Require all granted </Directory>
Far (ri)partire il web server
# systemctl start httpd
A questo punto è necessario inviare i metadati del vostro SP, scaricandoli dalla url:
https://SP-HOSTNAME.FQDN/simplesaml/module.php/saml/sp/metadata.php/default-sp
tramite l'apposito modulo: https://idp.infn.it/utils/metadata-send.php.
All'interno del codice della vostra applicazione PHP potete inserire la chiamata alla libreria simpleSAMLphp.
Documentazione: http://simplesamlphp.org/docs/stable/simplesamlphp-sp-api
Un esempio semplice semplice:
<?php require_once('/var/simplesamlphp/lib/_autoload.php'); $as = new SimpleSAML_Auth_Simple('default-sp'); if ( $as->isAuthenticated() && $_REQUEST['logout'] ) { $as->logout(); } if ( !$as->isAuthenticated() && $_REQUEST['login'] ) { $as->requireAuth(); } echo "Hello World!\n"; if ( $as->isAuthenticated() ) { echo "You are authenticated<br>\n"; $attr = $as->getAttributes(); echo "<pre>"; print_r( $attr ); echo "</pre>"; } ?> <br> <a href="?login=yes">LOGIN</a><br> <a href="?logout=yes">LOGOUT</a><br>
In caso si voglia implementare l'autenticazione con un semplice modulo di apache è possibile usare il SP Shibboleth (la versione supportata ora è SP3).
Documentazione: https://shibboleth.atlassian.net/wiki/spaces/SP3/overview
Configurare il repository YUM:
# curl -o /etc/yum.repos.d/shibboleth.repo https://shibboleth.net/cgi-bin/sp_repo.cgi?platform=CentOS_7
Installare:
# yum install epel-release # yum install shibboleth httpd mod_ssl
Modificare il file: /etc/shibboleth/shibboleth2.xml
sp.example.org
con l'hostname del SPsigning="false"
con signing="true"
https://idp.example.org/idp/shibboleth
con https://idp.infn.it/saml2/idp/metadata.php
oppure con https://idp.infn.it/testing/saml2/idp/metadata.php
per l'IdP di test.handlerSSL="true"
e cookieProps="https"
<AttributeExtractor…
inserire<MetadataProvider type="XML" path="idp.infn.it-metadata.xml"/>
# curl -o /etc/shibboleth/idp.infn.it-metadata.xml https://idp.infn.it/saml2/idp/metadata.php
# curl -o /etc/shibboleth/idp.infn.it-metadata.xml https://idp.infn.it/testing/saml2/idp/metadata.php
# curl -o /etc/shibboleth/attribute-map.xml http://wiki.infn.it/_media/cn/ccr/aai/howto/attribute-map.xml * Far (ri)partire i servizi
# systemctl restart httpd # systemctl restart shibd
A questo punto è necessario inviare i metadati del vostro SP che trovate all'indirizzo
https://SP-HOSTNAME/Shibboleth.sso/Metadata
tramite l'apposito modulo: https://idp.infn.it/utils/metadata-send.php.
Per testare la configurazione, creare uno script di prova
mkdir /var/www/html/secure echo "<?php phpinfo(); ?>" > /var/www/html/secure/test.php
Invocare lo script all'indirizzo
https://SP-HOSTNAME/secure/test.php
Gli attributi dell'utente autenticato saranno disponibili fra le variabili d'ambiente PHP valorizzate.
Per effettuare il logout utilizzare l'indirizzo:
https://SP-HOSTNAME/Shibboleth.sso/Logout?return=
La configurazione del modulo shibboleth di apache si trova nel file /etc/httpd/conf.d/shib.conf
, la cui documentazione è alla pagina https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPhtaccess
In caso si utilizzino CMS, in particolare Joomla, si presti attenzione alle regole di riscrittura presenti nel file .htaccess
nella root directory. Alcune di queste regole impediscono l'accesso a path relativi al funzionamento di Shibboleth: ad esempio il caso del path che permette di ottenere i metadati https://SP-HOSTNAME/Shibboleth.sso/Metadata
. Quindi è necessario inserire alcune condizioni aggiuntive alla relativa regola di riscrittura, ad esempio:
RewriteCond %{REQUEST_URI} !^/index\.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/Shibboleth\.sso ### condizione riscrittura inserita RewriteCond %{REQUEST_URI} !^/secure ### condizione riscrittura inserita RewriteRule .* index.php [L]
Per configurare un Service provider SAML è necessario registrare alcune informazioni relative all'IdP. Per SP basati su simpleSAMLphp o Shibboleth, le istruzioni dettagliate sono rispettivamente in mentre per un SP generico, qui di seguito riportiamo i dati che sono richiesti normalmente
E' il certificato che l'IdP usa per firmare e cifrare i pacchetti SAML è un certificato self-signed che può essere scaricato in formato PEM, direttamente dall'IdP
https://idp.infn.it/module.php/saml/idp/certs.php/idp.crt
https://idp.infn.it/testing/module.php/saml/idp/certs.php/idp.crt
Se configurate un SP SAML durante un key-rollover, dovete installare anche il nuovo certificato dell'IdP che troverete in:
https://idp.infn.it/module.php/saml/idp/certs.php/new_idp.crt
https://idp.infn.it/testing/module.php/saml/idp/certs.php/new_idp.crt
https://idp.infn.it/saml2/idp/metadata.php
https://idp.infn.it/testing/saml2/idp/metadata.php
https://idp.infn.it/saml2/idp/SSOService.php
https://idp.infn.it/testing/saml2/idp/SSOService.php
HTTP-Redirect
Questo è l'attributo usato per effettuare il mappino tra Identità Digitale autenticata via IdP ed utenza dell'applicazione. Se possibile usare l'attributo eduPersonPrincipalName (o EPPN) altrimenti utilizzare l'attributo username (o UID)