Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Liferay 7 Portal Security Audit

1,025 views

Published on

Cos’è e come funziona il framework di Security Audit.

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à.

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’approfondida conoscenza di OSGi1, e 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.

Published in: Internet
  • Be the first to comment

Liferay 7 Portal Security Audit

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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)

×