In questa guida viene descritto come agganciare l'autenticazione di un sito web realizzato con Wordpress ad INFN-AAI, effettuare la fase di autenticazione usando come attributo il campo mail e personalizzare la pagina di login.
Programmi utilizzati per realizzare questa guida:
Componenti aggiuntivi per PHP:
Prerequisiti. Installare e configurare Wordpress con https attivo.
Facoltativo. Attivare un tema figlio seguendo questa guida: https://developer.wordpress.org/themes/advanced-topics/child-themes/
Fase 1. Scaricare il certificato dell’ IDP.
versione di test:
curl -o /tmp/idp.crt https://idp.infn.it/testing/module.php/saml/idp/certs.php/idp.crt
versione di produzione:
curl -o /tmp/idp.crt https://idp.infn.it/module.php/saml/idp/certs.php/idp.crt
generare il certificato e la chiave private da usare per questo SP:
openssl req -new -x509 -newkey rsa:2048 -days 3652 -nodes -out /tmp/saml.crt -keyout /tmp/saml.key -subj /CN=`hostname -f`/OU=SAML-SP/ ; chmod 400 /tmp/saml.key
Fase 2.
Utilizzando la dashborad di Wordpress installare e attivare il plugin «Onelogin SAML SSO» https://it.wordpress.org/plugins/onelogin-saml-sso/
Nelle impostazioni selezionare «SSO/SAML Settings» e compilare tutti i campi specificati:
Sostituire SEDE con la sigla della sezione o del laboratorio
Salvare le modifiche e generare i metadati «Go to the metadata of this SP» https://NOME_HOST.SEDE.infn.it/wp-login.php?saml_metadata
Salvare i metadati e modificare il campo validUntil="YYYY-MM-DDTHH:MM:SSZ" posticipando la scadenza, per esempio validUntil="2030-12-31T23:59:00Z"
Fase 3. Inviare i metadati tramite il modulo web https://idp.infn.it/utils/metadata-send.php. Compilare:
assegnare un nome a NOME_HOST e sostituire a SEDE la sigla della sezione o del laboratorio.
copiare i metadati in «XML Metadata» ed inviare la richiesta.
Rimuovere la chiave privata ed i certificati:
rm -f /tmp/idp.crt /tmp/saml.key /tmp/saml.crt
Dopo aver ricevuto la mail di conferma da aai-support@infn.it, aggiornare il ticket specificando che per questa richiesta devono essere inviati all’ SP i numeri OID e non i nomi.
Fase 4.Ruoli e autorizzazione. Per consentire a Wordpress di associare un ruolo ad un utente occorre creare con Godiva la seguente struttura: G:INFN:SEDE:WP: ruolo:utente.
Accedere a Godiva e selezionare Domini → Gestione Domini.
Selezionare Gruppi → INFN → Sede
Aggiungere il nodo wp, specificando:
All’ interno di questo nodo creare un ulteriore nodo per ogni ruolo di Wordpress:
Entry Ldap deve avere lo stesso nome del nodo, mentre il valore da assegnare a Codice e’ ENTITLEMENTS.
Dopo aver creato tutti i nodi si possono aggiungere gli utenti. Di seguito un esempio relativo al ruolo di editor:
Fase 5. Per completare la fase di autorizzazione e consentire l'accesso solo alle persone della propria sede occorre aggiungere una funzione che controlla l’indirizzo di posta elettronica. Se è gia stato attivato un tema figlio, scelta consigliata, occorre modificare il file /HOME_WWW/wp-content/themes/wp-bootstrap-starter-child/functions.php altrimenti si deve editare il file /HOME_WWW/wp-content/themes/wp-bootstrap-starter-child/functions.php.
Di seguito un esempio con le istruzioni PHP ad aggiungere:
/** * Funzione per autorizzazione login tramite controllo sul campo mail */ function wp_user_mail_check($user_login, $user) { $infndomain="*@SEDE.infn.it*"; $mail="$user->user_email"; $username="$user->user_login"; // inserire nell’array $localusers tutti gli utenti non presenti in AAI ma già definiti nel db locale di WP. // Esempio: $localusers[]="nome_utente_1"; $localusers[]="fnome_utente_2"; $localuser_wp="false"; // controllo se l'utente e' locale foreach ( $localusers as $localuser ) { if ( "$username" == "$localuser" ) { $localuser_wp = "true"; } } // controllo mail per autorizzazione if ( $localuser_wp == "false" && !(preg_match("$infndomain",$mail)) ) { get_header(); echo "<p>"; echo "<b>ERRORE.</b> L' utente <b>$username</b>, <b>$mail</b>, non è autorizzato ad accedere perchè non è afferente a questa struttura"; echo "</p>"; get_sidebar(); get_footer(); exit; } } add_action( 'wp_login', 'wp_user_mail_check',10,2);
Fase 6. Personalizzazione della schermata di login di Wordpress.
Creare la directory images nel tema attivo, per esempio in /HOME_WWW/wp-content/themes/wp-bootstrap-starter-child/images oppure in /HOME_WWW/wp-content/themes/wp-bootstrap-starter/images. In questa directory salvare il file site-login-logo.png con il logo di INFN AAI.
Nel file functions.php aggiungere le seguenti linee:
# Logo INFN-AAI nella pagina di login function my_login_logo() { ?> <style type="text/css"> #login h1 a, .login h1 a { background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/images/site-login-logo.png); height:150px; width:380px; background-size: 420px 150px; background-repeat: no-repeat; padding-bottom: 1px; } </style> <?php } add_action( 'login_enqueue_scripts', 'my_login_logo' ); function my_login_logo_url() { $url=home_url()."/wp-login.php?saml_sso"; return $url; } add_filter( 'login_headerurl', 'my_login_logo_url' ); function my_login_logo_url_title() { return 'INFN AAI'; } add_filter( 'login_headertitle', 'my_login_logo_url_title' ); ?>
Fase 7. Accesso al sistema.
Quando saranno inseriti i metadati nell’IDP si potrà effettuare il login https://NOME_HOST.SEDE.infn.it/wp-login.php. Se l’accesso al sistema avverrà in modo corretto, verrà creato l’utente nel DB di Wordpress con il ruolo che e’ stato assegnato tramite Godiva.
Link utili:
Onelogin SAML SSO, codice sorgente: https://github.com/onelogin/wordpress-saml
Onelogin SAML SSO, home page plugin: https://it.wordpress.org/plugins/onelogin-saml-sso/
Wordpress Login: https://codex.wordpress.org/Customizing_the_Login_Form
Wordpress tema figlio: https://developer.wordpress.org/themes/advanced-topics/child-themes/
Godiva: https://wiki.infn.it/cn/ccr/aai/howto/godiva/godivajava
Gestione delle autorizzazioni in godiva: https://wiki.infn.it/cn/ccr/aai/howto/authz/home
— Enrico Becchetti 2021/02/17 11:34