Prima di tutto bisogna scaricare SimpleSAMLphp dentro al progetto
Prima di tutto bisogna scaricare SimpleSAMLphp dentro al progetto
composer require simplesamlphp/simplesamlphp
Per permettere a SimpleSAMLphp a comunicare con Drupal bisogna che installiamo un modulo (per SimpleSAMLphp, non per Drupal)
composer require drupalauth/simplesamlphp-module-drupalauth
Per trasformare drupal in Identity provider manca un altro modulo
composer require 'drupal/drupalauth4ssp:^1.2'
Configurazione
L'applicazione SimpleSAMlphp deve essere come un applicazione autonoma. Ciò significa che Drupal sarà l'applicazione principale (servita dalla directory principale) e SimpleSAMLphp sarà servito da una sottodirectory. Ho scelto il percorso /idp.
La directory www nella directory del fornitore di SimpleSAMLphp deve essere esposta come percorso /idp. Ho provato alcuni metodi per farlo, ma ho scoperto che l'approccio migliore e più affidabile è solo quello di creare un collegamento simbolico tra la directory www e il percorso scelto nella radice web.
Quindi navigando nella web directory del nostro progetto
ln -s ../vendor/simplesamlphp/simplesamlphp/www idp
Configurazione vhost di apache
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/html/simplesamlphp/dev/config Alias /idp /var/www/html/vendor/simplesamlphp/simplesamlphp/www
Questa cosa va richiesta da ITDP, e la cosa importante è il percorso assoluto verso il file di configurazione per simplesamlphp e verso la sua www directory in modo che possa rispondere
al nostro sito /idp. Ovviamente va montata soltanto al default del nostro progetto.
Preparazione e configurazione lato codice
Abbiamo bisogno di creare una directory per la configurazione i metadata e i certificati di simplesamlphp.
Un bell approccio consiste nell'avere configurazioni diverse per piattaforme diverse (il che aiuta con i test). Si possa suddividere la configurazione in questo modo e creare la struttura di directory in modo che assomigli a questa.
certs/ simplesamlphp/ - dev/ - - certs/ - - config/ - - metadata/ - prod/ - - certs/ - - config/ - - metadata/ vendor/ - simplesamlphp/ - - simplesamlphp/ - - - modules/ - - - - drupalauth/ web/ - autoload.php - core/ - .htaccess - idp -> ../vendor/simplesamlphp/simplesamlphp/www - index.php - modules/ - profiles/ - sites/ - themes/ - update.php composer.json composer.lock
quindi la simplesamlphp directory va messa nella root del nostro progetto.
Con le directory in posizione, bisogna quindi copiare il contenuto di vendor/simplesamlphp/simplesamlphp/config-templates nella directory config e il contenuto di vendor/simplesamlphp/simplesamlphp/metadata-templates nella directory dei metadati. Questo può essere fatto usando i seguenti comandi.
cp -r ./vendor/simplesamlphp/simplesamlphp/config-templates/. simplesamlphp/dev/config cp -r ./vendor/simplesamlphp/simplesamlphp/metadata-templates/. simplesamlphp/dev/metadata
Creazione dei certificati
Fornisco qui un metodo per la loro creazione, ma forse sarebbe meglio prendere degli interni di Cineca, in modo da non dover pensare ogni 10 anni per il loro rinovo. Oppure no...da decidere.
Nella applicazione SimpleSAMLphp, assicurati di essere nella directory simplesamlephp/dev/certs ed esegui il seguente comando per generare un paio di certificati.
cd /{progetto}/simplesamlphp/dev/certs openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out simplesaml.crt -keyout simplesaml.pem
Questo creerà 3 files simplesaml.crt,simplesaml.pem,simplesaml.key
Successivamente, vai alla tua base di codice Drupal e crea una directory chiamata certs. Entra in questa directory ed esegui il seguente comando.
Con i file di configurazione in atto possiamo ora passare alla configurazione del sistema.
cd /{progetto}/certs openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out drupal.crt -keyout drupal.pem
Questi certificati saranno i nostri certificati X.509 per l'SP.
Penso che dovrei probabilmente sottolineare che questi certificati non dovrebbero far parte del tuo repository Git. Sono essenzialmente credenziali e come tali non dovrebbero essere archiviate in Git. Dovrai trovare modi per distribuire questi certificati ai tuoi server senza che facciano parte del tuo repository. È possibile, ad esempio, inserire i file nel server di produzione e quindi creare un collegamento simbolico durante il processo di distribuzione in modo che appaiano nello stesso posto per quanto riguarda i due sistemi. Questi certificati dureranno anche a lungo (3652 giorni o circa 10 anni), il che potrebbe non essere la migliore pratica ma dovrebbe andare bene per un server di sviluppo bloccato. Con i certificati in atto possiamo ora passare alla configurazione di SimpleSAMLphp.
SimpleSAMLphp Configuration
È giunto il momento di modificare il file config.php in simplesamlphp/dev/config per far sapere a SimpleSAMLphp come vogliamo configurare il sistema.
A seconda di dove si desidera ospitare il sistema, dipende dall'impostazione baseurlpath. Se il sistema è installato in una sottodirectory, procedere di conseguenza. SimpleSAMLphp reindirizzerà a questo percorso durante l'autenticazione, quindi devi essere sicuro che sia corretto per la tua configurazione.
'baseurlpath' => 'https://multisite.ddev.site/idp/',
Esiste una password di amministrazione per consentirti di accedere al sistema per testare le autenticazioni e acquisire i metadati. Questa password può essere impostata utilizzando l'opzione auth.adminpassword. Impostalo su qualcosa di diverso per evitare che il sistema si lamenti e per assicurarti di avere un sistema sicuro.
'auth.adminpassword' => 'somecomplexpassword',
C'è un'impostazione segreta del sale che deve essere aggiunta. Il sistema lo utilizza per elaborare alcuni dei valori hash interni ed è quindi importante che venga creato.
Eseguire il comando seguente per produrre un valore salt segreto.
tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
Incolla l'output nell'opzione di configurazione di secretsalt. Dovrebbe assomigliare a qualcosa di simile a questo.
'secretsalt' => 'yaymigq8bmsmda2l97r50qfytyuhvop4',
Nota: non modificare questa impostazione una volta che hai iniziato a configurare i servizi di autenticazione in quanto causerà la modifica di tutte le tue chiavi e alla fine causerà problemi ai tuoi utenti in quanto non saranno in grado di autenticarsi.
Imposta il fuso orario in cui è installato il server.
'timezone' => 'Europe/Rome',
Dobbiamo informare SimpleSAMLphp sulla posizione di un paio di directory. La prima è la directory dei certificati, che viene impostata con l'uso dell'opzione certdir.
Per impostazione predefinita, punta a una directory relativa alla directory dell'applicazione SimpleSAMLphp. In tal caso, per indirizzarla alla nostra directory personalizzata, dobbiamo aggiungerla come percorso assoluto.
'certdir' => '/var/www/html/simplesamlphp/dev/certs/',
Oppure fai qualche salto in giro, l'applicazione capirà dove si basa la directory su questo. Ho scoperto che è più facile da gestire in quanto funzionerà su qualsiasi configurazione su cui è installato.
'certdir' => '../../../simplesamlphp/dev/certs/',
Nota: fate attenzione sui percorsi, quando aggiornerò questa guida, sarà con i percorsi che utilizziamo di solito per i nostri siti, i percorsi attuali sono quelli che utilizzo in ddev (local installation).
Successivamente, è necessario modificare il riferimento alla directory delle origini dei metadati modificando la posizione dell'impostazione della directory nella sezione delle origini dei metadati. È simile all'opzione certdir in quanto puoi impostarla come assoluta o relativa alla directory dell'applicazione SimpleSAMLphp.
'metadata.sources' => [ ['type' => 'flatfile', 'directory' => '/var/www/html/simplesamlphp/dev/metadata/', ], ],
Ecco l'ambientazione con relativo percorso.
'metadata.sources' => [ ['type' => 'flatfile', 'directory' => '/../../../simplesamlphp/dev/metadata/', ], ],
Dopo questo dovresti essere in grado di visitare il tuo host e vedere la pagina di benvenuto di SimpleSAMLphp.
Puoi accedere a questo utilizzando la password di amministrazione che hai impostato sopra.
Il sistema non fa molto al momento, quindi abilitiamo alcuni protocolli e moduli di autenticazione.
Per impostazione predefinita, SimpleSAMLphp utilizza SAML 2.0 e, sebbene esista il supporto per l'autenticazione Shibboleth, attualmente è deprecato, quindi non dovresti fare affidamento su di esso. Abilita il protocollo SAML 2.0 impostando true sull'opzione enable.saml20-idp.
'enable.saml20-idp' => true,
Non bisogna preoccuparsi di abilitare l'impostazione 'shib13-idp' poiché si riferisce al protocollo Shibboleth che è stato deprecato e verrà rimosso in SimpleSAMLphp 2.0.
Un requisito del modulo drupalauth è una connessione al database, questo non deve essere lo stesso database in cui è installato Drupal, ma richiede la modifica di alcune impostazioni nel file config.php.
'store.type' => 'sql', 'store.sql.dsn' => 'mysql:host=localhost;dbname=drupal', 'store.sql.username' => 'drupal', 'store.sql.password' => 'drupal',
Infine, ora si puo abilitare alcuni moduli, questo viene fatto abilitandoli nell'impostazione module.enable nel file config.php.
'module.enable' => [ 'core' => true, 'saml' => true, 'drupalauth' => true, ],
Con quello in atto possiamo aggiungere i nostri dettagli di autenticazione del sito Drupal al file authsources.php. Questo deve fare riferimento alla radice web di Drupal, ai collegamenti di accesso e disconnessione, nonché a qualsiasi attributo che si desidera passare tra Drupal e i fornitori di servizi quando l'utente si autentica. Nell'esempio seguente stiamo restituendo l'ID utente Drupal, il nome e l'indirizzo e-mail nel pacchetto di autenticazione. Il sito multisite.ddev.site è solo un dominio creato localmente per questo esempio.
'drupal-userpass' => [ 'drupalauth:External', // The filesystem path of the Drupal directory. 'drupalroot' => '/var/www/web', // Whether to turn on debug 'debug' => true, // Cookie name. Set this to use a cache-busting cookie pattern // (e.g. 'SESSdrupalauth4ssp') if hosted on Pantheon so that the cookie // is is not stripped away by Varnish. See https://pantheon.io/docs/cookies#cache-busting-cookies . 'cookie_name' => 'SESSdrupalauth4ssp', // the URL of the Drupal logout page 'drupal_logout_url' => 'https://multisite.ddev.site/user/logout', // the URL of the Drupal login page 'drupal_login_url' => 'https://multisite.ddev.site/user/login', // Which attributes should be retrieved from the Drupal site. 'attributes' => [ ['field_name' => 'uid', 'attribute_name' => 'uid'], ['field_name' => 'name', 'attribute_name' => 'cn'], ['field_name' => 'mail', 'attribute_name' => 'mail'], ], ],
Ora dobbiamo informare SimpleSAMLphp della nostra intenzione di usarlo come IdP. Questo viene fatto modificando il file di metadati saml20-idp-hosted.php e aggiungendo un array che dettaglia il nome, i certificati e il sistema di autenticazione per l'IdP. Il nome di autenticazione di 'drupal-userpass' deve corrispondere all'origine di autenticazione aggiunta nel passaggio precedente.
$metadata['ssotestdrupal'] = [ 'host' => '__DEFAULT__', 'privatekey' => 'simplesaml.pem', 'certificate' => 'simplesaml.crt', 'auth' => 'drupal-userpass', ];
Si noti che quanto sopra utilizza una fonte di autenticazione chiamata "example-userpass". Questo viene fornito in bundle con SimpleSAMLphp come sistema di autenticazione di esempio e fornisce agli utenti una matrice piatta di credenziali utente e password. Questo va bene da usare per l'installazione e il test, ma probabilmente non è una buona idea da usare in produzione. La configurazione per questo sistema di autenticazione è conservata nel file authsources.php nella tua directory di configurazione. Devi anche aver abilitato il modulo 'exampleauth' nella tua configurazione.
Con questa configurazione in posizione, vai alla scheda "Federazione" nella configurazione di SimpleSAMLphp. Ora dovresti vedere il tuo IdP nell'elenco. Questo è visualizzabile anche senza aver effettuato l'accesso come amministratore dell'applicazione.
Fai clic su "Mostra metadati", vedrai un mucchio di output. Questo è costituito dall'URL dei metadati, dall'XML dei metadati SAML 2.0, da una rappresentazione PHP degli stessi e dal certificato x509 pubblico che abbiamo creato in precedenza che viene utilizzato per crittografare/decrittografare i dati.
Copia l'output PHP e incollalo in saml20-ipd-remote.php nella directory dei metadati.
$metadata['ssotestdrupal'] = [ 'metadata-set' => 'saml20-idp-remote', 'entityid' => 'ssotestdrupal', 'SingleSignOnService' => [ [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://multisite.ddev.site/idp/saml2/idp/SSOService.php', ], ], 'SingleLogoutService' => [ [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://multisite.ddev.site/idp/saml2/idp/SingleLogoutService.php', ], ], 'certData' => '[REMOVED]', 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', ];
Torneremo su SimpleSAMLphp tra un po', ma prima dobbiamo configurare Drupal.
Configurare Drupal come un IDP
Un requisito per far funzionare tutto questo in Drupal è l'uso del modulo drupalauth4ssp. Questo viene installato tramite il composer.
Una volta installato il modulo, puoi andare alla pagina di configurazione del modulo nel percorso /admin/config/people/drupalauth4ssp. Non c'è molto da configurare qui, devi solo assicurarti che il campo Authsource corrisponda alla fonte di autenticazione che hai impostato nel file authsources.php. Per impostazione predefinita questo è drupal-userpass.
Authsource: drupal-userpass
Allowed List of URLs for ReturnTo Parameter: *
Facoltativamente, puoi aggiungere URL all'elenco dei parametri ReturnTo consentiti. Questo viene utilizzato dal sistema di autenticazione per rimandare gli utenti ai loro siti di origine (ovvero l'SP a cui stanno tentando di accedere) e quindi può essere una misura di sicurezza aggiuntiva per impedire ai siti indesiderati di utilizzare il tuo sito come IdP.
Questo è praticamente tutto in termini di configurazione di Drupal come IdP. Il modulo Drupal drupalauth4ssp è praticamente plug and play.
Naturalmente, questa configurazione non fa assolutamente nulla da sola, è necessario un sistema per essere un fornitore di servizi in modo da potervi accedere.