Have any questions?
+44 1234 567 890
combined.expert - Keycloak e PrivacyIDEA: la coppia perfetta per l'autenticazione indipendente
In un panorama digitale in cui molte soluzioni di autenticazione e gestione delle identità dipendono ancora da infrastrutture estere, abbiamo scelto di percorrere una strada diversa. Con Keycloak e PrivacyIDEA abbiamo costruito un’infrastruttura che non si limita a proteggere i dati a livello di storage, ma estende il principio di indipendenza fino al cuore dell’accesso: l’autenticazione stessa.
Keycloak è un software open source che offre funzioni di Single Sign-On (IdP) con Identity Management e Access Management per applicazioni e servizi moderni. Questo software è scritto in Java e supporta i protocolli di federazione delle identità SAML v2, OpenID Connect (OIDC) e OAuth2.
PrivacyIDEA è un server open source di autenticazione modulare che può essere utilizzato per migliorare la sicurezza delle applicazioni esistenti, come il login locale, VPN, l'accesso remoto, le connessioni SSH, l'accesso a siti o portali web con autenticazione a due fattori.
Insieme, formano un ecosistema robusto, privo di dipendenze da provider soggetti a normative estere invasive, e perfettamente adatto al contesto normativo svizzero ed europeo.
Abbiamo scelto questa combinazione potente non solo per la sua maturità tecnica e la stabilità comprovata, ma perché rappresenta un modello coerente con la nostra visione di sicurezza: indipendente, verificabile e con zero compromessi sulla privacy.
Ma non si tratta solo di teoria: abbiamo realizzato un’implementazione concreta che unisce la potenza di Keycloak alla versatilità di PrivacyIDEA, creando un’infrastruttura capace di garantire Single Sign-On sicuro e MFA avanzato per applicazioni come Nextcloud e grommunio. Nei prossimi paragrafi mostreremo come abbiamo integrato Keycloak con PrivacyIDEA e realizzato la connessione OIDC per grommunio e Nextcloud.
In questo articolo partiremo direttamente dalla configurazione dell’integrazione, dando per scontato che Keycloak, PrivacyIDEA e le applicazioni coinvolte siano già installati e funzionanti. L’obiettivo è mostrare come unire queste tecnologie per ottenere un sistema IAM e MFA sicuro, indipendente e pronto per l’uso in produzione.
L’architettura del sistema di autenticazione prevede un server virtuale dedicato per Keycloak ed un server virtuale dedicato per PrivacyIDEA. Insieme offrono i servizi di autenticazione per tutti i clienti tramite isolamento in cosiddetti Realms.
La configurazione di PrivacyIDEA prevede un resolver LDAP nel Realm dedicato al cliente. Utilizziamo le classiche impostazioni come in ogni software, come ad esempio Citrix NetScaler.
La parte più importante è la definizione del nome utente usato poi come attributo per l’accesso e l’identificazione dell’oggetto (objectGUID). Queste informazioni devono essere impostate in modo coerente in tutte le applicazioni che usufruiscono dei servizi di identità. Il parametro objectGUID è molto importante nel caso in cui Nextcloud fosse connesso direttamente ad Active Directory, come vedremo in seguito.
Il nostro resolver LDAP deve essere connesso al proprio Realm.
Per garantire l’accesso agli utenti abbiamo bisogno dei criteri (policies). Questa configurazione varia molto a seconda dei bisogni dei clienti. Per la nostra dimostrazione configuriamo un criterio per TOTP ed uno per l’autenticazione Push.
I criteri di «enrollment» consentono all’utente la registrazione del token d’identità.
Ora ci occupiamo della configurazione di Keycloak. Come per PrivacyIDEA, abbiamo bisogno della connessione ad Active Directory nel Realm del cliente.
Usiamo le stesse impostazioni LDAP come in PrivacyIDEA. Anche in questo caso, prestiamo particolarmente attenzione ai valori per il nome utente e l’attributo UUID.
Ora decidiamo quali attributi di Active Directory verranno sincronizzati con Keycloak. Questa configurazione è particolarmente importante, perché a seconda delle applicazioni necessitiamo di informazioni supplementari. Creiamo i mapper seguenti:
- displayName
- firstName
- lastName
- ldap-groups
- sAMAccountName
displayName:
email:
firstName:
lastName:
ldap-groups:
sAMAccountName:
A questo punto passiamo alla connessione di grommunio – la piattaforma open source per email e groupware – con Keycloak. Il server grommunio È già connesso ad Active Directory.
Abbiamo optato per OpenID Connect al posto di SAML per garantire una maggiore flessibilità nelle integrazioni moderne, migliori possibilità di estensione e una gestione più semplice dei flussi di autenticazione.
grommunio necessita di un mapping degli attributi personalizzato:
Per il resto utilizziamo le impostazioni predefinite.
La configurazione di grommunio è molto semplice. Creiamo il file keycloak.json nella cartella /etc/gromox sul server grommunio e inseriamo i dati necessari e salviamo il file.
vi /etc/gromox/keycloak.json
{
"realm": "Nome del Realm in Keycloak",
"auth-server-url": "https://login.mydomain.ch/",
"ssl-required": "external",
"resource": "grommunio",
"public-client": true,
"confidential-port": 0,
"principal-attribute": "preferred_username"
}
Copiamo la chiave RSA pubblica dalla console di Keycloak:
Con questo comando creiamo il file bearer_pubkey nella cartella /etc/gromox.
Importante: sostituire la stringa ABC con la chiave RSA pubblica.
echo "ABC..." | fold -w 64 | sed '1i -----BEGIN PUBLIC KEY-----' | sed '$a -----END PUBLIC KEY-----' > /etc/gromox/bearer_pubkey
Infine riavviamo il servizio:
systemctl restart gromox-http
La configurazione OIDC per grommunio è completa.
La configurazione per Nextcloud richiede maggiore esperienza.
Quando si integra Nextcloud con Keycloak tramite LDAP / Active Directory, una delle sfide più comuni riguarda la gestione dell’attributo objectGUID. Questo identificatore univoco, non viene interpretato nativamente da Nextcloud nel formato binario in cui viene fornito. Se non viene convertito in una rappresentazione leggibile (ad esempio in formato stringa esadecimale), si rischiano problemi di riconoscimento utenti. La soluzione consiste nell’utilizzare un mapping o una conversione lato directory o Identity Provider, così che Nextcloud riceva un valore stabile e coerente per l’identificazione dell’utente.
La configurazione di base del client OIDC è simile alla configurazione per grommunio:
Nextcloud necessita di un mapping degli attributi personalizzato:
Noi abbiamo configurato i mapping seguenti:
- objectGUID.
- sAMAccountName
- userPrincipalName
- displayName
- ldap_uid
- preferred_username
- groups
email:
Prestiamo particolarmente attenzione al mapping objectGUID.
sAMAccountName:
displayName:
ldap_uid (userPrincipalName):
preferred_username (LDAP_ID)
groups:
La configurazione di Nextcloud richiede l’app OpenID Connect Login, che installiamo semplicemente tramite l’interfaccia grafica di Nextcloud. Questa app non ha un’interfaccia grafica come per esempio SAML. LA configurazione avviene tramite file config.php di Nextcloud situato nella cartella /var/www/nextcloud/config
Inseriamo le impostazioni OIDC nel file:
// OIDC config, reference https://github.com/pulsejet/nextcloud-oidc-login
'oidc_login_provider_url' => 'https://login.mydomain.ch/realms/myrealm',
'oidc_login_client_id' => 'nextcloud',
'oidc_login_client_secret' => 'My$ecretKey',
'oidc_login_auto_redirect' => true,
'oidc_login_logout_url' => 'https://nextcloud.mydomain.ch/apps/oidc_login/oidc',
'oidc_login_end_session_redirect' => true,
'oidc_login_button_text' => 'Log in with OpenID',
'oidc_login_hide_password_form' => true,
'oidc_login_proxy_ldap' => false,
'oidc_login_use_id_token' => true,
'oidc_login_attributes' => array (
'id' => 'preferred_username',
'name' => 'displayName',
'mail' => 'email',
'userPrincipalName' => 'userPrincipalName',
'sAMAccountName' => 'sAMAccountName',
),
'oidc_login_ldap_uid' => 'userPrincipalName',
'oidc_login_scope' => 'openid profile',
'oidc_login_disable_registration' => true,
'oidc_login_redir_fallback' => true,
'oidc_login_tls_verify' => true,
//'oidc_login_debug' => true,
//'loglevel' => 0,
Per un backend LDAP in Nextcloud, dobbiamo modificare l'attributo objectGUID in minuscolo per tutti gli utenti. Nextcloud memorizza il GUID in maiuscolo e Keycloak in minuscolo. Per questo motivo, dobbiamo modificare il GUID come segue, altrimenti gli utenti AD non saranno trovati in Nextcloud al momento dell'accesso. Noi abbiamo optato per la modifica lato Nextcloud. Naturalmente è possibile effettuare il contrario e modificare l’attributo lato Keycloak. In ogni caso, la soluzione migliore è l’automazione con script e la via da seguire dipende dalle conoscenze tecniche dei prodotti.
Ecco un esempio per la conversione in minuscolo:
sudo -u postgres psql
\c nextcloud_db
select * from oc_ldap_user_mapping;
UPDATE oc_ldap_user_mapping
SET directory_uuid = LOWER(directory_uuid)
UPDATE oc_ldap_user_mapping
SET owncloud_name = LOWER(owncloud_name);
Il filtro LDAP configurato nell’interfaccia di amministrazione grafica di Nextcloud deve eventualmente essere modificato. Qui abbiamo un filtro che funziona con Keycloak e LDAP:
(&(&(objectClass=person)(memberof:1.2.840.113556.1.4.1941:=CN=Nextcloud Users,OU=Security Groups,OU=Groups,OU=MySite,DC=myDomain,DC=local))(|(sAMAccountName=%uid)(mail=%uid)(mailPrimaryAddress=%uid)(userPrincipalName=%uid)(objectGUID=%uid)))
I due client OIDC grommunio e Nextcloud sono pronti.
Ora non ci resta che integrare PrivacyIDEA con Keycloak. Scarichiamo il plugin open source a questo indirizzo:
https://github.com/privacyidea/keycloak-provider
Il blog e informazioni supplementari sono disponibili online:
https://community.privacyidea.org/t/how-to-use-keycloak-with-privacyidea/1132
Possiamo copiare il file PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar sul server PrivacyIDEA nella cartella /tmp tramite WinSCP e infine copiarlo nella cartella providers di Keycloak:
cp /tmp/PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar /opt/keycloak/providers/PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar
Prima di procedere dobbiamo eseguire questo comando per attivare il nuovo provider:
sudo -u keycloak /opt/keycloak/bin/kc.sh build
Infine riavviamo il servizio Keycloak:
sudo systemctl restart keycloak
Nell’interfaccia amministrativa di Keycloak possiamo duplicare il flow «browser» e creiamo un nuovo flow «browser with privacyidea».
Aggiungiamo una nuova posizione nel flow:
Cerchiamo il provider PrivacyIDEA e lo selezioniamo.
Disattiviamo le posizioni non necessarie come OTP Form e lasciamo attiva solo PrivacyIDEA.
Apriamo le impostazioni del provider e configuriamo le opzioni necessarie:
Non ci resta che assegnare il flow:
L’esecuzione sicura dei servizi web richiede necessariamente il passaggio attraverso un reverse proxy, che controlla in modo selettivo l’accesso alle risorse: l›interfaccia di amministrazione non deve essere accessibile dall'esterno, mentre le risorse del realm sono accessibili secondo il principio del «least privilege», ovvero concedere a ciascun componente o utente solo le autorizzazioni strettamente necessarie per svolgere le proprie funzioni.
La configurazione seguente è un buon punto di partenza per Keycloak:
URL consentiti con i relativi schemi regex:
# /favicon.ico
^/favicon\.ico$
# /resources/*
^/resources(/.*)?$
# /realms/myrealm/*
^/realms/myrealm(/.*)?$
URL bloccati con i relativi schemi regex:
# / (root)
^(/.*)?$
Per PrivacyIDEA la configurazione è simile:
URL consentiti con i relativi schemi regex:
# /saml/*
^/saml(/.*)?$
# /ttype/push
^/ttype/push$
# /token/init
^/token/init$
# /validate/*
^/validate(/.*)?$
# /static/*
^/static(/.*)?$
# /notification/*
^/notification(/.*)?$
URL bloccati con i relativi schemi regex:
# / (root)
^(/.*)?$
Il risultato è un’esperienza d’accesso fluida e sicura: l’utente effettua il login una sola volta, inserisce l’OTP, e può passare senza ulteriori credenziali da grommunio a Nextcloud e alle altre applicazioni integrate, grazie al Single Sign-On.
Se per la vostra azienda la protezione delle identità e la sovranità digitale sono priorità, siamo pronti a mettere la nostra esperienza al vostro servizio - dall’hosting sicuro in Svizzera fino alla consulenza specializzata nella progettazione di architetture IAM e MFA.
Contattateci ora per una dimostrazione gratuita e senza impegno.