Vai al contenuto

Keycloak, deploy in locale di un sistema di Single Sign-On potente e versatile

Scritto da:

Stefano Pascazi

Da Wikipedia:

Keycloak è un prodotto software open source per consentire il single sign-on con Identity and Access Management rivolto ad applicazioni e servizi moderni.

Da un punto di vista pratico è un software che permette di gestire i criteri di autenticazione di applicazioni o servizi attraverso i protocolli SAMLv2 o OpenID connect /OAuth2 in perfetta sicurezza.

Scenario d’uso

Immaginiamoci di avere un network di applicazioni ognuna con i propri clienti. In questo modo i diversi applicativi del network, non solo non possono condividere informazioni dell’utente, ma ogni applicazione potrebbe seguire una propria logica di autenticazione.

In uno scenario in cui vorremmo che l’utente fosse federato al nostro network e di conseguenza l’autenticazione fosse centralizzata, avendo criteri di accesso diversificati per applicazioni, come faremmo?

Sappiate che, oltre ad essere un bel rompicapo è anche piuttosto difficile da realizzare mantenendo degli standard di sicurezza elevati.

Gli altri cosa fanno in merito?

Poniamo l’esempio più lampante: Google!

Google ha in pancia una miriade di applicazioni a cui possiamo farne accesso semplicemente avendo un account in Google Account.

Quindi perchè anche noi, non possiamo fare grosso modo la stessa medesima cosa? Ed ecco che Keycloak ci viene in aiuto

Nota

Keycloak è uno dei tanti IM (Identity Manager) esistenti, lo stesso Google (Google IAM) o Microsoft (Azure AD B2C) ne possiedono, ma sono solamente a pagamento perchè gestiti dai rispettivi fornitori.

In realtà Keycloak essendo un prodotto di RedHat ne esiste una versione gestita in toto da RedHat stesso ed anche questa a pagamento.

Dato che noi vogliamo innanzitutto prendere confidenza con questo applicativo al solo scopo didattico, non ci interessa pagare nessuno, ma capirne l’importanza mettendo in piedi un servizio Keycloak localmente così da poter sperimentare quanto detto sopra.

Mettiamo in piedi l’applicativo

Requisiti:

  • Docker
  • docker-compose

Aprite la vostra shell e digitate quanto segue:

# a partire della nostra $HOME creiamo una nuova directory e accediamo in essa
mkdir ~/keycloak-test
cd ~/keycloak-test

# scarichiamo il docker-compose di esempio
curl -s https://gist.githubusercontent.com/stefanopascazi/f6ca929194cbf57f228d78ca03b94d54/raw/cc2cfbb66f049c0bab3917e774f5de273e6ab46f/keycloak-docker-compose.yml -o docker-compose.yml

# lanciamo i nostri container
docker-compose up --build

Al termine della procedura di installazione, potremmo visionare il nostro Keycloak appena deployato visitando la url: http://localhost:8481

Clicchiamo su Administration Console ed accediamo con le credenzilai:

  • admin
  • password

E benvenuto nel vostro Master Realm

Step by Step: creiamo un reame, un utente di test, un client e tentiamo un autorizzazione

Step 1: Creiamo un nuovo Reame in Keycloak

Cerchiamo di spiegare cosa sono i Realms o reami (in Italiano).

Keycloak si divide in Realms (altri applicativi chiamano la medesima funzione Tenants) ovvero un’applicazione interna che può includere diversi client che condividono gli stessi utenti.
Perchè non lavorare sul Master? Beh molto semplice, il realm master è quello con privilegi amministrativi globali.

Quindi, dalla barra a sinistra, posizioniamoci sulla voce Master e clicchiamo sul pulsante “add realm“, diamo un nome al nostro realm (realmtest) e clicchiamo create

Otterrete una schermata come questa

Step 2: creiamo un utente

Dal nostro realm di test nella barra di sinistra clicchiamo su users e nella schermata successiva add user.

Riempiamo i campi richiesti come segue e clicchiamo save:

Si ricaricherà la pagina, mostrando delle nuove tab aggiuntive.

Clicchiamo sulla tab Credientials e compiliamo i campi come in immagine e clicchiamo set password

Step 3: realizziamo un client per la nostra applicazione

Dalla barra di sinistra, clicchiamo su clients e nella nuova schermata clicchiamo create

Assegniamo un ID al nostro client (myclient) e clicchiamo su save

