2011-01-05 20 views
5

Attualmente registriamo genericamente tutti i documenti XML in arrivo e in uscita dal nostro sistema e alcuni di essi contengono password in chiaro. Ci piacerebbe essere in grado di configurare il logback logger/appender che sta facendo questo per eseguire alcuni pattern matching o simili e se rileva una password è presente per sostituirlo (con asterischi molto probabilmente). Nota che non vogliamo filtrare la voce del registro, vogliamo mascherarne una parte. Gradirei consigli su come ciò avverrebbe con il logback. Grazie.Maschera password con Logback?

risposta

17

La versione di logback 0.9.27 ha introdotto replacement capability. I sostituti supportano le espressioni regolari. Ad esempio, se il messaggio registrato è stato "userid = alice, pswd = 'il mio segreto'", e il modello di produzione è stata

"%d [%t] $logger - %msg%n", 

basta modificare il modello di

"%d [%t] $logger - %replace(%msg){"pswd='.*'", "pswd='xxx'"}%n" 

Si noti che quanto sopra fa uso di option quoting.

Il messaggio di log precedente sarebbe uscita come "userid = alice, pswd = 'xxx'"

Per prestazioni eccezionali, si potrebbe anche segnare la dichiarazione di registro in modo riservato e istruire% sostituire per effettuare la sostituzione solo per i log dichiarazioni contrassegnate come RISERVATE. Esempio,

Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL"); 
logger.info(confidential, "userid={}, password='{}'", userid, password); 

Purtroppo, la versione attuale di logback non ancora supporta le sostituzioni condizionali (sulla base di indicatori o altro). Tuttavia, è possibile scrivere facilmente il proprio codice sostitutivo estendendo ReplacingCompositeConverter. Urla sulla mailing list di logback-user se hai bisogno di ulteriore assistenza.

+1

Ottimo! Sapevo che qualcosa del genere doveva esserci nel tuo eccellente prodotto. Grazie per i tuoi contributi al mondo Java! – SingleShot

+0

@Ceki Sapete se '% replace (% msg) {...}' funziona in combinazione con le espressioni di valutazione? Cioè se definisco qualcosa come ' messaggio.contiene ("pw =") || message.contains ("password =") 'Posso applicare le regole di sostituzione solo su righe di log che soddisfano il valutatore di espressioni CONFIDENTIAL? Cioè qualcosa come '% replace (% msg {CONFIDENTIAL}) {'(pw | password) =. *? (% amp; | $)', '$ 1 = XXX $ 2'}' le istruzioni del registro sono mascherate correttamente, anche se ci si sente come la sostituzione viene tentata su ogni riga di registro in base al tempo di esecuzione –

+0

'% amp;' deve essere ovviamente '&' typo da parte mia ma non posso più modificare il commento –

1

Credo che il mascheramento sia un aspetto della vostra attività, non l'aspetto di qualsiasi tecnologia o sistema di registrazione. Vi sono situazioni in cui le password, le identità nazionali, ecc. Devono essere mascherate mentre vengono archiviate nel DB, per motivi legali. Dovresti essere in grado di mascherare l'xml prima di darlo al logger.

Un modo per farlo è eseguire l'XML tramite XSLT che esegue tale operazione e quindi assegnarlo al logger per la registrazione.

Se non si desidera eseguire questa operazione, LogBack dispone di Filters support che è una delle opzioni (non quella giusta).

Ma è comprensibile che qualsiasi soluzione generica pronta per l'uso che si sta tentando di trovare a livello di infrastruttura di registrazione sarà subottimale poiché ogni messaggio di registro verrà controllato per il mascheramento.

+0

Grazie. Sono d'accordo, anche se in questo caso preferirei usare Logback se ha questa capacità. Fingi che non sia una password o un XML e voglio solo sostituire un testo che viene registrato. Questo è quello che voglio sapere come fare. – SingleShot

+0

Aggiornato il mio post (ultima riga) –

+0

I filtri servono per scartare eventi di registro indesiderati. Non voglio eliminare gli eventi del registro ma voglio filtrare/sostituire/mascherare i messaggi degli eventi di log se soddisfano determinati criteri. – SingleShot