Wordpress. Configurare SAML 2.0 con plugin Onelogin SAML SSO
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:
- Sistema operativo: CentOS 7.8.2003
- httpd 2.4.6-93
- PHP 7.4.11
- MariaDB 5.5.68
- Wordpress 5.6.1
- Onelogin SAML SSO 3.3.1
Componenti aggiuntivi per PHP:
- php-gd
- php-mcrypt
- php-mbstring
- php-curl
- php-xml
- php-pear
- php-bcmath php-json
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:
- Enable YES
- Parametri per IDP di test:
- IdP Entity Id : https://idp.infn.it/testing/saml2/idp/metadata.php
- Single Sign On Service Url : https://idp.infn.it/testing/saml2/idp/SSOService.php
- Single Log Out Service Url : https://idp.infn.it/testing/saml2/idp/SingleLogoutService.php
- Parametri per IDP di Produzione:
- IdP Entity Id : https://idp.infn.it/saml2/idp/metadata.php
- Single Sign On Service Url : https://idp.infn.it/saml2/idp/SSOService.php
- Single Log Out Service Url : https://idp.infn.it/saml2/idp/SingleLogoutService.php
- X509 Certificate: “inserire il contenuto del file /tmp/idp.crt”
- Create user if not exists: YES
- Update user data: YES
- Force Saml Login: NO
- Single Log Out: NO
- Keep Local Login: YES
- Alternative ACS Endpoint: NO
- Match Wordpress account by: username
- Trigger wp_login hook: YES
- Multi Role Support: YES
- Attribute Mapping:
- Username : uid
- E-mail: mail
- First Name: givenName
- Last Name: sn
- Nickname: givenName
- Role: eduPersonEntitlement
- Remember Me: yes
- Role Mappging:
- Administrator: admin
- Editor: editor
- Author: author
- Contributor: contrib
- Subscriber: subscr
- Multiple role values in one saml attribute value: yes
- Regular expression for multiple role values: /urn:mace:infn.it:g:infn:SEDE:wp:([^,;]*)/
Sostituire SEDE con la sigla della sezione o del laboratorio
- Role precedence:
- Administrator: 1
- Editor: 2
- Author: 3
- Contributor: 4
- Subscriber: 5
- Customize Actions And Links:
- Prevent use of normal: no
- Prevent reset password: yes
- Prevent change password: yes
- Prevent change mail: yes
- Stay in WordPress after SLO: No
- User Registration: https://signup.app.infn.it
- Lost Password: https://userportal.app.infn.it
- SAML Link Message: INFN-AAI LOGIN
- Advanced Settings:
- Debug Mode: NO
- Strict Mode: YES
- Service Provider Entity Id: NOME_HOST.SEDE.infn.it
- Lowercase URL encoding?: NO
- Encrypt nameID: NO
- Sign AuthnRequest: YES
- Sign LogoutRequest: YES
- Sign LogoutResponse: YES
- Reject Unsigned Messages: YES
- Reject Unsigned Assertions: YES
- Reject Unencrypted Assertions: YES
- Retrieve Parameters From Server: YES
- NameIDFormat: urn:oasis:names:tc:SAML:2.0:nameid-format:entity
- Service Provider X.509 Certificate: “copiare il contenuto del file /tmp/saml.crt”
- Service Provider Private Key: “copiare il contenuto del file /tmp/saml.key”
- Signature Algorithm: SHA256
- Digest Algorithm: SHA256
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:
- Service_Description: NOME_HOST.SEDE.infn.it
- selezionare: IDP Produzione o Test
- selezionare: set di attributi: Extended
- EduPersonEntitlement filter regex: /^urn:mace:infn.it:g:infn:SEDE:.*$/
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:
- nome dominio: wp
- entry ldap: wp
- descrizione: “Wordpress web site”
All’ interno di questo nodo creare un ulteriore nodo per ogni ruolo di Wordpress:
- admin
- author
- editor
- contrib
- subscr
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