Compiliamo come in schermata l’access-type impostandolo su confidential e la valid redirect url, successivamente clicchiamo save

A questo punto abbiamo finito.

Preleviamo il client_secret dalla tab Credentials, facendo molta attenzione che Client Authenticator sia impostato su Client ID and secret e copiamo il secret

Step 4: eseguiamo la nostra prima autenticazione

Apriamo un terminale ed eseguiamo la nostra cURL in questo modo modificando il client_secret con il vostro appena prelevato:

curl --location --request POST 'http://localhost:8481/realms/realmtest/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=myclient' \
--data-urlencode 'client_secret=xjxdex2ATUGcSOtq7aTOLQqsT3rI7p72' \
--data-urlencode 'username=test' \
--data-urlencode 'password=Test12345!'

Se avete eseguito tutto come descritto, otterrete una risposta di questo tipo:

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJBVjlXUGJfWG9IWWFGYmpIVzhkYTFkcUdjX1Q0ckpWams5TFpuNmpaeEk4In0.eyJleHAiOjE2NTU4OTM5OTksImlhdCI6MTY1NTg5MzY5OSwianRpIjoiZDM3Zjg1NzMtZjE0Mi00OTk5LWFiYzQtNDZmZGI5MzkxMmYwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4NDgxL3JlYWxtcy9yZWFsbXRlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMGQ5ZDEwNzItNjJjOC00NmQ5LTk3ZjEtZTU2Y2ZiMjI1NjVkIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXljbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiN2Y3N2M0NzktMzAzZS00OTFkLWI1NTItY2FjYTVlNjRhNGZmIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImRlZmF1bHQtcm9sZXMtcmVhbG10ZXN0IiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJzaWQiOiI3Zjc3YzQ3OS0zMDNlLTQ5MWQtYjU1Mi1jYWNhNWU2NGE0ZmYiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdCIsImVtYWlsIjoidGVzdEBlbWFpbC5pdCJ9.BNm7-Waji0Ad7XC3Hxp_mrb8kuXJ5TB7QYKkwT1AgAh2F9mEptPUwK6ntH6DPL7fghd2fbXUVWzGOdEGkgWT2aAw6m6oU786gZYc8VKKiEIf9B94FY1FrGIDVGhlAlTcaG7WuXghvnvLSrZR5gYiz4BUbMT3oqyHUB7lcryGscoVTZ6wzoqZyo-YbovokEpzvBezxVLMJbjrMCbOBpHTP4RQ56k_6sNmiJZxJCPLeOMH7XCwll5Q6uwBoTRbx_Ihx4XLUEaEz7M8eAqckaO6h6hw9YkL061FVOiTG8MNH6WBzYP9xulMTQgo8o0sWCwtd3zM9D5bAj5RGsf-UJYJ_Q",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmMmI3NjMwOS1kMTI0LTQ5MmYtOWFlYy0wNWNhYmIyNGMzNDAifQ.eyJleHAiOjE2NTU4OTU0OTksImlhdCI6MTY1NTg5MzY5OSwianRpIjoiMmMyZTdiNmQtM2VmNC00OWZjLWFmYWQtOTA1NDc4NzljODE4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4NDgxL3JlYWxtcy9yZWFsbXRlc3QiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0Ojg0ODEvcmVhbG1zL3JlYWxtdGVzdCIsInN1YiI6IjBkOWQxMDcyLTYyYzgtNDZkOS05N2YxLWU1NmNmYjIyNTY1ZCIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJteWNsaWVudCIsInNlc3Npb25fc3RhdGUiOiI3Zjc3YzQ3OS0zMDNlLTQ5MWQtYjU1Mi1jYWNhNWU2NGE0ZmYiLCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJzaWQiOiI3Zjc3YzQ3OS0zMDNlLTQ5MWQtYjU1Mi1jYWNhNWU2NGE0ZmYifQ.Jk4juoRQ6psuxWPL7uZB8_oefxaKKpXWtA5l0hgbI-g",
    "token_type": "Bearer",
    "not-before-policy": 0,
    "session_state": "7f77c479-303e-491d-b552-caca5e64a4ff",
    "scope": "profile email"
}

Nella prossima guida, vedremo di realizzare una piccola applicazione che si connetterà al servizio di autenticazione, ma per adesso, le basi le abbiamo realizzate.

Articolo precedente

Symfony 6.x, realizzare un'applicazione da zero

Articolo successivo

Installare Docker Engine su Ubuntu

Unisciti alla discussione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.