
多少複雑なマイクロサービス アーキテクチャがあり、Apache Ignite がステートレス データベース / キャッシュとして使用されています。Ignite はPod
唯一のPod
存在であり、アーキテクチャはセキュリティ監査に合格する必要がありますが、トラフィックに対して可能なNamespace
限りの制限を適用しないと合格できません。Ignite 自体に必要のないすべてのトラフィックを制限する必要があります。NetworkPolicy
egress
最初、私はこう思いました。いいですね。Ignite は他の にトラフィックをプッシュしませんPod
(その には他のポッドはありません)。そのため、 Ignite のみが存在する 内のすべてのトラフィックNamespace
を制限することで、これは簡単に実現できます。egress
Namespace
Pod
...
まあ、実際にはうまくいきませんでした。Igniteのドキュメントに記載されているすべてのポートへのトラフィックを許可したとしても、起動に失敗し、次のようなエラー
が発生します。egress
IgniteSpiException
Ignite ポッドの IP アドレスを取得できませんでした、Caused by: java.net.ConnectException: Operation timed out (Connection timed out)
。
問題は、TcpDiscoveryKubernetsIpFinder
、特にIgnite ノードの IP アドレスを登録するためにgetRegisteredAddresses(...)
内で明らかに出力トラフィックを実行するメソッド。検出ポート 47500 は当然許可されますが、それによって状況が変わることはありません。他の からの他の との Ignite の機能は、ルールを適用しなくても動作しています。つまり、(私にとっては) の、 、 に関する構成やIgnite 自体の xml 構成などが正しいようです。他の名前空間からのトラフィックを制限するルールも期待どおりに動作しており、必要なトラフィックを正確に許可しています。Namespace
Pod
Namespace
egress
ClusterRole
ClusterRoleBinding
Service
Namespace
ingress
私が適用したポリシーは次のとおりです。
[動作中、不要なトラフィックのみをブロック]:
## 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
クラスター内部を絶対最小限に制限するにはどうすればよいですか?クラスター外部への接続を拒否するだけで十分でしょうか?Namespace
Egress
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) が適用されるとすぐに、Egress
Ignite ポッドは起動を拒否し、ルックアップはkubernetes.default.svc.cluster.local
それ以上到達できなくなります。
Egress
DNS への接続が許可されました (UDP 53 to k8s-app: kube-dns) ⇒ 依然として IP 検索は不可能です