【问题标题】:Secure communication between Ingress Controller (Traefik) and backend service on KubernetesIngress Controller (Traefik) 和 Kubernetes 上的后端服务之间的安全通信
【发布时间】:2018-04-13 12:28:52
【问题描述】:

我正在尝试在 Traefik 代理后面的 Kubernetes 集群中保护 Nifi。两者都在 K8S 中作为服务运行。 Traefik 使用公共证书进行保护。我希望它将调用重定向到 nifi,同时保护 Traefik(作为入口控制器)和后端 pod 之间的通信:Nifi。

看起来安全配置应该存在于我的 Ingress YAML 描述符中。看起来我应该发出一个 CA 根来生成 Nifi 自签名证书并将这个 CA 根加载到 Traefik 中,这样它就可以在与 Nifi 握手时验证 Nifi 发送的证书。

但是...我不知道 1)这是否是好方法,2)我如何使用 CA Root 为 NiFi 生成我的商店(信任,...),3)我应该如何设置我的 YAML(insecureSkipVerify 似乎不受支持,...)

提前感谢您的帮助。

干杯,

奥利维尔

【问题讨论】:

  • 我不熟悉 traefik 或 Ingress Controller,但是对于 Apache NiFi,您可以使用包含的 tls-toolkit 生成本地 CA,生成并签署任意数量的节点和客户端证书,并将它们全部放入安全的 JKS 密钥库和信任库中,以便于部署。一个guide is available here
  • 是的,谢谢@Andy,但这并不能解决问题。我(当然)使用 NiFi tls-toolkit 但这会生成自签名证书。所以我需要在 Traefik/Ingress 中接受这个证书。而且我不知道如何在 K8S 中做到这一点。
  • 您可以为 NiFi 生成由外部实体签名的证书,也可以使用 NiFi 自签名 CA 证书并将其导入 Traefik 信任库。我不确定,但我会在 traefik.yaml 文件中查看是否有外部信任库的配置值,或者它是否标识了您需要将 CA 公共证书导入到的现有信任库文件。跨度>
  • @Olivier 你有进步吗?我遇到了同样的问题。在 NiFi 中,我在握手期间收到 bad_certificate 异常。

标签: proxy kubernetes apache-nifi traefik kubernetes-ingress


【解决方案1】:

我遇到了同样的问题,可以使用 insecureSkipVerify 标志解决它。
traefik 的问题在于,NiFi 从 traefik 获取请求并将其自签名证书发送回 traefik 以进行握手。 Traefik 不接受它,因此握手失败,导致 NiFi 中出现bad_certificate 异常(日志级别为DEBUG,因此您必须更改logback.xml 文件)。

因此,一种解决方案可能是将您的自签名证书添加到 traefik,目前这是不可能的,see this (currently) open issue

另一个解决方案是在 traefik 和 NiFi 之间添加一个nginx,而不是“不安全”您现有的 traefik。所以 traefik 与 nginx 交谈 HTTP,它与 NiFi 交谈 HTTPS(这将是我接下来要尝试的事情)。

或者你可以在 traefik 中设置 insecureSkipVerify 标志,就像我在 daemonset.yaml 中所做的那样:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  creationTimestamp: 2018-06-21T16:18:46Z
  generation: 4
  labels:
    k8s-app: traefik-internal
    release: infrastructure
  name: traefik-internal
  namespace: infrastructure
  resourceVersion: "18860064"
  selfLink: /apis/extensions/v1beta1/namespaces/infrastructure/daemonsets/traefik-internal
  uid: c64a20e1-776e-11f8-be83-42010a9c0ff6
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: traefik-internal
      name: traefik-internal
      release: infrastructure
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: traefik-internal
        name: traefik-internal
        release: infrastructure
    spec:
      containers:
      - args:
        - --api
        - --ping
        - --defaultEntryPoints=http,https
        - --logLevel=INFO
        - --accessLog
        - --kubernetes
        - --kubernetes.ingressClass=traefik-internal
        - --metrics.prometheus=true
        - --entryPoints=Name:https Address::443 TLS:/certs/cert.pem,/certs/cert.key
          CA:/certs/clientca.pem
        - --entryPoints=Name:http Address::80 Redirect.EntryPoint:https
        - --insecureSkipVerify=true
        image: traefik:1.6.0-rc6-alpine
        imagePullPolicy: IfNotPresent
        name: traefik-internal
        resources: {}
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /certs
          name: traefik-internal-certs
          readOnly: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: sa-traefik
      serviceAccountName: sa-traefik
      terminationGracePeriodSeconds: 60
      volumes:
      - name: traefik-internal-certs
        secret:
          defaultMode: 420
          secretName: traefik-internal
  templateGeneration: 4
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
status:
  currentNumberScheduled: 3
  desiredNumberScheduled: 3
  numberAvailable: 3
  numberMisscheduled: 0
  numberReady: 3
  observedGeneration: 4
  updatedNumberScheduled: 3

insecureSkipVerify 标志在 spec.containers.args 内更改。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2020-12-12
    • 2017-12-23
    • 1970-01-01
    • 2012-03-22
    • 2014-11-05
    • 2018-08-23
    相关资源
    最近更新 更多