User Tools

Site Tools


Sidebar

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

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
  • 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:
  • 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

cn/ccr/aai/howto/wordpress._configurare_l_accesso_saml_2.0_con_onelogin_saml_sso.txt · Last modified: 2021/02/17 19:35 by becchett@infn.it