
Applicazioni sicure con Keycloack
Keycloak è una soluzione IAM (Identity and Access Management) che consente di mettere in sicurezza le nostre applicazioni con pochissimo codice, visto che tutta la configurazione è gestita lato server come vedremo in seguito.
Per avviare la nostra istanza di test possiamo servirci di un comodo file keycloak-postgres.yml (disponibile anche a questo link) che crea contemporaneamente sia il container di Keycloack che quello del database PostgreSQL utilizzato in questo specifico esempio.
Gli unici requisiti sono Docker e Docker Compose.
Ovviamente si possono utilizzare anche DBMS differenti adattando la configurazione di conseguenza.
version: '3'
volumes:
postgres_data:
driver: local
services:
postgres:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: password
keycloak:
image: quay.io/keycloak/keycloak:legacy
environment:
DB_VENDOR: POSTGRES
DB_ADDR: postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_SCHEMA: public
DB_PASSWORD: password
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: Pa55w0rd
# Uncomment the line below if you want to specify JDBC parameters. The parameter below is just an example, and it shouldn't be used in production without knowledge. It is highly recommended that you read the PostgreSQL JDBC driver documentation in order to use it.
#JDBC_PARAMS: "ssl=true"
ports:
- 8080:8080
depends_on:
- postgres
Nel primo servizio relativo al DBMS PostgreSQL sono presenti alcune variabili d'ambiente per impostare il database e le credenziali d'accesso allo stesso.
Inoltre viene impostato un volume per gestire la persistenza dei dati all'interno dello stesso database.
Nel secondo servizio relativo a Keycloack compaiono una serie di variabili d'ambiente necessarie per il corretto collegamento con il database che andrà a memorizzare tutte le configurazioni del server.
Bisogna indicare prima di tutto il tipo di database impostando POSTGRES nel nostro caso.
Quindi dobbiamo specificare l'indirizzo del db a cui collegarsi utilizzando il nome del servizio all'interno del keycloack-postgres.yml ovvero postgres
in questo esempio.
Seguono il nome del database, quello dello schema (normalmente public
) e la relativa password.
DB_VENDOR: POSTGRES
DB_ADDR: postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_SCHEMA: public
DB_PASSWORD: password
Da ultimo impostiamo le credenziali dell'utente amministratore del sistema.
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: Pa55w0rd
La porta di default è la 8080, ma può essere modificata senza problemi.
Avviamo i container da terminale con il solito
docker-compose -f keycloack-postgres.yml up -d
N.B. L'avvio del container di Keycloack può richiedere qualche minuto durante il quale la pagina web non sarà accessibile.
Il link da utilizzare nel browser é http://localhost:8080 che in automatico rimanda su http://localhost:8080/auth.
Dobbiamo configurare la piattaforma per gestire i vari aspetti relativi all'autenticazione e all'autorizzazione accedendo alla Administration Console con le credenziali di amministratore.
Effettuato il login si accede alla dashboard principale in cui viene mostrato il realm "Master".
Il termine realm indica un oggetto che definisce una politica di sicurezza da applicare ad un gruppo di utenti con le loro credenziali, ruoli e gruppi. In un certo senso può essere considerato l'equivalente di un tenant.
In questo modo è possibile definire un partizionamento degli utenti all'interno di uno stesso server garantendo un elevato livello di isolamento, visto che ciascun utente appartiene ad un solo specifico realm.
Aggiungiamo un nuovo realm facendo click sul relativo pulsante.
Al momento è sufficiente specificare solo il nome da attribuire al realm, tralasciando tutte le altre impostazioni disponibili.
Tra le opzioni disponibili vi è anche l'importazione da un file JSON proveniente da una differente installazione.
Il passo successivo consiste nella creazione degli utenti che potranno in seguito accedere alla nostra applicazione.
Selezionando la voce Users nel menu di sinistra viene mostrato l'elenco (attualmente vuoto) con la possibilità di fare delle aggiunte.
I requisiti minimi sono lo username (che comunque è obbligatorio) e l'impostazione dell'email verificata, bypassando la procedura di validazione richiesta per la quale sarebbe necessario indicare un indirizzo.
Come si nota dall'immagine è possibile specificare molte altre informazioni, ma per il momento possiamo sorvolare.
Dopo aver salvato il nuovo utente possiamo notare l'assegnazione in automatico del suo identificativo.
Selezionando la scheda Credentials andiamo ad impostare una password e disabilitiamo l'opzione Temporary se non vogliamo che ci venga richiesto di modificarla al primo accesso effettuato.
Naturalmente la password non è visualizzabile in chiaro per ovvi motivi di sicurezza, ma si possono avere dei dettagli sull'algoritmo utilizzato oltre a poterla rimuovere.
Completata la configurazione di base del server testiamo in che modo un'applicazione può sfruttare Keycloack per l'autenticazione.
Prima di tutto occorre creare un client per processare tutte le richieste.
Accediamo alla Admin Console (http://localhost:8080/auth/admin) con le credenziali di amministratore.
Facciamo click sulla voce Clients ed inseriamo i dati richiesti dal form ovvero il nome del client (obbligatorio) e il protocollo che di default é impostato su openid-connect.
Keycloak mette a disposizione un'applicazione di esempio per testare il funzionamento del server di autenticazione appena installato senza dover scrivere alcun codice.
L'applicazione è accessibile al link https://www.keycloak.org/app/ per cui inseriamo questa URL nel campo Root URL.
A questo punto siamo pronti per il test!!
Accediamo da browser all'applicazione di prova su https://www.keycloak.org/app/ ed inseriamo l'url del server di Keycloak ovvero http://localhost:8080/auth) oltre ai nomi del realm (springboot) e del client (test-keycloack) appena configurati.
Ora possiamo autenticarci premendo il tasto Sign in e inserendo le credenziali dell'unico utente che abbiamo impostato.
Se tutto è ok vedremo un messaggio di saluto da parte dell'applicazione.
Nel prossimo articolo vedremo come mettere in sicurezza un'applicazione Spring Boot utilizzando proprio Keycloack.
[VIDEO]
[APPROFONDIMENTI]
- https://www.keycloak.org/
- https://github.com/keycloak/keycloak-containers/tree/main/docker-compose-examples
- https://techblog.smc.it/it/2021-10-15/how-to-connect-keycloak-liferay-openid-connect
[LINKS]
- Tutorial di Spring Boot - Indice argomenti
- Esercitazioni di Spring Boot - Indice argomenti
- Flashcards Anki per lo studio
- Libri consigliati
- Esempi Docker