2011-01-05 14 views
5

Obecnie generalnie rejestrujemy wszystkie dokumenty XML przychodzące i wychodzące z naszego systemu, a niektóre z nich zawierają hasła w sposób wyraźny. Chcielibyśmy móc skonfigurować logger logujący/appendera, który robi to w celu dopasowania wzorców lub podobnych i jeśli wykryje, że jest obecne hasło do zastąpienia (z gwiazdkami najprawdopodobniej). Uwaga: nie chcemy odfiltrowywać wpisu dziennika, chcemy go zamaskować. Byłbym wdzięczny za poradę, jak to zrobić z logbackem. Dzięki.Hasła maski z logback?

Odpowiedz

17

Wersja logback 0.9.27 wprowadziła replacement capability. Zastąpienia obsługują wyrażenia regularne. Na przykład, jeśli zalogowany wiadomość była „userid = Alice, pswd =«mój sekret»”, a wzór wyjściowy był

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

wystarczy zmodyfikować wzorzec do

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

Należy zauważyć, że powyższe korzysta z option quoting.

poprzedniej wiadomości dziennika byłoby wyjście jako „id_użytkownika = Alice, pswd =«xxx»”

Dla płonący wydajność, można również zaznaczyć oświadczenie dziennika jako poufne i instruować% zastąpić wykonać wymianę tylko do dziennika oświadczenia oznaczone jako POUFNE. Przykład,

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

Niestety obecna wersja logback nie obsługuje jeszcze zamienników warunkowy (na podstawie markerów lub w inny sposób). Można jednak łatwo napisać własny kod zastępczy, rozszerzając ReplacingCompositeConverter. Krzycz na liście mailingowej użytkownika, jeśli potrzebujesz dodatkowej pomocy.

+1

Świetnie! Wiedziałem, że coś takiego musi tam być w twoim doskonałym produkcie. Dziękuję za Twój wkład w świat Javy! – SingleShot

+0

@Ceki Czy wiesz, czy '% replace (% msg) {...}' działa w połączeniu z wyrażeniami ewaluatora? To znaczy. jeśli zdefiniuję coś w rodzaju ' wiadomość.zawiera ("pw =") || message.contains ("password =") 'czy mogę zastosować reguły wymiany tylko w liniach logu, które spełniają OCENA POUFNE? To znaczy. coś takiego jak '% replace (% msg {CONFIDENTIAL}) {'(pw | password) =. *? (% amp; | $)', '$ 1 = XXX $ 2'}' instrukcje logowania są poprawnie zamaskowane, chociaż wydaje się, że podobnie jak próba zastąpienia na każdej linii dziennika w oparciu o czas wykonania –

+0

'% amp ;, powinien oczywiście być' & 'literówka z mojej strony, ale nie może już edytować komentarza –

1

Wierzę, że maskowanie jest aspektem działalności firmy, a nie aspektem żadnej technologii czy systemu logowania. Istnieją sytuacje, w których hasła, tożsamość narodowa itp. Powinny być maskowane podczas przechowywania ich w DB również z przyczyn prawnych. Powinieneś być w stanie zamaskować xml przed przekazaniem go do programu rejestrującego.

Jednym ze sposobów, aby to zrobić, jest uruchomienie XML przez XSLT, który robi to, a następnie przekazanie go do rejestratora do logowania.

Jeśli nie chcesz tego zrobić, to LogBack ma Filters support, która jest jedną z opcji (nie jest jednak prawidłowa).

Należy jednak pamiętać, że każde ogólne rozwiązanie, które próbuje się znaleźć na poziomie infrastruktury logowania, będzie nieoptymalne, ponieważ każdy komunikat dziennika będzie sprawdzany pod kątem maskowania.

+0

Dzięki. Zgadzam się, ale w tym przypadku wolałbym użyć Logback, jeśli ma taką możliwość. Udawaj, że nie jest to hasło ani XML, a ja po prostu chcę zastąpić jakiś zapisywany tekst. To właśnie chcę wiedzieć, jak to zrobić. – SingleShot

+0

Zaktualizowany mój post (ostatnia linia) –

+0

Filtry służą do odrzucania niechcianych zdarzeń w dzienniku. Nie chcę odrzucać zdarzeń dziennika, ale chcę filtrować/zamieniać/zamaskować komunikaty zdarzeń dziennika, jeśli spełniają one określone kryteria. – SingleShot