Apache Ignite の起動を妨げない NetworkPolicy を使用して出力トラフィックをホワイトリストに登録する方法を教えてください。

Apache Ignite の起動を妨げない NetworkPolicy を使用して出力トラフィックをホワイトリストに登録する方法を教えてください。

多少複雑なマイクロサービス アーキテクチャがあり、Apache Ignite がステートレス データベース / キャッシュとして使用されています。Ignite はPod唯一のPod存在であり、アーキテクチャはセキュリティ監査に合格する必要がありますが、トラフィックに対して可能なNamespace限りの制限を適用しないと合格できません。Ignite 自体に必要のないすべてのトラフィックを制限する必要があります。NetworkPolicyegress

最初、私はこう思いました。いいですね。Ignite は他の にトラフィックをプッシュしませんPod(その には他のポッドはありません)。そのため、 Ignite のみが存在する 内のすべてのトラフィックNamespaceを制限することで、これは簡単に実現できます。egressNamespacePod...

まあ、実際にはうまくいきませんでした。Igniteのドキュメントに記載されているすべてのポートへのトラフィックを許可したとしても、起動に失敗し、次のようなエラー
が発生します。egressIgniteSpiExceptionIgnite ポッドの IP アドレスを取得できませんでしたCaused by: java.net.ConnectException: Operation timed out (Connection timed out)

問題は、TcpDiscoveryKubernetsIpFinder、特にIgnite ノードの IP アドレスを登録するためにgetRegisteredAddresses(...)内で明らかに出力トラフィックを実行するメソッド。検出ポート 47500 は当然許可されますが、それによって状況が変わることはありません。他の からの他の との Ignite の機能は、ルールを適用しなくても動作しています。つまり、(私にとっては) の、 、 に関する構成やIgnite 自体の xml 構成などが正しいようです。他の名前空間からのトラフィックを制限するルールも期待どおりに動作しており、必要なトラフィックを正確に許可しています。NamespacePodNamespaceegressClusterRoleClusterRoleBindingServiceNamespaceingress

私が適用したポリシーは次のとおりです。

[動作中、不要なトラフィックのみをブロック]:

## Denies all Ingress traffic to all Pods in the Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress-in-cache-ns
  namespace: cache-ns
spec:
  # selecting nothing here will deny all traffic between pods in the namespace
  podSelector:
    matchLabels: {}
  # traffic routes to be considered, here: incoming exclusively
  policyTypes:
    - Ingress
## Allows necessary ingress traffic
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: netpol-cache-ns
  namespace: cache-ns
# defines the pod(s) that this policy is targeting
spec:
  policyTypes:
    - Ingress
  podSelector:
    matchLabels:
      app: ignite
  # <----incoming traffic----
  ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            zone: somewhere-else
        podSelector:
          matchExpressions:
            - key: app
              operator: In
              values: [some-pod, another-pod]  # dummy names, these Pods don't matter at all
      ports:
        - port: 11211   # JDBC
          protocol: TCP
        - port: 47100   # SPI communication
          protocol: TCP
        - port: 47500   # SPI discovery (CRITICAL, most likely...)
          protocol: TCP
        - port: 10800   # SQL
          protocol: TCP
# ----outgoing traffic---->
# NONE AT ALL

これら2つを適用すると、すべて正常に動作しますが、セキュリティ監査では次のようなメッセージが表示されます。
の制限はどこにありますかegress? これらのルートを使用している Pod の 1 つが以前にハッキングされたために、このノードが許可されたルート経由でハッキングされた場合はどうなりますか? その場合、C&C サーバーが呼び出される可能性があります。この構成は許可されません。アーキテクチャを強化してください。

[望ましい/必要なトラフィックをブロックします]:

一般的にすべてのトラフィックを拒否します...

## Denies all traffic to all Pods in the Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-traffic-in-cache-ns
  namespace: cache-ns
spec:
  # selecting nothing here will deny all traffic between pods in the namespace
  podSelector:
    matchLabels: {}
  # traffic routes to be considered, here: incoming exclusively
  policyTypes:
    - Ingress
    - Egress   # <------ THIS IS THE DIFFERENCE TO THE WORKING ONE ABOVE

...その後特定のルートを許可する

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: netpol-cache-ns-egress
  namespace: cache-ns
# defines the pod(s) that this policy is targeting
spec:
  policyTypes:
    - Egress
  podSelector:
    matchLabels:
      app: ignite
  ----outgoing traffic---->
  egress:
    # [NOT SUFFICIENT]
    # allow egress to this namespace at specific ports
    - to:
      - namespaceSelector:
          matchLabels:
            zone: cache-zone
      ports:
        - protocol: TCP
          port: 10800
        - protocol: TCP
          port: 47100   # SPI communication
        - protocol: TCP
          port: 47500
    # [NOT SUFFICIENT]
    # allow dns resolution in general (no namespace or pod restriction)
    - ports:
      - protocol: TCP
        port: 53
      - protocol: UDP
        port: 53
    # [NOT SUFFICIENT]
    # allow egress to the kube-system (label is present!)
    - to:
      - namespaceSelector:
          matchLabels:
            zone: kube-system
    # [NOT SUFFICIENT]
    # allow egress in this namespace and for the ignite pod
    - to:
      - namespaceSelector:
          matchLabels:
            zone: cache-zone
        podSelector:
          matchLabels:
            app: ignite
    # [NOT SUFFICIENT]
    # allow traffic to the IP address of the ignite pod
    - to:
      - ipBlock:
          cidr: 172.21.70.49/32  # won't work well since those addresses are dynamic
      ports:
        - port: 11211   # JDBC
          protocol: TCP
        - port: 47100   # SPI communication
          protocol: TCP
        - port: 47500   # SPI discovery (CRITICAL, most likely...)
          protocol: TCP
        - port: 49112   # JMX
          protocol: TCP
        - port: 10800   # SQL
          protocol: TCP
        - port: 8080    # REST
          protocol: TCP
        - port: 10900   # thin clients
          protocol: TCP

使用されるApache Igniteのバージョンは2.10.0です

さて、読者の皆さんへの質問は次の通りです。

Ignite が正しく起動して動作するように、Egressクラスター内部を絶対最小限に制限するにはどうすればよいですか?クラスター外部への接続を拒否するだけで十分でしょうか?NamespaceEgress

yaml推測やヒントのためにさらに s が必要な場合は、コメントで遠慮なくリクエストしてください。タグ付けが不適切と思われる場合は申し訳ありませんが、 stackoverflow にタグが存在するため
、見つけることができませんでした。kubernetes-networkpolicy

アップデート:

ポリシー制限なしnslookup -debug kubernetes.default.svc.cluster.localでIgnite Pod内から実行すると、egress

BusyBox v1.29.3 (2019-01-24 07:45:07 UTC) multi-call binary.

Usage: nslookup HOST [DNS_SERVER]

Query DNS about HOST

NetworkPolicy特定のポート、ポッド、名前空間に制限する (any) が適用されるとすぐに、EgressIgnite ポッドは起動を拒否し、ルックアップはkubernetes.default.svc.cluster.localそれ以上到達できなくなります。

EgressDNS への接続が許可されました (UDP 53 to k8s-app: kube-dns) ⇒ 依然として IP 検索は不可能です

関連情報