(Italiano) Liferay 7: CloudAMQP Audit Message Processor

Sorry, this entry is only available in Italiano.

Qualche giorno addietro ho pubblicato l’articolo Liferay Portal Security Audit con l’obiettivo di spiegare cosa sia e come funziona il sistema di Security Audit di Liferay, e di capire come estenderne le funzionalità. Come ultra-bonus, tutto il codice sorgente sviluppato è pubblicamente disponibile sul mio repository GitHub liferay-portal-security-audit.

 

In Figura 1 è illustrata la macro architettura di Liferay Portal Security Audit. Nel corso dell’articolo abbiamo affrontato come realizzare i due componenti alla base del framework: l’Audit Router ed i gli Audit Message Processor.

 

In questo articolo vorrei mostrarvi come sia semplice creare un nuovo componente di Audit Message Processor che riceve i messaggi di audit inoltrandoli (eventualmente dopo un’elaborazione) ad un sistema middleware orientato ai messaggi (o message-oriented middleware).

 

Macro Architettura di Liferay Portal Security Audit

Figura 1 - Macro Architettura di Liferay Portal Security Audit

Ho deciso d’utilizzare come protocollo di comunicazione tra client e broker l’AMQP. Il protocollo AMQP (Advanced Message Queuing Protocol) è stato sviluppato per risolvere i problemi d’interoperabilità tra diversi prodotti di middleware orientati alla messaggistica.
AMQP (standard internazionale approvato da ISO e IEC come ISO/IEC 19464:2014) è un protocollo di messaggistica wire-level efficiente e affidabile che può essere utilizzato per creare applicazioni di messaggistica multipiattaforma e affidabili.
Questo protocollo assolve a uno scopo semplice, ovvero definire i meccanismi per la trasmissione sicura, affidabile ed efficiente dei messaggi tra due parti. I messaggi stessi vengono codificati usando una rappresentazione dati portatile che consente a mittenti e destinatari eterogenei di scambiarsi messaggi di business strutturati con assoluta fedeltà.
Il nuovo Audit Message Processor che andremo a realizzare, utilizzerà AMQP come protocollo per l’invio dei messaggi di audit verso una specifica coda ospitata da un broker di messaggistica che supporti questo tipo di protocollo. Il broker che ho deciso d’utilizzare per questo esempio è RabbitMQ. In Figura 2 è illustrato il caso appena descritto.

 

Audit Message Processor che processa ed invia i messaggi di audit verso un message broker AMQP

Figura 2 - Audit Message Processor che processa ed invia i messaggi di audit verso un message broker AMQP

 

RabbitMQ è il broker di messaggi open source più diffuso che implementa il protocollo AMQP. Qui, per scopi di comodità andremo ad utilizzare CloudAMQP, server RabbitMQ gestisti in cloud. In Figura 3 è illustrato il flusso di pubblicazione dei messaggi di audit dal Liferay Portal verso il message broker CloudAMQP. I messaggi in coda potranno poi essere consumanti.

 

Invio messaggi tramite AMQP utilizzando il servizio CloudAMQP

Figura 3 - Invio messaggi tramite AMQP utilizzando il servizio CloudAMQP

 

1. 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 di Liferay). È 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.

 

Il nostro Audit Message Processor che andremo a realizzare, sarà un componente OSGi che chiameremo CloudAMQP Audit Message Processor e che dovrà implementare l’interfaccia Audit Message Processor. Quest’interfaccia dichiara il solo metodo void process (AuditMessagge auditMessage), richiamato dall’Audit Router.

 

Prima di andare ad implementare il nuovoAudit Message Processor, vediamo quali sono le caratteristiche:

 

  • Tipo globale. Definito attraverso la property eventTypes dell’annotazione @components OSGi impostata al valore * (star o asterisco)
  • Riceve i messaggi di audit che elabora e poi invia al broker di messaggistica tramite il protocollo AMQP
  • I parametri necessari al fine della comunicazione con CloudAMQP devono essere letti dalla configurazione OSGi

 

In Tabella 1 sono mostrate le principali caratteristiche del message processor che andremo a realizzare. La configurazione OSGi abbinata al nuovo componente è definita tramite l’interfaccia Cloud AMQP Audit Message Processor Configuration disponibile come codice sorgente del progetto liferay-portal-security-audit su GitHub.
Configurazione OSGi
Descrizione
Tipo Globale
Audit Message Processor
di tipo globale.Tutti i
messaggi di audit passano
attraverso questo message
processor
Enabled
Consente di abilitare o
disabilitare il message processor.
Il valore di default è impostato a false
Server Address
Indirizzo IP o FQDN
del server CloudAMQP
User Name
Username di accesso
ai servizi CloudAMQP
Password
Password di accesso
ai servizi CloudAMQP
Queue Name
Nome della coda
definita in CloudAMQP
Tabella 1 - Caratteristiche del CloudAMQP Message Processor

 

Per poter inviare i messaggi di audit verso il message broker attraverso il protocollo AMQP, abbiamo bisogno di una libreria che faciliti il compito. RabbitMQ offre per le più disparate piattaforme e linguaggi, delle librerie che implementano il client che parla in AMQP. Tra i linguaggi supportati c’è anche Java, inoltre, le ultime versioni sono anche OSGi compliant.

 

Gli step necessari per potare a termine l’implementazione del message processor sono:

 

  • Configurazione del client AMQP come dipendenza Gradle (versione del client utilizzata la 5.1.2)
  • Implementazione del metodo void process(AuditMessage auditmessage) che:
    • Verifica che il message processor sia abilitato
    • Trasforma il messaggio di audit in formato JSON e poi in byte (perché richiesto da AMQP)
    • Crea una connessione verso CloudAMQP utilizzando i parametri letti dalla configurazione OSGi
    • Crea il canale di comunicazione
    • Setup della coda (il cui nome è in configurazione OSGi)
    • Pubblicazione del messaggio di audit
    • Chiusura del canale di comunicazione
    • Chiusura della connessione
