====== RHEL 7: Configurare un Service Provider SAML 2.0 ====== 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 ===== simpleSAMLphp perfette di implementare l'autenticazione autorizzazione via SAML in un qualsiasi script PHP. ==== Installazione ==== 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 ==== Configurazione ==== Documentazione: http://simplesamlphp.org/docs/stable/simplesamlphp-sp Scaricare i metadati dell'IdP nel file: ''metadata/saml20-idp-remote.php'' == IdP di Produzione == # curl -o /var/simplesamlphp/metadata/saml20-idp-remote.php https://idp.infn.it/metadata/idp.infn.it-idp_saml20-prod-metadata.simplesamlphp.txt == IdP di Test == # 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''** * Impostare la password per il frontend: '''auth.adminpassword''' * Impostare la chiave di cifratura interna: '''secretsalt'''. Si può generare con il comando ''# head -c 2048 /dev/urandom | sha256sum'' * Impostare l'indirizzo e-mail dell'amministratore: '''technicalcontact_email''' * Inserire il seguente codice dopo la riga: '''authproc.sp' => array('' 10 => array( 'class' => 'core:AttributeMap', 'removeurnprefix' ), 20 => array( 'class' => 'core:AttributeMap', 'oid2name' ), === Creare i certificati per SAML: === # 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 '''', inserire: Alias /simplesaml /var/simplesamlphp/www Options FollowSymLinks AllowOverride None Require all granted 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]]. ==== Codice 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: isAuthenticated() && $_REQUEST['logout'] ) { $as->logout(); } if ( !$as->isAuthenticated() && $_REQUEST['login'] ) { $as->requireAuth(); } echo "Hello World!\n"; if ( $as->isAuthenticated() ) { echo "You are authenticated
\n"; $attr = $as->getAttributes(); echo "
";
  print_r( $attr );
  echo "
"; } ?>
LOGIN
LOGOUT
===== Shibboleth SP ===== 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 ==== Installazione ==== 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 ==== Configurazione ==== Modificare il file: ''/etc/shibboleth/shibboleth2.xml'' * Sostituire tutte le occorrenze di ''sp.example.org'' con l'hostname del SP * Sostituire tutte le occorrenze di ''signing="false"'' con ''signing="true"'' * Sostituire ''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. * Impostare ''handlerSSL="true"'' e ''cookieProps="https"'' * Prima del tag '' * Scaricare i metadati dell'IdP == IdP di Produzione == # curl -o /etc/shibboleth/idp.infn.it-metadata.xml https://idp.infn.it/saml2/idp/metadata.php == IdP di Test == # curl -o /etc/shibboleth/idp.infn.it-metadata.xml https://idp.infn.it/testing/saml2/idp/metadata.php * Configurare il mapping degli attributi. Scaricate il file già pronto: # 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 "" > /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] ===== SP generico ===== 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 ==== Certificato dell'IdP ==== 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 === IdP di Produzione === https://idp.infn.it/module.php/saml/idp/certs.php/idp.crt === IdP di TEST === https://idp.infn.it/testing/module.php/saml/idp/certs.php/idp.crt ==== Secondo Certificato dell'IdP (key-rollover)==== Se configurate un SP SAML durante un key-rollover, dovete installare anche il nuovo certificato dell'IdP che troverete in: === IdP di Produzione === https://idp.infn.it/module.php/saml/idp/certs.php/new_idp.crt === IdP di TEST === https://idp.infn.it/testing/module.php/saml/idp/certs.php/new_idp.crt ==== > IdP Issuer (Entity ID) ==== === IdP di Produzionee === https://idp.infn.it/saml2/idp/metadata.php === IdP di TEST === https://idp.infn.it/testing/saml2/idp/metadata.php ==== > IDP Login URL ==== === IdP di Produzionee === https://idp.infn.it/saml2/idp/SSOService.php === IdP di TEST === https://idp.infn.it/testing/saml2/idp/SSOService.php ==== > IDP binding ==== HTTP-Redirect ==== > User Login Setting ==== 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)