0

在我们的 scala api 中,我们logstash-logback-encoder用来创建 json 日志。我们想加密一个特定的字段。屏蔽是不够的,因为如果需要来自日志,则需要解密该值。实现这一目标的最佳方法是什么?一种方法可能是创建一个实现,JsonGeneratorDecorator就像有一个用于掩蔽一样。但是鉴于我们知道要屏蔽哪个字段,有没有更简单的方法来实现这一点?


更新:解决方案

我在答案中使用了@Phil Clay 提供的建议。但是,有一个小问题。背后的意图ValueMasker是根据值决定什么/何时屏蔽。例如,使用 RegEx 匹配所有值(net.logstash.logback.mask.RegexValueMasker)。由于它们非常通用的用例,ValueMaskers效率/性能较低。但是,我的用例更具体,因为有一个特定的字段要被屏蔽。根据定义FieldMasker,应该使用,但它不提供值的句柄以允许加密。最后,我创建了一个自定义ValueMasker,但使用了net.logstash.logback.mask.FieldNameBasedFieldMasker如下逻辑:

class FieldNameBasedEncryptionMasker extends ValueMasker {

  private var salt: String = ""
  private var fieldNames: Set[String] = Set.empty

  def addFieldName(fieldName: String): Unit =
    fieldNames = fieldNames + fieldName

  def setSalt(saltValue: String): Unit =
    salt = saltValue

  override def mask(context: JsonStreamContext, value: Any): AnyRef = {
    if (context.hasCurrentName && fieldNames.contains(context.getCurrentName) && value
          .isInstanceOf[CharSequence]) {
        // encrypt value  
    } else null
  }
}

这可以在 `logback.xml 中配置为:

<appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>$host</host>
    <port>$port</port>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <customFields>{"app_name":"${LOG_APP_NAME:-undefined}", "app_env":"${LOG_ENV:-local}"}</customFields>
        <jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
            <valueMasker class="FieldNameBasedEncryptionMasker">
                <salt>$logging-encryption-salt</salt>
                <fieldName>fieldNameToEncrypt1</fieldName>
                <fieldName>fieldNameToEncrypt2</fieldName>
            </valueMasker>
        </jsonGeneratorDecorator>
    </encoder>
</appender>
4

1 回答 1

0

您可以创建net.logstash.logback.mask.ValueMasker加密特定字段的自定义实现,而不是返回标准的掩码值,例如****.

然后将编码器配置为使用您的自定义掩码,如下所示:

<encoder class="net.logstash.logback.encoder.LogstashEncoder">
    <jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
        <valueMasker class="your.custom.EncryptingMasker"/>
    </jsonGeneratorDecorator>
</encoder>
于 2022-02-03T19:38:45.437 回答