Il Code 1 mostra parte del file build.gradle per includere la dipendenza del client AMQP. In questo caso la dipendenza deve essere anche inclusa nel bundle finale, ecco il motivo dell’uso di compileInclude.
dependencies {
   compileInclude group: "com.rabbitmq", name: "amqp-client", version: "5.1.2"
   ...
}
Il Code 2 mostra invece la parte core dell’implementazione del metodo process. Il codice completo del CloudAMQPAuditMessageProcessor è disponibile come codice sorgente del progetto liferay-portal-security-audit su GitHub.
    try {
      if (_log.isDebugEnabled()) {
         _log.debug("Try to connect " + _buildAMQPURI() + "...");
      }

      ConnectionFactory factory = new ConnectionFactory();

      factory.setUri(_buildAMQPURI());

      Connection connection = factory.newConnection();

      Channel channel = connection.createChannel();

      channel.queueDeclare(
         _cloudAMQPAuditMessageProcessorConfiguration.queueName(),
         durable, exclusive, autoDelete, null);

      channel.basicPublish("",
         _cloudAMQPAuditMessageProcessorConfiguration.queueName(),
         null,
         auditMessage.toJSONObject().toString().getBytes("UTF-8"));

      channel.close();
      connection.close();
   }
   catch (Exception e) {
      if (_log.isWarnEnabled()) {
         _log.warn(
            "Send Message Audit to Cloud AMQP Queue failed.", e);
      }
   }
}

2. Deploy dell'Audit Message Processor

Il progetto Liferay Portal Security Audit è organizzato così come mostrato in Tabella 2.
Nome del modulo
Descrizione del modulo
portal-security-audit-capture-events
Questo modulocontiene 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 imessage processor: Dummy Audit Message Processor,Login Failure Message Processor e CloudAMQP Audit Message Processor
Tabella 2 - Nuovi moduli aggiunti al sistema Liferay Portal Security Audit

 

Il CloudAMQP Audit Message Processor fa parte del modulo portal-security-message-processor che può essere installato sia sulla Community Edition sia sulla DXP di LIferay. Nel caso d’installazione sulla DXP, occorre installare solo il bundle portal-security-message-processor, al contrario, sulla Community Edition occorre installare i tre bundle dei tre moduli.

 

Per procedere con il deploy seguire gli step indicati a seguire:
$ 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/
g! lb|grep Audit
   43|Active     |   10|Liferay Portal Security Audit Capture Events (1.0.0)
   44|Active     |   10|Liferay Portal Security Audit Message Processor (1.0.0)
   45|Active     |   10|Liferay Portal Security Audit Router (1.0.0)
  350|Active     |   10|Liferay Portal Security Audit API (2.0.2)
  351|Active     |   10|Liferay Portal Security Audit Wiring (2.0.4)

 

3. Configurazione dell'Audit Message Processor

Una volta installato il bundle dell'Audit Message Processor per CloudAMQP, occorre procedere alla configurazione dei parametri di connessione verso la propria istanza di CloudAMQP. In Figura 4 è mostrato un esempio di configurazione.

 

Configurazione OSGi del CloudAMQP Audit Message Processor

Figura 4 - Configurazione OSGi del CloudAMQP Audit Message Processor

 

Ricordo che affichè il message processor funzioni (catturi i messaggi di audit), bisogna abilitare anche il sistema di Audit (sempre da Pannello di Controllo), oltre che se stesso.

 

4. L'Audit Message Processor in azione

A questo punto non resta che mettere alla prova il nuovo Audit Message Processor. A fronte di eventi di LOGIN, LOGIN_FAILURE, etc., sul log di Liferay possiamo verificare delle entry che indicano che i messaggi di audit sono stati pubblicati verso CloudAMQP.

 

18:52:10,827 INFO  [liferay/audit-1][CloudAMQPAuditMessageProcessor:125] Message Audit processed and published on 
liferay_audit_queue Cloud AMQP queue. Details 
{{product=RabbitMQ, 
copyright=Copyright (c) 2007-2017 Pivotal Software, Inc., 
capabilities={exchange_exchange_bindings=true, 
connection.blocked=true, authentication_failure_close=true, 
basic.nack=true, publisher_confirms=true, consumer_cancel_notify=true}, 
information=Licensed under the MPL. See http://www.rabbitmq.com/, 
version=5.1.2, platform=Java}}

 

É possibile verificare la corretta pubblicazione dei messaggi di audit consultando la console di CloudAMQP. Nelle figure a seguire sono mostrati una serie di screenshot che evidenziano il corretto funzionamento dell'Audit Message Processor.
CloudAMQP Console Queue Overview

Figura 5 - CloudAMQP Console Queue Overview

 

CloudAMQP Console Queue List

Figura 6 -CloudAMQP Console Queue List

 

CloudAMQP Console Queue Message View

Figura 7 - CloudAMQP Console Queue Message View

 

Sommario

Con questo articolo ho cercato di spiegare con semplicità in che modo grazie al framework Liferay di Security Audit sia facile creare un Audit Message Processor che pubblichi messaggi di audit su un broker di messaggi utilizzando il protocollo AMQP. Inoltre, con questo articolo abbiamo visto come sia anche facile integrare Liferay con un sistema di messaggistica basato sul protocollo AMQP.

Spero di essere stato chiaro nell'esposizione e che abbia catturato il tuo interesse per l'argomento; se così fosse, potresti restituire il favore condividendo l'articolo sui canali dei social network o su altri, ciò che ho scritto potrebbe essere utile anche ad altre persone.

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

You may also like...