使用 Dlog4j2.formatMsgNoLookups 在 elasticsearch helm 图表中临时修复 log4j

分享于2022年07月17日 elasticsearch elk kubernetes kubernetes-helm log4j 问答
【问题标题】:使用 Dlog4j2.formatMsgNoLookups 在 elasticsearch helm 图表中临时修复 log4j(log4j temporary fix in elasticsearch helm chart using Dlog4j2.formatMsgNoLookups)
【发布时间】:2022-01-16 06:15:38
【问题描述】:

我尝试使用 helm chart 在 AKS 中设置弹性搜索集群,但由于 log4j 漏洞,我想将其设置为选项 -Dlog4j2.formatMsgNoLookups 设置为 true 。当我在 helm 命令中传递参数时,出现未知标志错误。 参考: https://artifacthub.io/packages/helm/elastic/elasticsearch/6.8.16

helm upgrade  elasticsearch elasticsearch --set imageTag=6.8.16 esJavaOpts "-Dlog4j2.formatMsgNoLookups=true"
Error: unknown shorthand flag: 'D' in -Dlog4j2.formatMsgNoLookups=true

我也尝试在 values.yaml 文件中添加以下内容

esConfig: {}
#  elasticsearch.yml: |
#    key:
#      nestedkey: value
log4j2.properties: |
  -Dlog4j2.formatMsgNoLookups = true

但这些值并未添加到 /usr/share/elasticsearch/config/jvm.options /usr/share/elasticsearch/config/log4j2.properties 或环境变量中。


【解决方案1】:

首先,如果这是您到达这里的原因,这里有一个很好的关于缓解 Log4j2 security issue 的知识来源。

以下是为 Elasticsearch 图表编写 values.yaml 的方法:

esConfig:
  log4j2.properties: |
    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

Helm 会生成一个 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: elasticsearch-master-config
  ...
data:
  log4j2.properties: |
    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

Log4j 配置将安装到您的 Elasticsearch 中:

...
volumeMounts:
  ...
  - name: esconfig
    mountPath: /usr/share/elasticsearch/config/log4j2.properties
    subPath: log4j2.properties

更新: 如何设置和添加多个配置文件。

您可以在 values.yaml 中设置其他 ES 配置文件,您在此处指定的所有文件都将成为 ConfigMap 的一部分,每个文件都将挂载到 Elasticsearch 容器中的 /usr/share/elasticsearch/config/ 。示例:

esConfig:
  elasticsearch.yml: |
    node.master: true
    node.data: true

  log4j2.properties: |
    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

  jvm.options: |
    # You can also place a comment here.
    -Xmx1g -Xms1g -Dlog4j2.formatMsgNoLookups=true

  roles.yml: |
    click_admins:
      run_as: [ 'clicks_watcher_1' ]
      cluster: [ 'monitor' ]
      indices:
      - names: [ 'events-*' ]
        privileges: [ 'read' ]
        field_security:
          grant: ['category', '@timestamp', 'message' ]
        query: '{"match": {"category": "click"}}'

以上所有配置仅用于说明如何在 values.yaml 中添加多个配置文件。请用您自己的设置替换这些配置。

  • 谢谢,我可以再问一个吗?目前的配置文件是: [elasticsearch@elasticsearch-master-0 ~]$ ls /usr/share/elasticsearch/config/ elasticsearch.keystore elasticsearch.yml jvm.options log4j2.properties role_mapping.yml roles.yml users users_roles 虽然我在 log4j2.properties 文件中添加了配置参数,但我真的很想在 jvm.options 中添加配置但找不到如何做到这一点。你能帮我吗,因为我不确定配置的优先级?
  • 当然,请查看有关如何添加其他可配置文件的更新答案。
  • 这个答案在两个方面是不正确的。 log4j2 标志应该在 jvm 设置中设置,不建议像这样覆盖 jvm.options 文件。参考: elastic.co/guide/en/elasticsearch/reference/current/…