===== 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 **<>** [[https://it.wordpress.org/plugins/onelogin-saml-sso/]] Nelle impostazioni selezionare **<>** 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 **<>** [[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 **<>** 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: {{: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: /** * 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 "

"; echo "ERRORE. L' utente $username, $mail, non è autorizzato ad accedere perchè non è afferente a questa struttura"; echo "

"; 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 {{:cn:ccr:aai:howto:site-login-logo.png?linkonly|}} 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() { ?> **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//