Masquer les données sensibles dans des journaux avec logback
J'ai besoin d'être en mesure de rechercher un événement pour un certain nombre de modèles et de remplacer le texte dans le dessin avec un masqués valeur. C'est une caractéristique de notre application destinée à éviter que des informations sensibles de tomber dans les journaux. Que l'information peut être à partir d'une grande variété de sources, il n'est pas possible d'appliquer des filtres sur toutes les entrées. Il y a d'ailleurs utilise pour toString() au-delà de connexion et je ne veux pas toString() de masque uniformément pour tous les appels (uniquement l'exploitation forestière).
J'ai essayé d'utiliser le %de remplacement de la méthode dans logback.xml:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'f k\="pin">(.*?)</f','f k\="pin">**********</f'}%n</pattern>
Ce fut un succès (après le remplacement des crochets avec des entités de caractères), mais il ne peut remplacer un modèle unique. Je tiens également à effectuer l'équivalent de
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'pin=(.*?),','pin=**********,'}%n</pattern>
en même temps, mais ne le peuvent pas. Il n'y a aucun moyen de masque deux tendances en une %de les remplacer.
L'autre voie qui a été vaguement discuté sur le interblags est l'extension de quelque chose sur l'appender/codeur/mise en page de la hiérarchie, mais à chaque tentative d'intercepter le ILoggingEvent a entraîné un effondrement de l'ensemble du système, généralement par le biais de l'instanciation des erreurs ou des UnsupportedOperationException.
Par exemple, j'ai essayé l'extension de PatternLayout:
@Component("maskingPatternLayout")
public class MaskingPatternLayout extends PatternLayout {
@Autowired
private Environment env;
@Override
public String doLayout(ILoggingEvent event) {
String message=super.doLayout(event);
String patternsProperty = env.getProperty("bowdleriser.patterns");
if( patternsProperty != null ) {
String[] patterns = patternsProperty.split("|");
for (int i = 0; i < patterns.length; i++ ) {
Pattern pattern = Pattern.compile(patterns[i]);
Matcher matcher = pattern.matcher(event.getMessage());
matcher.replaceAll("*");
}
} else {
System.out.println("Bowdleriser not cleaning! Naughty strings are getting through!");
}
return message;
}
}
et puis en ajustant les logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/touchpoint.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/touchpoint.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</layout>
</encoder>
</appender>
<logger name="com.touchcorp.touchpoint" level="DEBUG" />
<logger name="org.springframework.web.servlet.mvc" level="TRACE" />
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
J'ai essayé beaucoup d'autres insertions, donc je me demandais si quelqu'un a réellement atteint ce que je cherche et si ils pourraient fournir des indices ou d'une solution.
OriginalL'auteur Michael Coxon | 2014-08-13
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'envelopper mise en page à l'aide de
LayoutWrappingEncoder
. Et aussi, je crois que vous ne pouvez pas utiliser le printemps ici comme logback n'est pas géré par spring.Voici la mise à jour de la classe.
Et de l'échantillon logback.xml
Mise à JOUR
Ici sa meilleure approche, Modèle d'ensemble au cours de l'initialisation. telles que nous ne pouvons éviter de les recréer Schéma encore et encore et cette mise en œuvre est proche de réaliste cas d'utilisation.
public class MaskingPatternLayout s'étend PatternLayout {
Et la mise à jour du fichier de Configuration.
Sortie
Une façon de l'intégrer à ressort est de marquer la classe comme un
@Component
. La classe doit avoir un constructeur par défaut et un@Autowired
constructeur. Le autocâblés constructeur peut alors définir les propriétés statiques de la classe afin de remplir les informations requises. Ou vous pouvez utiliserorg.springframework.core.io.support.PathMatchingResourcePatternResolver
pour inspecter les claspath. Ce n'est pas à l'aide de Printemps répertoire, mais vous permet de regarder des choses comme annoté classes.Aussi, comme le code, il semble que seuls le dernier pattern match sera appliquée.
Mise à jour de réponse...... avec une meilleure approche
comment puis-je faire si je suis à l'aide de log4j, pas logback
OriginalL'auteur Karthik Prasad
À partir de la documentation:
Le modèle
p
peut être arbitrairement complexe et, en particulier, peuvent contenir plusieurs conversion de mots clés.Face à un même problème d'avoir à remplacer les 2 modèles dans un message, j'ai juste essayé de
chain
doncp
est juste une invocation de remplacer, dans mon cas:Très travaillé, mais je me demande si je pousse un peu et
p
peut être en effet qu'arbitrairement complexe.Raté le double remplacer. Fonctionne comme un charme. Merci!
OriginalL'auteur Dmitri
Très similaire, mais légèrement différente de l'approche évolue autour de la personnalisation de CompositeConverter et la définition d'un
<conversionRule ...>
dans le logback qui fait référence à la coutume convertisseur.Dans un de mes tech-projets de démonstration, j'ai défini une MaskingConverter classe qui définit une série de modèles de l'enregistrement de l'événement est analysé avec et sur un match de mise à jour qui est utilisé à l'intérieur de mon logback de configuration.
Comme lien-seulement les réponses ne sont pas si bien-aimé ici, DONC je vais poster les parties importantes du code ici et d'expliquer ce qu'il fait et pourquoi il est mis en place comme ça. En commençant par le Java personnalisé basé sur le convertisseur de classe:
Cette classe définit un certain nombre de modèles RegEx le journal respectifs de ligne devrait être comparés et sur un match entraîner une mise à jour de l'événement par le masquage des mots de passe.
Noter que cet exemple de code suppose qu'une ligne de journal ne contient qu'un seul type de mot de passe. Vous êtes bien sûr libre à vous d'adapter la bahvior à vos besoins dans le cas où vous souhaitez sonde de chaque ligne pour de multiples correspondances de modèle.
Pour appliquer ce convertisseur, il suffit d'ajouter la ligne suivante à la logback configuration:
qui définit une nouvelle fonction
mask
qui peut être utilisé dans un modèle afin de masquer les journaux d'événements correspondant à l'un des motifs définis dans la boîte de convertisseur. Cette fonction peut maintenant être utilisé à l'intérieur d'un modèle à dire Logback pour effectuer la logique sur chaque événement de journal. Respectifs modèle pourrait être quelque chose le long des lignes ci-dessous:où
%mask(%msg)
prendra le journal d'origine-ligne d'entrée et effectuer le mot de passe de masquage sur chacune des lignes passés à cette fonction.Que sonder chaque ligne pour un ou plusieurs correspondances de modèle peut être coûteuse, le code Java ci-dessus inclut Marqueurs qui peuvent être utilisés dans les instructions de journalisation pour envoyer certains des méta-informations sur le journal d'instruction lui-même à Logback/SLF4J. Basé sur des marqueurs de ces différents comportements pourrait être réalisable. Dans le scénario présenté un marqueur de l'interface peut être utilisée pour indiquer Logback que la ligne de journal contient des informations confidentielles et nécessite donc de masquage si elle correspond. Toute ligne de journal, qui n'est pas marquée comme confidentielle sera ignoré par ce convertisseur qui permet de pomper les lignes plus vite que pas de filtrage doit être effectuée sur ces lignes.
En Java de tels marqueurs peuvent être ajoutés à un journal déclaration comme ceci:
qui est susceptible de produire un journal ligne similaire à
Received basic auth header: Basic QlRXXXlQ=
pour le ci-dessus mentionné convertisseur personnalisé, ce qui laisse le premier et le dernier couple de caractères dans le tact, mais dissimule le moyen de bits avecXXX
.OriginalL'auteur Roman Vottner