User Tools

Site Tools


cn:ccr:aai:howto:wordpress._configurare_l_accesso_saml_2.0_con_onelogin_saml_sso

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
cn:ccr:aai:howto:wordpress._configurare_l_accesso_saml_2.0_con_onelogin_saml_sso [2021/02/17 10:30]
becchett@infn.it
cn:ccr:aai:howto:wordpress._configurare_l_accesso_saml_2.0_con_onelogin_saml_sso [2021/02/17 19:35] (current)
becchett@infn.it
Line 1: Line 1:
 +
 +
 +===== 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:
 +<code>curl -o /tmp/idp.crt https://idp.infn.it/testing/module.php/saml/idp/certs.php/idp.crt</code>
 +
 +versione di produzione:
 +<code>curl -o /tmp/idp.crt https://idp.infn.it/module.php/saml/idp/certs.php/idp.crt</code>
 +
 +generare il certificato e la chiave private da usare per questo SP:
 +<code>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 </code>
 +
 +** 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:
 +<code> rm -f /tmp/idp.crt /tmp/saml.key /tmp/saml.crt</code>
 +
 +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:
 +
 +{{:cn:ccr:aai:howto:godiva_wp_ruolo.png?nolink&800|}}
 +
 +**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:
 +
 +<code>
 +/**
 +* 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);
 +</code>
 +
 +**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 {{:cn:ccr:aai:howto:site-login-logo.png?linkonly|}} con il logo di INFN AAI.
 +
 +Nel file **functions.php** aggiungere le seguenti linee:
 +
 +<code>
 +# 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' );
 +?>
 +</code>
 +
 +**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@pg.infn.it|Enrico Becchetti]] 2021/02/17 11:34//
 +