SlideShare a Scribd company logo
1 of 35
Download to read offline
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Liferay Portal Security Audit
Cos’è e come funziona il framework di Security Audit
28/01/18 Liferay Portal Security Audit 1
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Sommario
Scopo....................................................................................................................................................4
1. Introduzione......................................................................................................................................5
2. Architettura.......................................................................................................................................7
3. Dentro Liferay Portal Security Audit..............................................................................................11
4. Come tracciare gli eventi................................................................................................................15
5. Come implementare l’Audit Router...............................................................................................19
6. Come implementare l’Audit Message Processor...........................................................................24
6.1 Implementazione del Login Failure Message Processor.....................................................30
7. Aggiornamento del Liferay Portal Security Audit..........................................................................34
Conclusioni.........................................................................................................................................35
Indice delle Tabelle
Tabella 1: Configurazione della destinazione liferay/audit..................................................................9
Tabella 2: Informazioni addizionali dell'audit message.....................................................................10
Tabella 3: Moduli del sistema Liferay Portal Security Audit.............................................................11
Tabella 4: Componenti di Audit che sono parte del core di Liferay (Portal Kernel)..........................11
Tabella 5: Attributi del messaggio di audit (classe Audit Message)...................................................13
Tabella 6: Nuovi moduli aggiunti al sistema Liferay Portal Security Audit......................................34
Indice delle Figure
Figura 1: Macro Architettura di Liferay Portal Security Audit............................................................7
Figura 2: Diagramma delle classi (parte core) di Liferay Portal Security Audit................................12
Figura 3: Class Diagram del Liferay Portal Security Audit...............................................................14
Figura 4: Configurazione Liferay Portal Security Audit da pannello di controllo.............................21
Figura 5: Abilitazione del Dummy Audit Message processor da pannello di controllo.....................25
28/01/18 Liferay Portal Security Audit 2
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Indice esempi di codice
Code 1: Definizione del componente OSGi che intercetta l'evento AuthFailure...............................16
Code 2: Creazione dell'audit message e invio sul message bus.........................................................18
Code 3: Definizione dell'interfaccia AuditRouter con particolare attenzione al ProxyMode............20
Code 4: Definizione del componente OSGi StandardAuditRouter....................................................20
Code 5: Implementazione del metodo route.......................................................................................22
Code 6: Interfaccia che definisce l'Audit Message Processor............................................................24
Code 7: Implementazione del Dummy Audit Message Processor.....................................................26
Indice Gogo Shell
GogoShell 1: Informazioni sullo Standard Audit Router implementato............................................23
GogoShell 2: Informazioni di dettaglio sul Dummy Audit Message Processor.................................30
GogoShell 3: Informazioni di dettaglio su Login Audit Message Processor.....................................32
GogoShell 4: Controllo stato installazione nuovi bundle Liferay Portal Security Audit...................35
Indice Console
Console 1: Log del messaggio di audit a fronte di un evento di login...............................................28
Console 2: Log del Login Failure Audit Message Processor.............................................................33
Console 3: Email inviata dal Login Failure Audit Message Processor..............................................33
Console 4: Quick-Start per il checkout e installazione dei nuovi moduli Portal Security Audit.......35
28/01/18 Liferay Portal Security Audit 3
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Scopo
Questo articolo nasce con l’obiettivo di spiegare cosa sia e come funziona il Liferay Portal
Security Audit, e di capire come estenderne le funzionalità.
Purtroppo sul portale ufficiale Liferay Developer Network (https://dev.liferay.com) non ho
trovato nessuna documentazione d’interesse a riguardo.
Tutto il lavoro di ricerca e sviluppo che sono riuscito a fare per arrivare a scrivere questo
articolo, nasce da qualche vecchissima documentazione sulla wiki e forum di Liferay, dall’analisi
del codice sorgente della Community Edition (e in particolare del modulo Liferay Portal Security
Audit https://github.com/liferay/com-liferay-portal-security-audit) e da un'approfondita conoscenza
di OSGi1
, quest’ultimo ha fatto sicuramente la differenza.
La versione e edizione di Liferay a cui si farà esclusivamente riferimento è la 7.0.4 (GA5)
Community Edition.
1 La OSGi Alliance (conosciuta come Open Service Gateway initiative), è un'organizzazione che lavora alle
specifiche di un framework che definisce la gestione del modello del ciclo di vita del software, i moduli (chiamati
bundle), un service registry e un ambiente di esecuzione. Partendo da questo Framework sono stati definiti un certo
numero di OSGi Layer (strati), API e servizi.
28/01/18 Liferay Portal Security Audit 4
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
1. Introduzione
Molte organizzazioni hanno la necessità di adottare un meccanismo di Audit Trail2
al fine di
tenere traccia delle azioni svolte dagli utenti sugli oggetti gestiti dal sistema. Tracciare e archiviare
il dettaglio delle operazioni svolte, in molti paesi è un obbligo di legge che deve essere seguito.
Per venire incontro a questa particolare esigenza Liferay ha sviluppato (se non ricordo male
dalla versione 5.3) il Portal Security Audit, un framework che consente di tracciare con il minimo
sforzo, informazioni di audit trail che riguardano sia il portale sia le applicazioni installate sulla
propria istanza.
Il Portal Security Audit è stato progettato in modo tale che sia semplice implementare nuovi
componenti per processare le informazioni di audit trail e memorizzare le stesse sui sistemi più
disparati (syslog, filesystem, code jms, database, etc.).
La maggior parte di voi sa che l’edizione EE3
(o meglio DXP4
) di Liferay, offre OOTB5
il
supporto completo per le funzionalità di Portal Audit Security, dal tracciamento delle informazioni
rilevanti della sicurezza (login, logout, modifiche alle informazioni dell'utente, modifiche ai ruoli
utente, etc.) alla memorizzazione delle stesse su database.
2 Audit Trail (detta anche registro di controllo) è una registrazione cronologica pertinente alla sicurezza, che fornisce
prove documentali della sequenza di attività che hanno interessato in qualsiasi momento un'operazione specifica,
procedura, o evento
3 Enterprise Edition che richiede una sottoscrizione da pagare
4 Digital Experience Platform (per maggiori informazioni consulta il portale https://www.liferay.com/it/digital-
experience-platform) che richiede comunque una sottoscrizione da pagare
5 Out of the box. Significa che la funzionalità è disponibile per tutti gli utenti per impostazione predefinita e non è
necessario pagare in aggiunta per utilizzare tali funzionalità o che deve essere configurato.
28/01/18 Liferay Portal Security Audit 5
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Non so quanti di voi sono a conoscenza del fatto che l’edizione CE6
di Liferay contiene il
framework base del Portal Security Audit ma non l’implementazione delle interfacce software che
consentono di tracciare le informazioni di audit e memorizzarle su qualche tipo supporto. Questo
non è però un problema: le fondamenta sono la base per ogni nuova costruzione.
Da questo momento in poi con il termine Audit Service si farà riferimento all’intero sistema
di Liferay Portal Security Audit.
6 Community Edition
28/01/18 Liferay Portal Security Audit 6
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
2. Architettura
Alfine di garantire un basso grado di accoppiamento, l’Audit Service sfrutta l'architettura del
Message Bus7
di Liferay e la modularità offerta dal framework OSGi adottato in via definitiva con
la versione 7 di Liferay. In Figura 1 è illustrato il diagramma della macro architettura.
Figura 1: Macro Architettura di Liferay Portal Security Audit
7 E’ un componete di Liferay che consente alle applicazioni installate di poter comunicare tra loro attraverso un
sistema basato su messaggi. Per maggiori informazioni è possibile consultare l’articolo Introduzione a Liferay
Message Bus https://www.dontesta.it/2013/03/29/introduzione-a-liferay-message-bus/
28/01/18 Liferay Portal Security Audit 7
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
L’Audit Service gestisce l'elaborazione e la registrazione delle informazioni di audit trail
(sotto forma di messaggi di audit) inviati tramite il Message Bus. Qualunque applicazione Liferay
può quindi produrre messaggi di audit (o audit message) verso la destinazione (di audit) del
Message Bus.
Il Message Bus è l’elemento centrale dell’architettura del sistema di Audit Service, i tre
componenti principali che completano il sistema sono:
• Audit Message Producers: Rappresentano tutte quelle applicazioni o componenti che
generano messaggi di audit al verificarsi di determinati eventi e li inviano al Message Bus.
Per esempio, il componente Scheduler Engine Helper, genera messaggi di audit ogni
qualvolta un job viene eseguito;
• Audit Router: É quel componente responsabile dell’acquisizione del messaggi di audit e di
effettuare l’inoltro degli stessi verso uno o più Audit Processor;
• Audit Message Processor: Sono quei componenti che ricevono i messaggi di audit
dall’Audi Router e provvedono alla loro elaborazione ed archiviazione. Sulla base delle
proprie esigenze, un messaggio di audit potrebbe essere archiviato su di un database, inviato
ad una coda JMS, memorizzato su di un file system, inviato via SMTP, etc.
28/01/18 Liferay Portal Security Audit 8
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
La destinazione liferay/audit (vedi Figura 1) definita dall’interfaccia Destination Names è
opportunamente configurata sul Message Bus attraverso il componente OSGi Audit Messaging
Configurator (vedi Figura 3). Le caratteristiche della destinazione sono quelle mostrate nella tabella
a seguire.
Destination Name liferay/audit (AUDIT)
Destination Type Parallel8
Maximum Queue Size 200 audit message in coda. Valore di default che può essere
sovrascritto agendo sulla configurazione OSGi del componente
(anche da pannello di controllo di Liferay)
Rejected Execution Handler Gestione dell’errore nel caso in cui venga superata la capacità
della coda
Proxy Message Listener Inietta e registra il Proxy Message Listener che riceverà i
messaggi inviati (audit message) dai producers verso questa
destinazione
Tabella 1: Configurazione della destinazione liferay/audit
Il Message Listener registrato sulla destinazione liferay/audit che riceve i message audit, li
inoltra verso uno o più componenti OSGi (detti Audit Message Processor vedi Figura 1) che hanno
la responsabilità di elaborare questi messaggi. É possibile creare uno o più Audit Message
Processor che implementino l’interfaccia Audit Message Processor (vedi Figura 2).
Gli Audit Message Processor possono essere di tipo globale o specifici per tipo di evento (o
Event Type). Questa particolare specifica è dichiarata a livello di annotazione del componente OSGi
attraverso la property eventTypes.
8 Utilizzato nei casi in cui i messaggi devono essere inviati in parallelo. Su questo tipo di destinazione è possibile
agire sulla configurazione del Thread Pool (Asynchronous “Send and Forget”)
28/01/18 Liferay Portal Security Audit 9
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Il Message Listener registrato sulla destinazione dedicata all’audit, svolge a tutti gli effetti le
funzioni di un router o più propriamente di un Message Content-Based Router9
, che sulla base del
valore dell’attributo eventType contenuto sull’audit message, inoltra il messaggio verso l’Audit
Message Processor registrato per lo specifico eventType.
Gli audit message prodotti sono corredati da una serie d’informazioni addizionali che sono
mostrate in Tabella 1. Queste informazioni sono disponibili grazie al componente OSGi Audit Filter
che implementa un Servlet Filter popolando il ThreadLocal Audit Request Thread Local.
Client Host L’hostname del client remoto
Client IP L’indirizzo IP del client remoto
Server Name Il nome del server (hostname o FQDN)
Server Port La porta TCP/IP del server
Session Id L’identificativo della sessione HTTP
Tabella 2: Informazioni addizionali dell'audit message
Il filtro come componente OSGi è disabilitato di default, l’abilitazione e disabilitazione del
componente è regolata da un altro componente OSGi, l’Audit Filter Gatekeeper che abilitata o
disabilita il filtro sulla base della proprietà enabled della configurazione OSGi che ha il
configurationPid:
com.liferay.portal.security.audit.configuration.AuditConfiguration
Tramite il pannello di controllo (Pannello di controllo → Configurazione → Impostazioni di
Sistema → Foundation → Audit), è possibile modificare questa configurazione, decidendo se
abilitare o no l’Audit Service o impostare il numero massimo dei messaggi di audit in coda il cui
valore di default è 200 (vedi Figura 4).
9 É uno degli Enterprise Integration Pattern che fa routing basato sul contenuto per indirizzare ciascun messaggio al
destinatario corretto in base al contenuto del messaggio. Per maggiori informazioni consultare la documentazione
http://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html
28/01/18 Liferay Portal Security Audit 10
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
3. Dentro Liferay Portal Security Audit
Il codice sorgente di Liferay Portal Security Audit è disponibile sul repository GitHub di
Liferay all’indirizzo https://github.com/liferay/com-liferay-portal-security-audit. Il progetto è
costituto dai due moduli mostrati in Tabella 3.
Nome del modulo Descrizione del modulo
portal-security-audit-api Questo modulo definisce le API che sono alla base del sistema di
Audit Service come per esempio quella per Audit Message
Processor
portal-security-audit-wiring Questo modulo è responsabile della configurazione e start-up dei
componenti base del sistema di Audi Service come per esempio
Audit Messaging, Audit Filter, Audit Proxy Router
Tabella 3: Moduli del sistema Liferay Portal Security Audit
In Tabella 4 sono invece mostrati i componenti che sono parte del sistema di audit ma che
risiedono nel core (Portal Kernel) di Liferay all’interno del package com.liferay.portal.kernel.audit.
Nome componente Tipo componente Descrizione del componente
Audit Message Classe É l’entità che descrive l’audit message la cui istanza
contiene le informazioni necessarie per il
tracciamento dell’evento di audit. In Tabella 5 sono
mostrati gli attributi della classe
Audit Router Interfaccia É l’interfaccia che definisce il tipo astratto
AuditRouter il cui ruolo è stato definito nel paragrafo
di descrizione dell’architettura.
Tabella 4: Componenti di Audit che sono parte del core di Liferay (Portal Kernel)
28/01/18 Liferay Portal Security Audit 11
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Figura 2: Diagramma delle classi (parte core) di Liferay Portal Security Audit
Nella Community Edition di Liferay per ottenere un sistema di Audit Service funzionante,
occorre realizzare un componente OSGi che implementi l’interfaccia Audit Router e almeno un
componente OSGi che implementi l’interfaccia Audit Message Processor. Nei prossimi paragrafi
vedremo come implementare questi due essenziali componenti.
In Figura 2 è mostrato parte del class diagram di Liferay Portal Security Audit, dove sono
evidenti le due interfacce che devono essere implementate. L’interfaccia Audit Router richiede
l’implementazione di due metodi:
1. boolean isDeployed(): metodo che indica se il router è disponibile. Ha senso definire che il
router è disponibile quando esiste almeno un componente registrato come Audit Message
Processor;
2. void route(AuditMessage auditMessage): metodo che esegue il routing del messaggio di
audit verso uno o più componenti registrati come Audit Message Processor.
28/01/18 Liferay Portal Security Audit 12
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
L’interfaccia Audit Message Processor richiede l’implementazione di un unico metodo:
1. void process(AuditMessage auditMessage): metodo che processa il messaggio di audit che
riceve in input dall’Audit Router.
La classe Audit Message è una moneta importante di scambio tra i vari componenti del
sistema di Audit Service. In Tabella 5 sono mostrati tutti gli attributi della classe Audit Message.
Nome attributo Descrizione attributo
UserName Lo Username dell'utente che compie l'azione
UserId Lo User ID dell'utente che compie l'azione
Timestamp Il timestamp dell'evento
SessionId Identificativo della sessione HTTP
ServerPort Porta TCP/IP del server
ServerName Nome del server (hostname o FQDN) da cui ha origine l'azione.
Informazione utile per gli ambienti in cluster
Message Il messaggio da catturare
EventType Il tipo di evento da catturare e gestire (LOGIN, LOGOUT, etc.)
CompanyId Il companyId dell'istanza di portale
ClientIp Indirizzo IP remoto del client che esegue l'azione
ClientHost Hostname o FQDN del client remoto che esegue l’azione
ClassPK La chiave primaria dell'oggetto dell'azione
ClassName Il class name id del modello oggetto dell'azione
AdditionalInfo Informazioni aggiuntive in formato JSON che possono essere
incluse nel messaggio
Tabella 5: Attributi del messaggio di audit (classe Audit Message)
28/01/18 Liferay Portal Security Audit 13
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
In Figura 3 è illustrato il class diagram completo.
Figura 3: Class Diagram del Liferay Portal Security Audit
28/01/18 Liferay Portal Security Audit 14
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
4. Come tracciare gli eventi
Dopo aver descritto quali sono e quali responsabilità hanno i componenti del sistema di Audit
Service di Liferay, è giunto il momento di spiegare come fare per tracciare un qualsiasi evento che
possa accadere all’interno del portale.
Prendiamo in esame lo specifico evento Auth Failure che accade ogni qualvolta un processo
di autenticazione fallisce. Tracciare l’evento significa:
1. Realizzare un componete OSGi (per esempio Login Failure) che implementa l’interfaccia
Auth Failure e registrarlo come servizio;
2. Creare tramite la classe Audit Message un nuovo message audit e popolarlo con le
informazioni necessarie;
3. Utilizzare l’Audit Message Router iniettato sul componente OSGi per instradare il
messaggio di audit verso il message bus.
Il codice illustrato in Code 1 mostra la definizione del componente OSGi (via Declarative
Services o DS) Login Failure che intercetta l’evento Auth Failure. L’interfaccia Auth Failure
richiede l’implementazione dei metodi:
• onFailureByEmailAddress: metodo eseguito nel caso in cui fallisca il processo di
autenticazione tramite indirizzo email;
• onFailureByScreenName: metodo eseguito nel caso in cui fallisca il processo di
autenticazione tramite screen name;
• onFailureByUserId: metodo eseguito nel caso in cui fallisca il processo di autenticazione
tramite userId;
28/01/18 Liferay Portal Security Audit 15
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
@Component(
immediate = true,
property = {"key=auth.failure"},
service = AuthFailure.class
)
public class LoginFailure implements AuthFailure {
...
@Reference
private AuditRouter _auditRouter;
}
Code 1: Definizione del componente OSGi che intercetta l'evento AuthFailure
Su ogni metodo andrà scritto il codice per la creazione e popolamento del message audit ed
inoltro del messaggio sul message bus attraverso l’Audit Router, quest’ultimo iniettato tramite
l’annotazione @Reference, così come indicato in Code 1.
Il codice evidenziato in Code 2 mostra appunto la creazione del messaggio di audit attraverso
la classe Audit Message e successivo inoltro al message bus. Da notare che il messaggio di audit è
stato creato per lo specifico evento LOGIN_FAILURE.
Tracciare gli eventi richiede davvero la scrittura di pochissime righe di codice e con i
meccanismi offerti da Liferay, siamo in grado di tracciare una miriade di eventi. Un’attività di audit
molto comune, è quella di tracciare le modifiche (operazioni CRUD10
) alle proprie entità (create via
Service Builder) sfruttando i Model Listener11
.
Qui finisce il come tracciare gli eventi, adesso la responsabilità passa all’Audit Message
Router, il quale provvederà ad inoltrare il messaggio di audit al corretto Audit Message Processor,
10 Creazione, lettura, aggiornamento, eliminazione di una risorsa
11 Sono usati per ascoltare gli eventi di persistenza sui modelli e fare qualcosa in risposta (prima o dopo l'evento). Per
maggiori informazioni consultare la documentazione ufficiale
https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/model-listeners
28/01/18 Liferay Portal Security Audit 16
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
quest’ultimo tratterà il messaggio in modo adeguato. Il codice completo del componente OSGi
Login Failure è disponibile alla URL https://goo.gl/W2sJM6.
28/01/18 Liferay Portal Security Audit 17
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
@Component(
immediate = true,
property = {"key=auth.failure"},
service = AuthFailure.class
)
public class LoginFailure implements AuthFailure {
@Override
public void onFailureByScreenName(
long companyId, String screenName,
Map<String, String[]> headerMap,
Map<String, String[]> parameterMap) {
try {
User user = _userLocalService.getUserByScreenName(
companyId, screenName);
AuditMessage auditMessage = new AuditMessage(
EventTypes.LOGIN_FAILURE, user.getCompanyId(),
user.getUserId(),
user.getFullName(), User.class.getName(),
String.valueOf(user.getPrimaryKey()), null,
additionalInfoJSONObject);
_auditRouter.route(auditMessage);
}
catch (AuditException ae) {
if (_log.isWarnEnabled()) {
_log.warn("Unable to route audit message", ae);
}
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn("Unable to route audit message", e);
}
}
}
@Reference
private AuditRouter _auditRouter;
}
Code 2: Creazione dell'audit message e invio sul message bus
28/01/18 Liferay Portal Security Audit 18
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
5. Come implementare l’Audit Router
Nell’ecosistema dell’Audit Service, l’Audit Router è responsabile della consegna dei messaggi
di audit ai componenti che sono registrati per il trattamento dello specifico messaggio di audit. La
scelta della “rotta” avviene sulla base del contenuto dell’attributo eventType del messaggio di audit.
L’Audit Router che andremo a realizzare sarà anch’esso un componente OSGi che
chiameremo Standard Audit Router e che dovrà soddisfare i seguenti requisiti:
1. Implementare l’interfaccia Audit Router che definisce due metodi:
a) boolean isDeployed(): metodo che indica se il router è disponibile. Ha senso definire
che il router è disponibile quando esiste almeno un componente registrato come Audit
Message Processor;
b) void route(AuditMessage auditMessage): metodo che esegue il routing del messaggio
di audit verso uno o più componenti registrati come Audit Message Processor. Questo
metodo in particolare è annotato per essere eseguito in modo asincrono (vedi Code 3).
2. Conoscere la lista degli Audit Message Processor registrati (come servizi OSGi) ed essere in
grado di riconoscere per quale tipo di evento del messagio sono responsabili. Il tipo di
evento è dichiarato da ogni Audit Message Processor come proprietà del componente;
3. Leggere dalla configurazione OSGi se il sistema di Audit Service è abilitato oppure no;
4. Nel processo di attivazione12
(o starting) il componente deve registrarsi come servizio Proxy
Message Listener impostando la proprietà destination.name con il nome della destinazione
del message bus liferay/audit (vedi DestinationNames.AUDIT).
12 É una fase del ciclo di vita dei bundle OSGi. Per maggiori informazioni a riguardo, consultare
http://www.vogella.com/tutorials/OSGi/article.html#life-cycle-of-plug-ins-in-osgi
28/01/18 Liferay Portal Security Audit 19
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
public interface AuditRouter {
@MessagingProxy(mode = ProxyMode.SYNC)
public boolean isDeployed();
@MessagingProxy(mode = ProxyMode.ASYNC)
public void route(AuditMessage auditMessage) throws AuditException;
}
Code 3: Definizione dell'interfaccia AuditRouter con particolare attenzione al ProxyMode
Il codice mostrato in Code 4 mostra la definizione del componente OSGi Standard Audit
Router che implementa l’interfaccia Audit Router. Notare che questo componente tiene conto della
configurazione OSGi definita dal configurationPid.
Tramite il pannello di controllo (Pannello di controllo → Configurazione → Impostazioni di
Sistema → Foundation → Audit), è possibile modificare questa configurazione, decidendo se
abilitare o no l’Audit Service o impostare il numero massimo dei messaggi di audit in coda il cui
valore di default è 200 (vedi Figura 4).
@Component(
configurationPid =
"com.liferay.portal.security.audit.configuration.AuditConfiguration",
configurationPolicy = ConfigurationPolicy.OPTIONAL,
immediate = true,
service = StandardAuditRouter.class
)
public class StandardAuditRouter implements AuditRouter {
...
}
Code 4: Definizione del componente OSGi StandardAuditRouter
28/01/18 Liferay Portal Security Audit 20
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Figura 4: Configurazione Liferay Portal Security Audit da pannello di controllo
28/01/18 Liferay Portal Security Audit 21
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Il codice illustrato in Code 5, è la parte core dell’implementazione del metodo route. La prima
riga (evidenziata) legge il tipo di evento dal messaggio di audit, la seconda riga (evidenziata) invia
il messaggio di audit a tutti gli Audit Message Processor registrati come globali, la terza riga
(evidenziata) invia il messaggio di audit ai soli Audit Message Processor registrati per lo specifico
evento.
Il codice completo del componente OSGi Standard Audit Router che implementa l’Audit
Router è disponibile alla URL https://goo.gl/Ls5wVn
Chi è il responsabile di “tirar su” la nostra implementazione dell’Audit Router? I due
componenti fondamentali che giocano questo ruolo sono l’Audit Messaging Configurator e l’Audit
Router Proxy Bean Configurator. Questi due componenti sono parte del modulo audit-wiring.
@Override
public void route(AuditMessage auditMessage) throws AuditException {
String eventType = auditMessage.getEventType();
for (AuditMessageProcessor globalAuditMessageProcessor :
_globalAuditMessageProcessors) {
globalAuditMessageProcessor.process(auditMessage);
}
Set<AuditMessageProcessor> auditMessageProcessors =
_auditMessageProcessors.get(eventType);
if (auditMessageProcessors != null) {
for (AuditMessageProcessor auditMessageProcessor :
auditMessageProcessors) {
auditMessageProcessor.process(auditMessage);
}
}
}
Code 5: Implementazione del metodo route
28/01/18 Liferay Portal Security Audit 22
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Supponendo di aver installato sulla propria istanza di Liferay il router Standard Audit Router,
potremmo verificare lo stato dell’installazione e ottenere delle informazioni utili attraverso la Gogo
Shell. A seguire sono mostrate le informazioni ottenute utilizzando i comandi b13
e service14
.
g! b 583
it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583]
Id=583, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0-
ga5/osgi/state/org.eclipse.osgi/583/data
"Registered Services"
{it.dontesta.labs.liferay.portal.security.audit.router.StandardAuditRouter}
= {
auditMessageMaxQueueSize = 200,
service.pid =
com.liferay.portal.security.audit.configuration.AuditConfiguration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.router.StandardAuditRouter,
component.id = 2583,
service.id = 7174,
service.bundleid = 583,
service.scope = bundle
}
...
g! services com.liferay.portal.kernel.messaging.proxy.ProxyMessageListener
{com.liferay.portal.kernel.messaging.proxy.ProxyMessageListener} = {
destination.name = liferay / audit,
service.id = 7175,
service.bundleid = 583,
service.scope = singleton
} "Registered by bundle:"
it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583]
"Bundles using service"
com.liferay.portal.security.audit.wiring_2.0.4 [343]
GogoShell 1: Informazioni sullo Standard Audit Router implementato
13 Elenca le informazioni su un bundle specifico che include il nome simbolico del bundle, l'ID
bundle, la root dei dati, i servizi registrati (forniti) e usati, i pacchetti importati ed esportati e altro
ancora
14 Elenca tutti i servizi che sono stati registrati nel framework dei moduli di Liferay o il dettaglio
del servizio specificato
28/01/18 Liferay Portal Security Audit 23
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
6. Come implementare l’Audit Message Processor
Nell’ecosistema dell’Audit Service, l’Audit Message Processor è quel componente
responsabile del trattamento dei messaggi di audit ricevuti dall’Audit Router.
Ricordiamo che il sistema di Audit Service può disporre di uno o più Audit Message
Processor (ma anche di zero, come nel caso della Community Edition). È possibile configurare due
tipologie di message processor: processori globali e processori per determinati tipi di eventi, in
questo modo siamo nelle condizioni di poter differenziare il luogo dove memorizzare le azioni in
base alla loro tipologia.
La scelta del processore da utilizzare è molto importante perché il numero di messaggi di
audit potrebbe crescere molto rapidamente, quindi potrebbe impattare sulle prestazioni.
Il nostro Audit Message Processor che andremo a realizzare, sarà anch’esso un componente
OSGi che chiameremo Dummy Audit Message Processor e che dovrà implementare l’interfaccia
Audit Message Processor (mostrata in Code 6). Quest’interfaccia dichiara il solo metodo void
process (AuditMessagge auditMessage), richiamato dall’Audit Router (vedi Code 5).
public interface AuditMessageProcessor {
public void process(AuditMessage auditMessage) throws AuditException;
}
Code 6: Interfaccia che definisce l'Audit Message Processor
Il codice mostrato in Code 7 è l’implementazione del componente OSGi Dummy Audit
Message Processor, dichiarato come processore globale specificando la property eventTypes con il
28/01/18 Liferay Portal Security Audit 24
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
valore asterisco (o star) e non farà altro che scrivere in formato JSON su file di log il messaggio di
audit ricevuto.
Questo componente OSGi ha una configurazione associata con il solo parametro enabled, il
cui valore di default è false. Agendo su questo parametro (direttamente da pannello di controllo vedi
Figura 5) si potrà decidere se far processare o no i messaggi di audit.
Figura 5: Abilitazione del Dummy Audit Message processor da pannello di controllo
28/01/18 Liferay Portal Security Audit 25
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
@Component(
configurationPid =
"it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.con
figuration.DummyAuditMessageProcessorConfiguration",
immediate = true,
property = "eventTypes=*",
service = AuditMessageProcessor.class
)
public class DummyAuditMessageProcessor implements AuditMessageProcessor {
@Override
public void process(AuditMessage auditMessage) {
try {
doProcess(auditMessage);
}
catch (Exception e) {
_log.fatal("Unable to process audit message " +
auditMessage, e);
}
}
@Activate
@Modified
protected void activate(Map<String, Object> properties) {
_dummyAuditMessageProcessorConfiguration =
ConfigurableUtil.createConfigurable(
DummyAuditMessageProcessorConfiguration.class,
properties);
}
protected void doProcess(AuditMessage auditMessage) throws Exception
{
if (_dummyAuditMessageProcessorConfiguration.enabled()) {
if(_log.isInfoEnabled()) {
_log.info("Dummy processor processing this Audit
Message => "
+ auditMessage.toJSONObject());
}
}
}
}
Code 7: Implementazione del Dummy Audit Message Processor
28/01/18 Liferay Portal Security Audit 26
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Il codice completo del componente Dummy Audit Message Processor è disponibile alla URL
https://goo.gl/8G2uUF
Nel caso in cui volessimo che questo message processor sia specifico per il soli messaggi di
audit tipo LOGIN_FAILURE, basterebbe cambiare il valore della property eventTypes da asterisco
(o star) con il valore LOGIN_FAILURE.
In Console 1 è mostrato il messaggio di audit ricevuto dal Dummy Audit Message Processor e
inviato al logger. In questo caso è stato registrato un messaggio di audit a fronte di un evento di
login (tramite email) al portale non andato a buon fine (eventType=LOGIN_FAILURE).
28/01/18 Liferay Portal Security Audit 27
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
15:45:02,200 INFO [liferay/audit-1][DummyAuditMessageProcessor:47] Dummy
processor processing this Audit Message => {
"clientHost": "127.0.0.1",
"serverName": "localhost",
"className": "com.liferay.portal.kernel.model.User",
"sessionID": "9412D7B6A3FF03153BA58924373C90B0",
"eventType": "LOGIN_FAILURE",
"serverPort": 8080,
"userName": "Test Test",
"userId": "20156",
"companyId": "20116",
"classPK": "20156",
"clientIP": "127.0.0.1",
"additionalInfo": {
"headers": "{"javaClass":"java.util.HashMap","map":
{"referer":["http://localhost:8080/web/guest/home"],"content-length":
["1579"],"accept-language":["it-IT,it;q=0.8,en-
US;q=0.5,en;q=0.3"],"cookie":["_ga=GA1.1.1443444771.1515593630;
COOKIE_SUPPORT=true; Idea-a0087133=febc0b35-515b-49d0-8242-4cf83b6afe2b;
JSESSIONID=9412D7B6A3FF03153BA58924373C90B0;
LFR_SESSION_STATE_20120=1516897163010; LFR_SESSION_STATE_20156=expired;
GUEST_LANGUAGE_ID=en_US; COMPANY_ID=20116;
ID=2b30564533314a414932335638786f556e66554a38773d3d"],"host":
["localhost:8080"],"upgrade-insecure-requests":["1"],"content-
type":["application/x-www-form-urlencoded"],"connection":["keep-
alive"],"accept-encoding":["gzip, deflate"],"user-agent":
["Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101
Firefox/57.0"],"accept":
["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"]}}",
"reason": "Failed to authenticate by email address"
},
"timestamp": "20180125161926545"
}
Console 1: Log del messaggio di audit a fronte di un evento di login
Supponendo di aver installato sulla propria istanza di Liferay il Dummy Audit Message
Processor, potremmo verificare lo stato e ottenere delle informazioni utili attraverso la Gogo Shell.
A seguire sono mostrate le informazioni ottenute utilizzando i comandi b e service.
28/01/18 Liferay Portal Security Audit 28
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Com’è possibile notare dall’output del comando b 583, dopo il deploy del bundle contenente
il nuovo message processor, il bundle dello Standard Audit Router, vede come servizio OSGi il
componente Dummy Audit Message Processor, da notare anche la proprietà eventTypes impostata
ad asterisco (o star), questo fa in modo che il message processor sia di tipo globale, processerà ogni
tipo di messaggio di audit.
g! b 583
it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583]
Id=583, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0-
ga5/osgi/state/org.eclipse.osgi/583/data
"Registered Services"
...
Services in use:
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.conf
iguration.DummyAuditMessageProcessorConfiguration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.Dumm
yAuditMessageProcessor,
eventTypes = * ,
component.id = 2584,
service.id = 7182,
service.bundleid = 582,
service.scope = bundle
}
g! services com.liferay.portal.security.audit.AuditMessageProcessor
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.conf
iguration.DummyAuditMessageProcessorConfiguration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.Dumm
yAuditMessageProcessor,
eventTypes = * ,
component.id = 2584,
service.id = 7182,
service.bundleid = 582,
service.scope = bundle
}
"Registered by bundle:"
28/01/18 Liferay Portal Security Audit 29
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy_1.0.
0 [582]
"Bundles using service"
it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583]
GogoShell 2: Informazioni di dettaglio sul Dummy Audit Message Processor
6.1 Implementazione del Login Failure Message Processor
Supponiamo di voler fare in modo che il processo di autenticazione non andato a buon fine sia
tracciato tramite l’invio di una mail ad una casella di posta configurata.
Nel capitolo 4. Come tracciare gli eventi abbiamo illustrato il modo d’intercettare tutti i
processi di autenticazione non andati a buon fine e come costruire ed inviare il messaggio di audit
che appartiene al tipo LOGIN_FAILURE.
Per raggiungere quindi l’obiettivo preposto, occorre implementare un message processor
dedicato all’elaborazione dei soli messaggi di audit “taggati” come LOGIN_FAILURE.
28/01/18 Liferay Portal Security Audit 30
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Cosa cambia rispetto al Dummy Audit Message Processor? Quasi nulla, occorre
semplicemente:
• Specificare nella property eventTypes il valore LOGIN_FAILURE
• Cambiare l’implementazione del metodo process() per fare in modo d’inviare il contenuto
del messaggio di audit via email;
• Aggiungere dei parametri di configurazione addizionali necessari per il corretto invio della
email:
◦ reportTo: Imposta l’indirizzo email a cui inviare l’email di audit report;
◦ from: Imposta il mittente dell’email;
◦ emailSubject: Imposta l’oggetto dall’email.
Questo nuovo message processor, il cui nome è Login Failure Audit Message Processor,
andrà ad aggiungersi a quello sviluppato precedentemente. Il codice sorgente completo di questo
nuovo componente OSGi è disponibile alla URL https://goo.gl/Rx58nr
Supponendo di aver installato sulla propria istanza di Liferay il nuovo message processor,
potremmo verificare lo stato d’installazione e ottenere delle informazioni utili attraverso la Gogo
Shell. A seguire sono mostrate le informazioni ottenute utilizzando i comandi b e service.
Com’è possibile notare dall’output del comando b 586, dopo il deploy del bundle contenente
il nuovo message processor, il bundle dello Standard Audit Router, vede come servizio OSGi anche
il nuovo componente Login Failure Message Processor, da notare anche la proprietà eventTypes
impostata al valore LOGIN_FAILURE.
28/01/18 Liferay Portal Security Audit 31
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
g! b 586
it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [587]
Id=587, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0-ga5/osgi/state/org.eclipse.osgi/587/data
Services in use:
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.LoginFailureAuditMessageProce
ssorConfiguration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.LoginFailureAuditMessageProcessor,
eventTypes = LOGIN_FAILURE,
component.id = 2634,
service.id = 7282,
service.bundleid = 586,
service.scope = bundle
}
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.DummyAuditMessageProcessorCon
figuration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.DummyAuditMessageProcessor,
eventTypes = * ,
component.id = 2633,
service.id = 7281,
service.bundleid = 586,
service.scope = bundle
}
g! services com.liferay.portal.security.audit.AuditMessageProcessor
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.DummyAuditMessageProcessorCon
figuration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.DummyAuditMessageProcessor,
eventTypes = * ,
component.id = 2633,
service.id = 7281,
service.bundleid = 586,
service.scope = bundle
}
"Registered by bundle:"
it.dontesta.labs.liferay.portal.security.audit.message.processor_1 .0 .0[586]
"Bundles using service"
it.dontesta.labs.liferay.portal.security.audit.router_1 .0 .0[587]
{com.liferay.portal.security.audit.AuditMessageProcessor} = {
service.pid =
it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.LoginFailureAuditMessageProce
ssorConfiguration,
enabled = true,
component.name =
it.dontesta.labs.liferay.portal.security.audit.message.processor.LoginFailureAuditMessageProcessor,
eventTypes = LOGIN_FAILURE,
component.id = 2634,
service.id = 7282,
service.bundleid = 586,
service.scope = bundle
}
"Registered by bundle:"
it.dontesta.labs.liferay.portal.security.audit.message.processor_1 .0 .0[586]
"Bundles using service"
it.dontesta.labs.liferay.portal.security.audit.router_1 .0 .0[587]
GogoShell 3: Informazioni di dettaglio su Login Audit Message Processor
28/01/18 Liferay Portal Security Audit 32
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
Con questo nuovo audit message processor, ad ogni tentativo di autenticazione fallito, sarà
inviata una mail all’indirizzo specificato in configurazione e contenente il messaggio di audit (vedi
Console 3).
17:22:39,134 INFO [liferay/audit-1][LoginFailureAuditMessageProcessor:74]
Send report audit email to antonio.musarra@gmail.com
Console 2: Log del Login Failure Audit Message Processor
Return-Path: <antonio.musarra@gmail.com>
Received: from mbp-di-antonio.homenet.telecomitalia.it (host175-227-dynamic.7-87-
r.retail.telecomitalia.it. [87.7.227.175])
by smtp.gmail.com with ESMTPSA id d73sm2530485wma.25.2018.01.25.12.50.03
for <antonio.musarra@gmail.com>
(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Thu, 25 Jan 2018 12:50:04 -0800 (PST)
From: antonio.musarra@gmail.com
X-Google-Original-From: noreply-loginfailure@dontesta.it
Date: Thu, 25 Jan 2018 20:50:02 +0000 (GMT)
To: antonio.musarra@gmail.com
Message-ID: <228761971.11516913404175.JavaMail.amusarra@mbp-di-
antonio.homenet.telecomitalia.it>
Subject: Report Login Failure
MIME-Version: 1.0
Content-Type: text/plain;charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Auto-Response-Suppress: AutoReply, DR, NDR, NRN, OOF, RN
{"clientHost":"127.0.0.1","serverName":"localhost","className":"com.liferay=
.portal.kernel.model.User","sessionID":"0042B583005B6E76EE921D9D6EF5D6F6","=
eventType":"LOGIN_FAILURE","serverPort":8080,"userName":"Test Test","userId=
":"20156","companyId":"20116","classPK":"20156","clientIP":"127.0.0.1","add=
itionalInfo":{"headers":"{"javaClass":"java.util.HashMap","map":{"re=
ferer":["http://localhost:8080/web/guest/home"],"content-length":["13=
42"],"x-pjax":["true"],"accept-language":["it-IT,it;q=3D0.8,en-US;q=
=3D0.5,en;q=3D0.3"],"cookie":["_ga=3DGA1.1.1443444771.1515593630; COOKI=
E_SUPPORT=3Dtrue; Idea-a0087133=3Dfebc0b35-515b-49d0-8242-4cf83b6afe2b; JSE=
SSIONID=3D0042B583005B6E76EE921D9D6EF5D6F6; LFR_SESSION_STATE_20120=3D15169=
13386897; LFR_SESSION_STATE_20156=3D1516899679024; GUEST_LANGUAGE_ID=3Den_U=
S"],"host":["localhost:8080"],"x-requested-with":["XMLHttpRequest"=
],"content-type":["multipart/form-data; boundary=3D---------------------=
------1222549060258516924534523787"],"connection":["keep-alive"],"acc=
ept-encoding":["gzip, deflate"],"user-agent":["Mozilla/5.0 (Macintosh=
; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0"],"accept":=
["*/*"]}}","reason":"Failed to authenticate by email address"},"timestamp=
":"20180125205002056"}
Console 3: Email inviata dal Login Failure Audit Message Processor
28/01/18 Liferay Portal Security Audit 33
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
7. Aggiornamento del Liferay Portal Security Audit
Sul capitolo 3. Dentro Liferay Portal Security Audit è stata fatta un’approfondita panoramica
del codice sorgente di Liferay Portal Security Audit (disponibile su GitHub). Nel corso dell’articolo
abbiamo inoltre affrontato come implementare i componenti OSGi necessari per ottenere un sistema
di Audit Service funzionante sulla Community Edition di Liferay.
Come ultra bonus, tutto il codice sviluppato è disponibile sul mio repository GitHub liferay-
portal-security-audit (https://github.com/amusarra/liferay-portal-security-audit). Il progetto è
organizzato così come descritto in Tabella 6.
Nome del modulo Descrizione del modulo
portal-security-audit-capture-events Questo modulo contiene i componenti che catturano
eventi del portale come per esempio AuthFailure. Questi
componenti tracciano gli eventi inviandoli ai message
processor attraverso l’Audit Router
portal-security-audit-router Questo modulo contiene il componente Standard Audit
router che l’implementa l’interfaccia Audit Router
portal-security-message-processor Questo modulo contiene i due message processor che
abbiamo implementato nel corso di quest’articolo e che
sono: Dummy Audit Message Processor e Login Failure
Message Processor
Tabella 6: Nuovi moduli aggiunti al sistema Liferay Portal Security Audit
Questo progetto è un ottimo punto di partenza che potete senz’altro estendere secondo le
vostre esigenze, ottenendo così un sistema di Audit Service partendo dal framework alla base del
Liferay Portal Security Audit. In Console 4 sono mostrati gli step necessari per ottenere e installare i
tre moduli mostrati in Tabella 6.
28/01/18 Liferay Portal Security Audit 34
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
Antonio Musarra’s Blog
The ideal solution for a problem
Document Revision: 1.0.0
Blog: https://www.dontesta.it
LinkedIn: https://www.linkedin.com/in/amusarra
SlideShare: https://www.slideshare.net/amusarra
Twitter: https://twitter.com/antonio_musarra
$ git clone https://github.com/amusarra/liferay-portal-security-audit.git
$ cd liferay-portal-security-audit
$ ./gradlew clean deploy
$ cp ../bundles/osgi/modules/*.jar $LIFERAY_HOME/deploy/
Console 4: Quick-Start per il checkout e installazione dei nuovi moduli Portal Security Audit
Verificare il corretto deploy dei tre bundle tramite il file di log di Liferay o tramite la Gogo
Shell utilizzando il comando lb accertando che lo stato sia Active.
g! lb|grep Audit
342|Active | 10|Liferay Portal Security Audit API (2.0.2)
343|Active | 10|Liferay Portal Security Audit Wiring (2.0.4)
584|Active | 10|Liferay Portal Security Audit Capture Events (1.0.0)
586|Active | 10|Liferay Portal Security Audit Message Processor (1.0.0)
587|Active | 10|Liferay Portal Security Audit Router (1.0.0)
GogoShell 4: Controllo stato installazione nuovi bundle Liferay Portal Security Audit
Conclusioni
Con questo articolo ho cercato di esporre con semplicità il
framework Liferay di Security Audit analizzando il codice sorgente
disponibile su GitHub, con l’obiettivo di realizzare i componenti
mancanti al fine di ottenere un sistema di Audit Service
funzionante in toto anche per la Community Edition.
Spero di essere stato chiaro nell’esposizione e che sia riuscito a
catture il vostro interesse per l’argomento; se così fosse, potreste
restituirmi il favore condividendo l’articolo sui canali di social network o altri, ciò che ho scritto
potrebbe essere utile anche ad altre persone.
28/01/18 Liferay Portal Security Audit 35
Questo documento è rilasciato con licenza Creative Commons
Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)

More Related Content

More from Antonio Musarra

Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleLiferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleAntonio Musarra
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioAntonio Musarra
 
SugarCRM Enterprise Development Virtual Appliance
SugarCRM Enterprise Development Virtual ApplianceSugarCRM Enterprise Development Virtual Appliance
SugarCRM Enterprise Development Virtual ApplianceAntonio Musarra
 
Liferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomLiferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomAntonio Musarra
 
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.Antonio Musarra
 
SugarCRM REST API: Un’applicazione in appena dieci minuti
SugarCRM REST API: Un’applicazione in appena dieci minutiSugarCRM REST API: Un’applicazione in appena dieci minuti
SugarCRM REST API: Un’applicazione in appena dieci minutiAntonio Musarra
 
How to Build a Java client for SugarCRM
How to Build a Java client for SugarCRMHow to Build a Java client for SugarCRM
How to Build a Java client for SugarCRMAntonio Musarra
 
Liferay Web Services - Come importare utenti da un foglio Excel
Liferay Web Services - Come importare utenti da un foglio ExcelLiferay Web Services - Come importare utenti da un foglio Excel
Liferay Web Services - Come importare utenti da un foglio ExcelAntonio Musarra
 
Introduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioIntroduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioAntonio Musarra
 
Introduzione a Liferay Message BUS
Introduzione a Liferay Message BUSIntroduzione a Liferay Message BUS
Introduzione a Liferay Message BUSAntonio Musarra
 
Un CRM dentro un CMS v1.0
Un CRM dentro un CMS v1.0Un CRM dentro un CMS v1.0
Un CRM dentro un CMS v1.0Antonio Musarra
 
Running Kettle Job by API v1.2
Running Kettle Job by API v1.2Running Kettle Job by API v1.2
Running Kettle Job by API v1.2Antonio Musarra
 
SugarCRM Web Services: Build a Apache CXF Client
SugarCRM Web Services: Build a Apache CXF ClientSugarCRM Web Services: Build a Apache CXF Client
SugarCRM Web Services: Build a Apache CXF ClientAntonio Musarra
 
Building a Client .NET for SugarCRM
Building a Client .NET for SugarCRMBuilding a Client .NET for SugarCRM
Building a Client .NET for SugarCRMAntonio Musarra
 
Costruire un client .NET per SugarCRM
Costruire un client .NET per SugarCRMCostruire un client .NET per SugarCRM
Costruire un client .NET per SugarCRMAntonio Musarra
 
Come configurare Liferay 6.0 per Oracle
Come configurare Liferay 6.0 per OracleCome configurare Liferay 6.0 per Oracle
Come configurare Liferay 6.0 per OracleAntonio Musarra
 
HOW TO SAML Password Management (Note)
HOW TO SAML Password Management (Note)HOW TO SAML Password Management (Note)
HOW TO SAML Password Management (Note)Antonio Musarra
 
Come configurare Liferay 6.0 per PostgreSQL
Come configurare Liferay 6.0 per PostgreSQLCome configurare Liferay 6.0 per PostgreSQL
Come configurare Liferay 6.0 per PostgreSQLAntonio Musarra
 
J-SugarCRM UserSync TechnicalGuide
J-SugarCRM UserSync TechnicalGuideJ-SugarCRM UserSync TechnicalGuide
J-SugarCRM UserSync TechnicalGuideAntonio Musarra
 

More from Antonio Musarra (20)

Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleLiferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
 
OSGi e Liferay 7
OSGi e Liferay 7OSGi e Liferay 7
OSGi e Liferay 7
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° Episodio
 
SugarCRM Enterprise Development Virtual Appliance
SugarCRM Enterprise Development Virtual ApplianceSugarCRM Enterprise Development Virtual Appliance
SugarCRM Enterprise Development Virtual Appliance
 
Liferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomLiferay: Esporre Web Services Custom
Liferay: Esporre Web Services Custom
 
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.
SugarCRM: Come realizzare un Custom Scheduler. Un esempio completo.
 
SugarCRM REST API: Un’applicazione in appena dieci minuti
SugarCRM REST API: Un’applicazione in appena dieci minutiSugarCRM REST API: Un’applicazione in appena dieci minuti
SugarCRM REST API: Un’applicazione in appena dieci minuti
 
How to Build a Java client for SugarCRM
How to Build a Java client for SugarCRMHow to Build a Java client for SugarCRM
How to Build a Java client for SugarCRM
 
Liferay Web Services - Come importare utenti da un foglio Excel
Liferay Web Services - Come importare utenti da un foglio ExcelLiferay Web Services - Come importare utenti da un foglio Excel
Liferay Web Services - Come importare utenti da un foglio Excel
 
Introduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioIntroduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo Episodio
 
Introduzione a Liferay Message BUS
Introduzione a Liferay Message BUSIntroduzione a Liferay Message BUS
Introduzione a Liferay Message BUS
 
Un CRM dentro un CMS v1.0
Un CRM dentro un CMS v1.0Un CRM dentro un CMS v1.0
Un CRM dentro un CMS v1.0
 
Running Kettle Job by API v1.2
Running Kettle Job by API v1.2Running Kettle Job by API v1.2
Running Kettle Job by API v1.2
 
SugarCRM Web Services: Build a Apache CXF Client
SugarCRM Web Services: Build a Apache CXF ClientSugarCRM Web Services: Build a Apache CXF Client
SugarCRM Web Services: Build a Apache CXF Client
 
Building a Client .NET for SugarCRM
Building a Client .NET for SugarCRMBuilding a Client .NET for SugarCRM
Building a Client .NET for SugarCRM
 
Costruire un client .NET per SugarCRM
Costruire un client .NET per SugarCRMCostruire un client .NET per SugarCRM
Costruire un client .NET per SugarCRM
 
Come configurare Liferay 6.0 per Oracle
Come configurare Liferay 6.0 per OracleCome configurare Liferay 6.0 per Oracle
Come configurare Liferay 6.0 per Oracle
 
HOW TO SAML Password Management (Note)
HOW TO SAML Password Management (Note)HOW TO SAML Password Management (Note)
HOW TO SAML Password Management (Note)
 
Come configurare Liferay 6.0 per PostgreSQL
Come configurare Liferay 6.0 per PostgreSQLCome configurare Liferay 6.0 per PostgreSQL
Come configurare Liferay 6.0 per PostgreSQL
 
J-SugarCRM UserSync TechnicalGuide
J-SugarCRM UserSync TechnicalGuideJ-SugarCRM UserSync TechnicalGuide
J-SugarCRM UserSync TechnicalGuide
 

Liferay 7 Portal Security Audit

  • 1. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Liferay Portal Security Audit Cos’è e come funziona il framework di Security Audit 28/01/18 Liferay Portal Security Audit 1 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 2. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Sommario Scopo....................................................................................................................................................4 1. Introduzione......................................................................................................................................5 2. Architettura.......................................................................................................................................7 3. Dentro Liferay Portal Security Audit..............................................................................................11 4. Come tracciare gli eventi................................................................................................................15 5. Come implementare l’Audit Router...............................................................................................19 6. Come implementare l’Audit Message Processor...........................................................................24 6.1 Implementazione del Login Failure Message Processor.....................................................30 7. Aggiornamento del Liferay Portal Security Audit..........................................................................34 Conclusioni.........................................................................................................................................35 Indice delle Tabelle Tabella 1: Configurazione della destinazione liferay/audit..................................................................9 Tabella 2: Informazioni addizionali dell'audit message.....................................................................10 Tabella 3: Moduli del sistema Liferay Portal Security Audit.............................................................11 Tabella 4: Componenti di Audit che sono parte del core di Liferay (Portal Kernel)..........................11 Tabella 5: Attributi del messaggio di audit (classe Audit Message)...................................................13 Tabella 6: Nuovi moduli aggiunti al sistema Liferay Portal Security Audit......................................34 Indice delle Figure Figura 1: Macro Architettura di Liferay Portal Security Audit............................................................7 Figura 2: Diagramma delle classi (parte core) di Liferay Portal Security Audit................................12 Figura 3: Class Diagram del Liferay Portal Security Audit...............................................................14 Figura 4: Configurazione Liferay Portal Security Audit da pannello di controllo.............................21 Figura 5: Abilitazione del Dummy Audit Message processor da pannello di controllo.....................25 28/01/18 Liferay Portal Security Audit 2 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 3. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Indice esempi di codice Code 1: Definizione del componente OSGi che intercetta l'evento AuthFailure...............................16 Code 2: Creazione dell'audit message e invio sul message bus.........................................................18 Code 3: Definizione dell'interfaccia AuditRouter con particolare attenzione al ProxyMode............20 Code 4: Definizione del componente OSGi StandardAuditRouter....................................................20 Code 5: Implementazione del metodo route.......................................................................................22 Code 6: Interfaccia che definisce l'Audit Message Processor............................................................24 Code 7: Implementazione del Dummy Audit Message Processor.....................................................26 Indice Gogo Shell GogoShell 1: Informazioni sullo Standard Audit Router implementato............................................23 GogoShell 2: Informazioni di dettaglio sul Dummy Audit Message Processor.................................30 GogoShell 3: Informazioni di dettaglio su Login Audit Message Processor.....................................32 GogoShell 4: Controllo stato installazione nuovi bundle Liferay Portal Security Audit...................35 Indice Console Console 1: Log del messaggio di audit a fronte di un evento di login...............................................28 Console 2: Log del Login Failure Audit Message Processor.............................................................33 Console 3: Email inviata dal Login Failure Audit Message Processor..............................................33 Console 4: Quick-Start per il checkout e installazione dei nuovi moduli Portal Security Audit.......35 28/01/18 Liferay Portal Security Audit 3 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 4. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Scopo Questo articolo nasce con l’obiettivo di spiegare cosa sia e come funziona il Liferay Portal Security Audit, e di capire come estenderne le funzionalità. Purtroppo sul portale ufficiale Liferay Developer Network (https://dev.liferay.com) non ho trovato nessuna documentazione d’interesse a riguardo. Tutto il lavoro di ricerca e sviluppo che sono riuscito a fare per arrivare a scrivere questo articolo, nasce da qualche vecchissima documentazione sulla wiki e forum di Liferay, dall’analisi del codice sorgente della Community Edition (e in particolare del modulo Liferay Portal Security Audit https://github.com/liferay/com-liferay-portal-security-audit) e da un'approfondita conoscenza di OSGi1 , quest’ultimo ha fatto sicuramente la differenza. La versione e edizione di Liferay a cui si farà esclusivamente riferimento è la 7.0.4 (GA5) Community Edition. 1 La OSGi Alliance (conosciuta come Open Service Gateway initiative), è un'organizzazione che lavora alle specifiche di un framework che definisce la gestione del modello del ciclo di vita del software, i moduli (chiamati bundle), un service registry e un ambiente di esecuzione. Partendo da questo Framework sono stati definiti un certo numero di OSGi Layer (strati), API e servizi. 28/01/18 Liferay Portal Security Audit 4 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 5. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 1. Introduzione Molte organizzazioni hanno la necessità di adottare un meccanismo di Audit Trail2 al fine di tenere traccia delle azioni svolte dagli utenti sugli oggetti gestiti dal sistema. Tracciare e archiviare il dettaglio delle operazioni svolte, in molti paesi è un obbligo di legge che deve essere seguito. Per venire incontro a questa particolare esigenza Liferay ha sviluppato (se non ricordo male dalla versione 5.3) il Portal Security Audit, un framework che consente di tracciare con il minimo sforzo, informazioni di audit trail che riguardano sia il portale sia le applicazioni installate sulla propria istanza. Il Portal Security Audit è stato progettato in modo tale che sia semplice implementare nuovi componenti per processare le informazioni di audit trail e memorizzare le stesse sui sistemi più disparati (syslog, filesystem, code jms, database, etc.). La maggior parte di voi sa che l’edizione EE3 (o meglio DXP4 ) di Liferay, offre OOTB5 il supporto completo per le funzionalità di Portal Audit Security, dal tracciamento delle informazioni rilevanti della sicurezza (login, logout, modifiche alle informazioni dell'utente, modifiche ai ruoli utente, etc.) alla memorizzazione delle stesse su database. 2 Audit Trail (detta anche registro di controllo) è una registrazione cronologica pertinente alla sicurezza, che fornisce prove documentali della sequenza di attività che hanno interessato in qualsiasi momento un'operazione specifica, procedura, o evento 3 Enterprise Edition che richiede una sottoscrizione da pagare 4 Digital Experience Platform (per maggiori informazioni consulta il portale https://www.liferay.com/it/digital- experience-platform) che richiede comunque una sottoscrizione da pagare 5 Out of the box. Significa che la funzionalità è disponibile per tutti gli utenti per impostazione predefinita e non è necessario pagare in aggiunta per utilizzare tali funzionalità o che deve essere configurato. 28/01/18 Liferay Portal Security Audit 5 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 6. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Non so quanti di voi sono a conoscenza del fatto che l’edizione CE6 di Liferay contiene il framework base del Portal Security Audit ma non l’implementazione delle interfacce software che consentono di tracciare le informazioni di audit e memorizzarle su qualche tipo supporto. Questo non è però un problema: le fondamenta sono la base per ogni nuova costruzione. Da questo momento in poi con il termine Audit Service si farà riferimento all’intero sistema di Liferay Portal Security Audit. 6 Community Edition 28/01/18 Liferay Portal Security Audit 6 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 7. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 2. Architettura Alfine di garantire un basso grado di accoppiamento, l’Audit Service sfrutta l'architettura del Message Bus7 di Liferay e la modularità offerta dal framework OSGi adottato in via definitiva con la versione 7 di Liferay. In Figura 1 è illustrato il diagramma della macro architettura. Figura 1: Macro Architettura di Liferay Portal Security Audit 7 E’ un componete di Liferay che consente alle applicazioni installate di poter comunicare tra loro attraverso un sistema basato su messaggi. Per maggiori informazioni è possibile consultare l’articolo Introduzione a Liferay Message Bus https://www.dontesta.it/2013/03/29/introduzione-a-liferay-message-bus/ 28/01/18 Liferay Portal Security Audit 7 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 8. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra L’Audit Service gestisce l'elaborazione e la registrazione delle informazioni di audit trail (sotto forma di messaggi di audit) inviati tramite il Message Bus. Qualunque applicazione Liferay può quindi produrre messaggi di audit (o audit message) verso la destinazione (di audit) del Message Bus. Il Message Bus è l’elemento centrale dell’architettura del sistema di Audit Service, i tre componenti principali che completano il sistema sono: • Audit Message Producers: Rappresentano tutte quelle applicazioni o componenti che generano messaggi di audit al verificarsi di determinati eventi e li inviano al Message Bus. Per esempio, il componente Scheduler Engine Helper, genera messaggi di audit ogni qualvolta un job viene eseguito; • Audit Router: É quel componente responsabile dell’acquisizione del messaggi di audit e di effettuare l’inoltro degli stessi verso uno o più Audit Processor; • Audit Message Processor: Sono quei componenti che ricevono i messaggi di audit dall’Audi Router e provvedono alla loro elaborazione ed archiviazione. Sulla base delle proprie esigenze, un messaggio di audit potrebbe essere archiviato su di un database, inviato ad una coda JMS, memorizzato su di un file system, inviato via SMTP, etc. 28/01/18 Liferay Portal Security Audit 8 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 9. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra La destinazione liferay/audit (vedi Figura 1) definita dall’interfaccia Destination Names è opportunamente configurata sul Message Bus attraverso il componente OSGi Audit Messaging Configurator (vedi Figura 3). Le caratteristiche della destinazione sono quelle mostrate nella tabella a seguire. Destination Name liferay/audit (AUDIT) Destination Type Parallel8 Maximum Queue Size 200 audit message in coda. Valore di default che può essere sovrascritto agendo sulla configurazione OSGi del componente (anche da pannello di controllo di Liferay) Rejected Execution Handler Gestione dell’errore nel caso in cui venga superata la capacità della coda Proxy Message Listener Inietta e registra il Proxy Message Listener che riceverà i messaggi inviati (audit message) dai producers verso questa destinazione Tabella 1: Configurazione della destinazione liferay/audit Il Message Listener registrato sulla destinazione liferay/audit che riceve i message audit, li inoltra verso uno o più componenti OSGi (detti Audit Message Processor vedi Figura 1) che hanno la responsabilità di elaborare questi messaggi. É possibile creare uno o più Audit Message Processor che implementino l’interfaccia Audit Message Processor (vedi Figura 2). Gli Audit Message Processor possono essere di tipo globale o specifici per tipo di evento (o Event Type). Questa particolare specifica è dichiarata a livello di annotazione del componente OSGi attraverso la property eventTypes. 8 Utilizzato nei casi in cui i messaggi devono essere inviati in parallelo. Su questo tipo di destinazione è possibile agire sulla configurazione del Thread Pool (Asynchronous “Send and Forget”) 28/01/18 Liferay Portal Security Audit 9 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 10. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Il Message Listener registrato sulla destinazione dedicata all’audit, svolge a tutti gli effetti le funzioni di un router o più propriamente di un Message Content-Based Router9 , che sulla base del valore dell’attributo eventType contenuto sull’audit message, inoltra il messaggio verso l’Audit Message Processor registrato per lo specifico eventType. Gli audit message prodotti sono corredati da una serie d’informazioni addizionali che sono mostrate in Tabella 1. Queste informazioni sono disponibili grazie al componente OSGi Audit Filter che implementa un Servlet Filter popolando il ThreadLocal Audit Request Thread Local. Client Host L’hostname del client remoto Client IP L’indirizzo IP del client remoto Server Name Il nome del server (hostname o FQDN) Server Port La porta TCP/IP del server Session Id L’identificativo della sessione HTTP Tabella 2: Informazioni addizionali dell'audit message Il filtro come componente OSGi è disabilitato di default, l’abilitazione e disabilitazione del componente è regolata da un altro componente OSGi, l’Audit Filter Gatekeeper che abilitata o disabilita il filtro sulla base della proprietà enabled della configurazione OSGi che ha il configurationPid: com.liferay.portal.security.audit.configuration.AuditConfiguration Tramite il pannello di controllo (Pannello di controllo → Configurazione → Impostazioni di Sistema → Foundation → Audit), è possibile modificare questa configurazione, decidendo se abilitare o no l’Audit Service o impostare il numero massimo dei messaggi di audit in coda il cui valore di default è 200 (vedi Figura 4). 9 É uno degli Enterprise Integration Pattern che fa routing basato sul contenuto per indirizzare ciascun messaggio al destinatario corretto in base al contenuto del messaggio. Per maggiori informazioni consultare la documentazione http://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html 28/01/18 Liferay Portal Security Audit 10 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 11. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 3. Dentro Liferay Portal Security Audit Il codice sorgente di Liferay Portal Security Audit è disponibile sul repository GitHub di Liferay all’indirizzo https://github.com/liferay/com-liferay-portal-security-audit. Il progetto è costituto dai due moduli mostrati in Tabella 3. Nome del modulo Descrizione del modulo portal-security-audit-api Questo modulo definisce le API che sono alla base del sistema di Audit Service come per esempio quella per Audit Message Processor portal-security-audit-wiring Questo modulo è responsabile della configurazione e start-up dei componenti base del sistema di Audi Service come per esempio Audit Messaging, Audit Filter, Audit Proxy Router Tabella 3: Moduli del sistema Liferay Portal Security Audit In Tabella 4 sono invece mostrati i componenti che sono parte del sistema di audit ma che risiedono nel core (Portal Kernel) di Liferay all’interno del package com.liferay.portal.kernel.audit. Nome componente Tipo componente Descrizione del componente Audit Message Classe É l’entità che descrive l’audit message la cui istanza contiene le informazioni necessarie per il tracciamento dell’evento di audit. In Tabella 5 sono mostrati gli attributi della classe Audit Router Interfaccia É l’interfaccia che definisce il tipo astratto AuditRouter il cui ruolo è stato definito nel paragrafo di descrizione dell’architettura. Tabella 4: Componenti di Audit che sono parte del core di Liferay (Portal Kernel) 28/01/18 Liferay Portal Security Audit 11 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 12. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Figura 2: Diagramma delle classi (parte core) di Liferay Portal Security Audit Nella Community Edition di Liferay per ottenere un sistema di Audit Service funzionante, occorre realizzare un componente OSGi che implementi l’interfaccia Audit Router e almeno un componente OSGi che implementi l’interfaccia Audit Message Processor. Nei prossimi paragrafi vedremo come implementare questi due essenziali componenti. In Figura 2 è mostrato parte del class diagram di Liferay Portal Security Audit, dove sono evidenti le due interfacce che devono essere implementate. L’interfaccia Audit Router richiede l’implementazione di due metodi: 1. boolean isDeployed(): metodo che indica se il router è disponibile. Ha senso definire che il router è disponibile quando esiste almeno un componente registrato come Audit Message Processor; 2. void route(AuditMessage auditMessage): metodo che esegue il routing del messaggio di audit verso uno o più componenti registrati come Audit Message Processor. 28/01/18 Liferay Portal Security Audit 12 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 13. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra L’interfaccia Audit Message Processor richiede l’implementazione di un unico metodo: 1. void process(AuditMessage auditMessage): metodo che processa il messaggio di audit che riceve in input dall’Audit Router. La classe Audit Message è una moneta importante di scambio tra i vari componenti del sistema di Audit Service. In Tabella 5 sono mostrati tutti gli attributi della classe Audit Message. Nome attributo Descrizione attributo UserName Lo Username dell'utente che compie l'azione UserId Lo User ID dell'utente che compie l'azione Timestamp Il timestamp dell'evento SessionId Identificativo della sessione HTTP ServerPort Porta TCP/IP del server ServerName Nome del server (hostname o FQDN) da cui ha origine l'azione. Informazione utile per gli ambienti in cluster Message Il messaggio da catturare EventType Il tipo di evento da catturare e gestire (LOGIN, LOGOUT, etc.) CompanyId Il companyId dell'istanza di portale ClientIp Indirizzo IP remoto del client che esegue l'azione ClientHost Hostname o FQDN del client remoto che esegue l’azione ClassPK La chiave primaria dell'oggetto dell'azione ClassName Il class name id del modello oggetto dell'azione AdditionalInfo Informazioni aggiuntive in formato JSON che possono essere incluse nel messaggio Tabella 5: Attributi del messaggio di audit (classe Audit Message) 28/01/18 Liferay Portal Security Audit 13 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 14. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra In Figura 3 è illustrato il class diagram completo. Figura 3: Class Diagram del Liferay Portal Security Audit 28/01/18 Liferay Portal Security Audit 14 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 15. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 4. Come tracciare gli eventi Dopo aver descritto quali sono e quali responsabilità hanno i componenti del sistema di Audit Service di Liferay, è giunto il momento di spiegare come fare per tracciare un qualsiasi evento che possa accadere all’interno del portale. Prendiamo in esame lo specifico evento Auth Failure che accade ogni qualvolta un processo di autenticazione fallisce. Tracciare l’evento significa: 1. Realizzare un componete OSGi (per esempio Login Failure) che implementa l’interfaccia Auth Failure e registrarlo come servizio; 2. Creare tramite la classe Audit Message un nuovo message audit e popolarlo con le informazioni necessarie; 3. Utilizzare l’Audit Message Router iniettato sul componente OSGi per instradare il messaggio di audit verso il message bus. Il codice illustrato in Code 1 mostra la definizione del componente OSGi (via Declarative Services o DS) Login Failure che intercetta l’evento Auth Failure. L’interfaccia Auth Failure richiede l’implementazione dei metodi: • onFailureByEmailAddress: metodo eseguito nel caso in cui fallisca il processo di autenticazione tramite indirizzo email; • onFailureByScreenName: metodo eseguito nel caso in cui fallisca il processo di autenticazione tramite screen name; • onFailureByUserId: metodo eseguito nel caso in cui fallisca il processo di autenticazione tramite userId; 28/01/18 Liferay Portal Security Audit 15 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 16. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra @Component( immediate = true, property = {"key=auth.failure"}, service = AuthFailure.class ) public class LoginFailure implements AuthFailure { ... @Reference private AuditRouter _auditRouter; } Code 1: Definizione del componente OSGi che intercetta l'evento AuthFailure Su ogni metodo andrà scritto il codice per la creazione e popolamento del message audit ed inoltro del messaggio sul message bus attraverso l’Audit Router, quest’ultimo iniettato tramite l’annotazione @Reference, così come indicato in Code 1. Il codice evidenziato in Code 2 mostra appunto la creazione del messaggio di audit attraverso la classe Audit Message e successivo inoltro al message bus. Da notare che il messaggio di audit è stato creato per lo specifico evento LOGIN_FAILURE. Tracciare gli eventi richiede davvero la scrittura di pochissime righe di codice e con i meccanismi offerti da Liferay, siamo in grado di tracciare una miriade di eventi. Un’attività di audit molto comune, è quella di tracciare le modifiche (operazioni CRUD10 ) alle proprie entità (create via Service Builder) sfruttando i Model Listener11 . Qui finisce il come tracciare gli eventi, adesso la responsabilità passa all’Audit Message Router, il quale provvederà ad inoltrare il messaggio di audit al corretto Audit Message Processor, 10 Creazione, lettura, aggiornamento, eliminazione di una risorsa 11 Sono usati per ascoltare gli eventi di persistenza sui modelli e fare qualcosa in risposta (prima o dopo l'evento). Per maggiori informazioni consultare la documentazione ufficiale https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/model-listeners 28/01/18 Liferay Portal Security Audit 16 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 17. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra quest’ultimo tratterà il messaggio in modo adeguato. Il codice completo del componente OSGi Login Failure è disponibile alla URL https://goo.gl/W2sJM6. 28/01/18 Liferay Portal Security Audit 17 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 18. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra @Component( immediate = true, property = {"key=auth.failure"}, service = AuthFailure.class ) public class LoginFailure implements AuthFailure { @Override public void onFailureByScreenName( long companyId, String screenName, Map<String, String[]> headerMap, Map<String, String[]> parameterMap) { try { User user = _userLocalService.getUserByScreenName( companyId, screenName); AuditMessage auditMessage = new AuditMessage( EventTypes.LOGIN_FAILURE, user.getCompanyId(), user.getUserId(), user.getFullName(), User.class.getName(), String.valueOf(user.getPrimaryKey()), null, additionalInfoJSONObject); _auditRouter.route(auditMessage); } catch (AuditException ae) { if (_log.isWarnEnabled()) { _log.warn("Unable to route audit message", ae); } } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn("Unable to route audit message", e); } } } @Reference private AuditRouter _auditRouter; } Code 2: Creazione dell'audit message e invio sul message bus 28/01/18 Liferay Portal Security Audit 18 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 19. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 5. Come implementare l’Audit Router Nell’ecosistema dell’Audit Service, l’Audit Router è responsabile della consegna dei messaggi di audit ai componenti che sono registrati per il trattamento dello specifico messaggio di audit. La scelta della “rotta” avviene sulla base del contenuto dell’attributo eventType del messaggio di audit. L’Audit Router che andremo a realizzare sarà anch’esso un componente OSGi che chiameremo Standard Audit Router e che dovrà soddisfare i seguenti requisiti: 1. Implementare l’interfaccia Audit Router che definisce due metodi: a) boolean isDeployed(): metodo che indica se il router è disponibile. Ha senso definire che il router è disponibile quando esiste almeno un componente registrato come Audit Message Processor; b) void route(AuditMessage auditMessage): metodo che esegue il routing del messaggio di audit verso uno o più componenti registrati come Audit Message Processor. Questo metodo in particolare è annotato per essere eseguito in modo asincrono (vedi Code 3). 2. Conoscere la lista degli Audit Message Processor registrati (come servizi OSGi) ed essere in grado di riconoscere per quale tipo di evento del messagio sono responsabili. Il tipo di evento è dichiarato da ogni Audit Message Processor come proprietà del componente; 3. Leggere dalla configurazione OSGi se il sistema di Audit Service è abilitato oppure no; 4. Nel processo di attivazione12 (o starting) il componente deve registrarsi come servizio Proxy Message Listener impostando la proprietà destination.name con il nome della destinazione del message bus liferay/audit (vedi DestinationNames.AUDIT). 12 É una fase del ciclo di vita dei bundle OSGi. Per maggiori informazioni a riguardo, consultare http://www.vogella.com/tutorials/OSGi/article.html#life-cycle-of-plug-ins-in-osgi 28/01/18 Liferay Portal Security Audit 19 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 20. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra public interface AuditRouter { @MessagingProxy(mode = ProxyMode.SYNC) public boolean isDeployed(); @MessagingProxy(mode = ProxyMode.ASYNC) public void route(AuditMessage auditMessage) throws AuditException; } Code 3: Definizione dell'interfaccia AuditRouter con particolare attenzione al ProxyMode Il codice mostrato in Code 4 mostra la definizione del componente OSGi Standard Audit Router che implementa l’interfaccia Audit Router. Notare che questo componente tiene conto della configurazione OSGi definita dal configurationPid. Tramite il pannello di controllo (Pannello di controllo → Configurazione → Impostazioni di Sistema → Foundation → Audit), è possibile modificare questa configurazione, decidendo se abilitare o no l’Audit Service o impostare il numero massimo dei messaggi di audit in coda il cui valore di default è 200 (vedi Figura 4). @Component( configurationPid = "com.liferay.portal.security.audit.configuration.AuditConfiguration", configurationPolicy = ConfigurationPolicy.OPTIONAL, immediate = true, service = StandardAuditRouter.class ) public class StandardAuditRouter implements AuditRouter { ... } Code 4: Definizione del componente OSGi StandardAuditRouter 28/01/18 Liferay Portal Security Audit 20 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 21. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Figura 4: Configurazione Liferay Portal Security Audit da pannello di controllo 28/01/18 Liferay Portal Security Audit 21 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 22. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Il codice illustrato in Code 5, è la parte core dell’implementazione del metodo route. La prima riga (evidenziata) legge il tipo di evento dal messaggio di audit, la seconda riga (evidenziata) invia il messaggio di audit a tutti gli Audit Message Processor registrati come globali, la terza riga (evidenziata) invia il messaggio di audit ai soli Audit Message Processor registrati per lo specifico evento. Il codice completo del componente OSGi Standard Audit Router che implementa l’Audit Router è disponibile alla URL https://goo.gl/Ls5wVn Chi è il responsabile di “tirar su” la nostra implementazione dell’Audit Router? I due componenti fondamentali che giocano questo ruolo sono l’Audit Messaging Configurator e l’Audit Router Proxy Bean Configurator. Questi due componenti sono parte del modulo audit-wiring. @Override public void route(AuditMessage auditMessage) throws AuditException { String eventType = auditMessage.getEventType(); for (AuditMessageProcessor globalAuditMessageProcessor : _globalAuditMessageProcessors) { globalAuditMessageProcessor.process(auditMessage); } Set<AuditMessageProcessor> auditMessageProcessors = _auditMessageProcessors.get(eventType); if (auditMessageProcessors != null) { for (AuditMessageProcessor auditMessageProcessor : auditMessageProcessors) { auditMessageProcessor.process(auditMessage); } } } Code 5: Implementazione del metodo route 28/01/18 Liferay Portal Security Audit 22 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 23. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Supponendo di aver installato sulla propria istanza di Liferay il router Standard Audit Router, potremmo verificare lo stato dell’installazione e ottenere delle informazioni utili attraverso la Gogo Shell. A seguire sono mostrate le informazioni ottenute utilizzando i comandi b13 e service14 . g! b 583 it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583] Id=583, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0- ga5/osgi/state/org.eclipse.osgi/583/data "Registered Services" {it.dontesta.labs.liferay.portal.security.audit.router.StandardAuditRouter} = { auditMessageMaxQueueSize = 200, service.pid = com.liferay.portal.security.audit.configuration.AuditConfiguration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.router.StandardAuditRouter, component.id = 2583, service.id = 7174, service.bundleid = 583, service.scope = bundle } ... g! services com.liferay.portal.kernel.messaging.proxy.ProxyMessageListener {com.liferay.portal.kernel.messaging.proxy.ProxyMessageListener} = { destination.name = liferay / audit, service.id = 7175, service.bundleid = 583, service.scope = singleton } "Registered by bundle:" it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583] "Bundles using service" com.liferay.portal.security.audit.wiring_2.0.4 [343] GogoShell 1: Informazioni sullo Standard Audit Router implementato 13 Elenca le informazioni su un bundle specifico che include il nome simbolico del bundle, l'ID bundle, la root dei dati, i servizi registrati (forniti) e usati, i pacchetti importati ed esportati e altro ancora 14 Elenca tutti i servizi che sono stati registrati nel framework dei moduli di Liferay o il dettaglio del servizio specificato 28/01/18 Liferay Portal Security Audit 23 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 24. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 6. Come implementare l’Audit Message Processor Nell’ecosistema dell’Audit Service, l’Audit Message Processor è quel componente responsabile del trattamento dei messaggi di audit ricevuti dall’Audit Router. Ricordiamo che il sistema di Audit Service può disporre di uno o più Audit Message Processor (ma anche di zero, come nel caso della Community Edition). È possibile configurare due tipologie di message processor: processori globali e processori per determinati tipi di eventi, in questo modo siamo nelle condizioni di poter differenziare il luogo dove memorizzare le azioni in base alla loro tipologia. La scelta del processore da utilizzare è molto importante perché il numero di messaggi di audit potrebbe crescere molto rapidamente, quindi potrebbe impattare sulle prestazioni. Il nostro Audit Message Processor che andremo a realizzare, sarà anch’esso un componente OSGi che chiameremo Dummy Audit Message Processor e che dovrà implementare l’interfaccia Audit Message Processor (mostrata in Code 6). Quest’interfaccia dichiara il solo metodo void process (AuditMessagge auditMessage), richiamato dall’Audit Router (vedi Code 5). public interface AuditMessageProcessor { public void process(AuditMessage auditMessage) throws AuditException; } Code 6: Interfaccia che definisce l'Audit Message Processor Il codice mostrato in Code 7 è l’implementazione del componente OSGi Dummy Audit Message Processor, dichiarato come processore globale specificando la property eventTypes con il 28/01/18 Liferay Portal Security Audit 24 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 25. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra valore asterisco (o star) e non farà altro che scrivere in formato JSON su file di log il messaggio di audit ricevuto. Questo componente OSGi ha una configurazione associata con il solo parametro enabled, il cui valore di default è false. Agendo su questo parametro (direttamente da pannello di controllo vedi Figura 5) si potrà decidere se far processare o no i messaggi di audit. Figura 5: Abilitazione del Dummy Audit Message processor da pannello di controllo 28/01/18 Liferay Portal Security Audit 25 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 26. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra @Component( configurationPid = "it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.con figuration.DummyAuditMessageProcessorConfiguration", immediate = true, property = "eventTypes=*", service = AuditMessageProcessor.class ) public class DummyAuditMessageProcessor implements AuditMessageProcessor { @Override public void process(AuditMessage auditMessage) { try { doProcess(auditMessage); } catch (Exception e) { _log.fatal("Unable to process audit message " + auditMessage, e); } } @Activate @Modified protected void activate(Map<String, Object> properties) { _dummyAuditMessageProcessorConfiguration = ConfigurableUtil.createConfigurable( DummyAuditMessageProcessorConfiguration.class, properties); } protected void doProcess(AuditMessage auditMessage) throws Exception { if (_dummyAuditMessageProcessorConfiguration.enabled()) { if(_log.isInfoEnabled()) { _log.info("Dummy processor processing this Audit Message => " + auditMessage.toJSONObject()); } } } } Code 7: Implementazione del Dummy Audit Message Processor 28/01/18 Liferay Portal Security Audit 26 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 27. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Il codice completo del componente Dummy Audit Message Processor è disponibile alla URL https://goo.gl/8G2uUF Nel caso in cui volessimo che questo message processor sia specifico per il soli messaggi di audit tipo LOGIN_FAILURE, basterebbe cambiare il valore della property eventTypes da asterisco (o star) con il valore LOGIN_FAILURE. In Console 1 è mostrato il messaggio di audit ricevuto dal Dummy Audit Message Processor e inviato al logger. In questo caso è stato registrato un messaggio di audit a fronte di un evento di login (tramite email) al portale non andato a buon fine (eventType=LOGIN_FAILURE). 28/01/18 Liferay Portal Security Audit 27 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 28. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 15:45:02,200 INFO [liferay/audit-1][DummyAuditMessageProcessor:47] Dummy processor processing this Audit Message => { "clientHost": "127.0.0.1", "serverName": "localhost", "className": "com.liferay.portal.kernel.model.User", "sessionID": "9412D7B6A3FF03153BA58924373C90B0", "eventType": "LOGIN_FAILURE", "serverPort": 8080, "userName": "Test Test", "userId": "20156", "companyId": "20116", "classPK": "20156", "clientIP": "127.0.0.1", "additionalInfo": { "headers": "{"javaClass":"java.util.HashMap","map": {"referer":["http://localhost:8080/web/guest/home"],"content-length": ["1579"],"accept-language":["it-IT,it;q=0.8,en- US;q=0.5,en;q=0.3"],"cookie":["_ga=GA1.1.1443444771.1515593630; COOKIE_SUPPORT=true; Idea-a0087133=febc0b35-515b-49d0-8242-4cf83b6afe2b; JSESSIONID=9412D7B6A3FF03153BA58924373C90B0; LFR_SESSION_STATE_20120=1516897163010; LFR_SESSION_STATE_20156=expired; GUEST_LANGUAGE_ID=en_US; COMPANY_ID=20116; ID=2b30564533314a414932335638786f556e66554a38773d3d"],"host": ["localhost:8080"],"upgrade-insecure-requests":["1"],"content- type":["application/x-www-form-urlencoded"],"connection":["keep- alive"],"accept-encoding":["gzip, deflate"],"user-agent": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0"],"accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"]}}", "reason": "Failed to authenticate by email address" }, "timestamp": "20180125161926545" } Console 1: Log del messaggio di audit a fronte di un evento di login Supponendo di aver installato sulla propria istanza di Liferay il Dummy Audit Message Processor, potremmo verificare lo stato e ottenere delle informazioni utili attraverso la Gogo Shell. A seguire sono mostrate le informazioni ottenute utilizzando i comandi b e service. 28/01/18 Liferay Portal Security Audit 28 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 29. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Com’è possibile notare dall’output del comando b 583, dopo il deploy del bundle contenente il nuovo message processor, il bundle dello Standard Audit Router, vede come servizio OSGi il componente Dummy Audit Message Processor, da notare anche la proprietà eventTypes impostata ad asterisco (o star), questo fa in modo che il message processor sia di tipo globale, processerà ogni tipo di messaggio di audit. g! b 583 it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583] Id=583, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0- ga5/osgi/state/org.eclipse.osgi/583/data "Registered Services" ... Services in use: {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.conf iguration.DummyAuditMessageProcessorConfiguration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.Dumm yAuditMessageProcessor, eventTypes = * , component.id = 2584, service.id = 7182, service.bundleid = 582, service.scope = bundle } g! services com.liferay.portal.security.audit.AuditMessageProcessor {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.conf iguration.DummyAuditMessageProcessorConfiguration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy.Dumm yAuditMessageProcessor, eventTypes = * , component.id = 2584, service.id = 7182, service.bundleid = 582, service.scope = bundle } "Registered by bundle:" 28/01/18 Liferay Portal Security Audit 29 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 30. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra it.dontesta.labs.liferay.portal.security.audit.message.processor.dummy_1.0. 0 [582] "Bundles using service" it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [583] GogoShell 2: Informazioni di dettaglio sul Dummy Audit Message Processor 6.1 Implementazione del Login Failure Message Processor Supponiamo di voler fare in modo che il processo di autenticazione non andato a buon fine sia tracciato tramite l’invio di una mail ad una casella di posta configurata. Nel capitolo 4. Come tracciare gli eventi abbiamo illustrato il modo d’intercettare tutti i processi di autenticazione non andati a buon fine e come costruire ed inviare il messaggio di audit che appartiene al tipo LOGIN_FAILURE. Per raggiungere quindi l’obiettivo preposto, occorre implementare un message processor dedicato all’elaborazione dei soli messaggi di audit “taggati” come LOGIN_FAILURE. 28/01/18 Liferay Portal Security Audit 30 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 31. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Cosa cambia rispetto al Dummy Audit Message Processor? Quasi nulla, occorre semplicemente: • Specificare nella property eventTypes il valore LOGIN_FAILURE • Cambiare l’implementazione del metodo process() per fare in modo d’inviare il contenuto del messaggio di audit via email; • Aggiungere dei parametri di configurazione addizionali necessari per il corretto invio della email: ◦ reportTo: Imposta l’indirizzo email a cui inviare l’email di audit report; ◦ from: Imposta il mittente dell’email; ◦ emailSubject: Imposta l’oggetto dall’email. Questo nuovo message processor, il cui nome è Login Failure Audit Message Processor, andrà ad aggiungersi a quello sviluppato precedentemente. Il codice sorgente completo di questo nuovo componente OSGi è disponibile alla URL https://goo.gl/Rx58nr Supponendo di aver installato sulla propria istanza di Liferay il nuovo message processor, potremmo verificare lo stato d’installazione e ottenere delle informazioni utili attraverso la Gogo Shell. A seguire sono mostrate le informazioni ottenute utilizzando i comandi b e service. Com’è possibile notare dall’output del comando b 586, dopo il deploy del bundle contenente il nuovo message processor, il bundle dello Standard Audit Router, vede come servizio OSGi anche il nuovo componente Login Failure Message Processor, da notare anche la proprietà eventTypes impostata al valore LOGIN_FAILURE. 28/01/18 Liferay Portal Security Audit 31 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 32. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra g! b 586 it.dontesta.labs.liferay.portal.security.audit.router_1.0.0 [587] Id=587, Status=ACTIVE Data Root=/opt/liferay-ce-portal-7.0-ga5/osgi/state/org.eclipse.osgi/587/data Services in use: {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.LoginFailureAuditMessageProce ssorConfiguration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.LoginFailureAuditMessageProcessor, eventTypes = LOGIN_FAILURE, component.id = 2634, service.id = 7282, service.bundleid = 586, service.scope = bundle } {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.DummyAuditMessageProcessorCon figuration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.DummyAuditMessageProcessor, eventTypes = * , component.id = 2633, service.id = 7281, service.bundleid = 586, service.scope = bundle } g! services com.liferay.portal.security.audit.AuditMessageProcessor {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.DummyAuditMessageProcessorCon figuration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.DummyAuditMessageProcessor, eventTypes = * , component.id = 2633, service.id = 7281, service.bundleid = 586, service.scope = bundle } "Registered by bundle:" it.dontesta.labs.liferay.portal.security.audit.message.processor_1 .0 .0[586] "Bundles using service" it.dontesta.labs.liferay.portal.security.audit.router_1 .0 .0[587] {com.liferay.portal.security.audit.AuditMessageProcessor} = { service.pid = it.dontesta.labs.liferay.portal.security.audit.message.processor.configuration.LoginFailureAuditMessageProce ssorConfiguration, enabled = true, component.name = it.dontesta.labs.liferay.portal.security.audit.message.processor.LoginFailureAuditMessageProcessor, eventTypes = LOGIN_FAILURE, component.id = 2634, service.id = 7282, service.bundleid = 586, service.scope = bundle } "Registered by bundle:" it.dontesta.labs.liferay.portal.security.audit.message.processor_1 .0 .0[586] "Bundles using service" it.dontesta.labs.liferay.portal.security.audit.router_1 .0 .0[587] GogoShell 3: Informazioni di dettaglio su Login Audit Message Processor 28/01/18 Liferay Portal Security Audit 32 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 33. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra Con questo nuovo audit message processor, ad ogni tentativo di autenticazione fallito, sarà inviata una mail all’indirizzo specificato in configurazione e contenente il messaggio di audit (vedi Console 3). 17:22:39,134 INFO [liferay/audit-1][LoginFailureAuditMessageProcessor:74] Send report audit email to antonio.musarra@gmail.com Console 2: Log del Login Failure Audit Message Processor Return-Path: <antonio.musarra@gmail.com> Received: from mbp-di-antonio.homenet.telecomitalia.it (host175-227-dynamic.7-87- r.retail.telecomitalia.it. [87.7.227.175]) by smtp.gmail.com with ESMTPSA id d73sm2530485wma.25.2018.01.25.12.50.03 for <antonio.musarra@gmail.com> (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 Jan 2018 12:50:04 -0800 (PST) From: antonio.musarra@gmail.com X-Google-Original-From: noreply-loginfailure@dontesta.it Date: Thu, 25 Jan 2018 20:50:02 +0000 (GMT) To: antonio.musarra@gmail.com Message-ID: <228761971.11516913404175.JavaMail.amusarra@mbp-di- antonio.homenet.telecomitalia.it> Subject: Report Login Failure MIME-Version: 1.0 Content-Type: text/plain;charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Auto-Response-Suppress: AutoReply, DR, NDR, NRN, OOF, RN {"clientHost":"127.0.0.1","serverName":"localhost","className":"com.liferay= .portal.kernel.model.User","sessionID":"0042B583005B6E76EE921D9D6EF5D6F6","= eventType":"LOGIN_FAILURE","serverPort":8080,"userName":"Test Test","userId= ":"20156","companyId":"20116","classPK":"20156","clientIP":"127.0.0.1","add= itionalInfo":{"headers":"{"javaClass":"java.util.HashMap","map":{"re= ferer":["http://localhost:8080/web/guest/home"],"content-length":["13= 42"],"x-pjax":["true"],"accept-language":["it-IT,it;q=3D0.8,en-US;q= =3D0.5,en;q=3D0.3"],"cookie":["_ga=3DGA1.1.1443444771.1515593630; COOKI= E_SUPPORT=3Dtrue; Idea-a0087133=3Dfebc0b35-515b-49d0-8242-4cf83b6afe2b; JSE= SSIONID=3D0042B583005B6E76EE921D9D6EF5D6F6; LFR_SESSION_STATE_20120=3D15169= 13386897; LFR_SESSION_STATE_20156=3D1516899679024; GUEST_LANGUAGE_ID=3Den_U= S"],"host":["localhost:8080"],"x-requested-with":["XMLHttpRequest"= ],"content-type":["multipart/form-data; boundary=3D---------------------= ------1222549060258516924534523787"],"connection":["keep-alive"],"acc= ept-encoding":["gzip, deflate"],"user-agent":["Mozilla/5.0 (Macintosh= ; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0"],"accept":= ["*/*"]}}","reason":"Failed to authenticate by email address"},"timestamp= ":"20180125205002056"} Console 3: Email inviata dal Login Failure Audit Message Processor 28/01/18 Liferay Portal Security Audit 33 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 34. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra 7. Aggiornamento del Liferay Portal Security Audit Sul capitolo 3. Dentro Liferay Portal Security Audit è stata fatta un’approfondita panoramica del codice sorgente di Liferay Portal Security Audit (disponibile su GitHub). Nel corso dell’articolo abbiamo inoltre affrontato come implementare i componenti OSGi necessari per ottenere un sistema di Audit Service funzionante sulla Community Edition di Liferay. Come ultra bonus, tutto il codice sviluppato è disponibile sul mio repository GitHub liferay- portal-security-audit (https://github.com/amusarra/liferay-portal-security-audit). Il progetto è organizzato così come descritto in Tabella 6. Nome del modulo Descrizione del modulo portal-security-audit-capture-events Questo modulo contiene i componenti che catturano eventi del portale come per esempio AuthFailure. Questi componenti tracciano gli eventi inviandoli ai message processor attraverso l’Audit Router portal-security-audit-router Questo modulo contiene il componente Standard Audit router che l’implementa l’interfaccia Audit Router portal-security-message-processor Questo modulo contiene i due message processor che abbiamo implementato nel corso di quest’articolo e che sono: Dummy Audit Message Processor e Login Failure Message Processor Tabella 6: Nuovi moduli aggiunti al sistema Liferay Portal Security Audit Questo progetto è un ottimo punto di partenza che potete senz’altro estendere secondo le vostre esigenze, ottenendo così un sistema di Audit Service partendo dal framework alla base del Liferay Portal Security Audit. In Console 4 sono mostrati gli step necessari per ottenere e installare i tre moduli mostrati in Tabella 6. 28/01/18 Liferay Portal Security Audit 34 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)
  • 35. Antonio Musarra’s Blog The ideal solution for a problem Document Revision: 1.0.0 Blog: https://www.dontesta.it LinkedIn: https://www.linkedin.com/in/amusarra SlideShare: https://www.slideshare.net/amusarra Twitter: https://twitter.com/antonio_musarra $ git clone https://github.com/amusarra/liferay-portal-security-audit.git $ cd liferay-portal-security-audit $ ./gradlew clean deploy $ cp ../bundles/osgi/modules/*.jar $LIFERAY_HOME/deploy/ Console 4: Quick-Start per il checkout e installazione dei nuovi moduli Portal Security Audit Verificare il corretto deploy dei tre bundle tramite il file di log di Liferay o tramite la Gogo Shell utilizzando il comando lb accertando che lo stato sia Active. g! lb|grep Audit 342|Active | 10|Liferay Portal Security Audit API (2.0.2) 343|Active | 10|Liferay Portal Security Audit Wiring (2.0.4) 584|Active | 10|Liferay Portal Security Audit Capture Events (1.0.0) 586|Active | 10|Liferay Portal Security Audit Message Processor (1.0.0) 587|Active | 10|Liferay Portal Security Audit Router (1.0.0) GogoShell 4: Controllo stato installazione nuovi bundle Liferay Portal Security Audit Conclusioni Con questo articolo ho cercato di esporre con semplicità il framework Liferay di Security Audit analizzando il codice sorgente disponibile su GitHub, con l’obiettivo di realizzare i componenti mancanti al fine di ottenere un sistema di Audit Service funzionante in toto anche per la Community Edition. Spero di essere stato chiaro nell’esposizione e che sia riuscito a catture il vostro interesse per l’argomento; se così fosse, potreste restituirmi il favore condividendo l’articolo sui canali di social network o altri, ciò che ho scritto potrebbe essere utile anche ad altre persone. 28/01/18 Liferay Portal Security Audit 35 Questo documento è rilasciato con licenza Creative Commons Attribuzione – Non Commerciale – Condividi allo stesso modo 3.0 (CC BY-NC-SA 3.0 IT - https://goo.gl/jYtSzA)