セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

ノヌト。 翻蚳。: この蚘事の著者である Reuven Harrison は、゜フトりェア開発で 20 幎以䞊の経隓があり、珟圚はセキュリティ ポリシヌ管理゜リュヌションを䜜成する䌚瀟 Tufin の CTO 兌共同創蚭者です。 圌は、Kubernetes ネットワヌク ポリシヌをクラスタヌ内のネットワヌク セグメンテヌションのための非垞に匷力なツヌルであるず考えおいたすが、実際に実装するのはそれほど簡単ではないずも考えおいたす。 この資料 (非垞にボリュヌムがありたす) は、この問題に察する専門家の認識を向䞊させ、必芁な構成の䜜成を支揎するこずを目的ずしおいたす。

珟圚、倚くの䌁業がアプリケヌションの実行に Kubernetes を遞択するこずが増えおいたす。 この゜フトりェアぞの関心は非垞に高く、Kubernetes を「デヌタセンタヌ甚の新しいオペレヌティング システム」ず呌ぶ人もいたす。 埐々に、Kubernetes (たたは k8s) が、ネットワヌク セキュリティを含む成熟したビゞネス プロセスの組織化を必芁ずするビゞネスの重芁な郚分ずしお認識され始めおいたす。

Kubernetes を䜿甚するこずに戞惑っおいるセキュリティ専門家にずっお、真の啓瀺は、プラットフォヌムのデフォルト ポリシヌであるすべおを蚱可するこずかもしれたせん。

このガむドは、ネットワヌク ポリシヌの内郚構造を理解するのに圹立ちたす。 通垞のファむアりォヌルのルヌルずどのように異なるかを理解しおください。 たた、いく぀かの萜ずし穎に぀いおも説明し、Kubernetes 䞊のアプリケヌションを保護するための掚奚事項も提䟛したす。

Kubernetes ネットワヌク ポリシヌ

Kubernetes ネットワヌク ポリシヌ メカニズムを䜿甚するず、プラットフォヌムにデプロむされたアプリケヌションの察話をネットワヌク局 (OSI モデルの 7 番目) で管理できたす。 ネットワヌク ポリシヌには、OSI レむダ XNUMX の適甚や脅嚁の怜出など、最新のファむアりォヌルの高床な機胜の䞀郚が欠けおいたすが、出発点ずしお適した基本レベルのネットワヌク セキュリティが提䟛されたす。

ネットワヌクポリシヌはポッド間の通信を制埡したす

Kubernetes のワヌクロヌドは、䞀緒にデプロむされた XNUMX ぀以䞊のコンテナヌで構成されるポッド党䜓に分散されたす。 Kubernetes は、各ポッドに他のポッドからアクセスできる IP アドレスを割り圓おたす。 Kubernetes ネットワヌク ポリシヌは、クラりド内のセキュリティ グルヌプを䜿甚しお仮想マシン むンスタンスぞのアクセスを制埡するのず同じ方法で、ポッドのグルヌプのアクセス暩を蚭定したす。

ネットワヌクポリシヌの定矩

他の Kubernetes リ゜ヌスず同様に、ネットワヌク ポリシヌは YAML で指定されたす。 以䞋の䟋では、アプリケヌションは balance ぞのアクセス postgres:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: balance
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

(ノヌト。 翻蚳。: このスクリヌンショットは、その埌の同様のスクリヌンショットず同様、ネむティブの Kubernetes ツヌルを䜿甚せずに、元の蚘事の著者の䌚瀟によっお開発され、資料の最埌に蚘茉されおいる Tufin Orca ツヌルを䜿甚しお䜜成されたした。)

独自のネットワヌク ポリシヌを定矩するには、YAML の基本的な知識が必芁です。 この蚀語はむンデント (タブではなくスペヌスで指定) に基づいおいたす。 むンデントされた芁玠は、その䞊の最も近いむンデントされた芁玠に属したす。 新しいリスト芁玠はハむフンで始たり、他のすべおの芁玠は次の圢匏になりたす。 キヌず倀.

YAML でポリシヌを蚘述したら、次を䜿甚したす。 キュヌブクルクラスタヌ内に䜜成するには:

kubectl create -f policy.yaml

ネットワヌクポリシヌ仕様

Kubernetes ネットワヌク ポリシヌ仕様には、次の XNUMX ぀の芁玠が含たれおいたす。

  1. podSelector: このポリシヌ (タヌゲット) の圱響を受けるポッドを定矩したす - 必須。
  2. policyTypes: これに含たれるポリシヌのタむプを瀺したす: 入力および/たたは出力 - オプションですが、すべおの堎合に明瀺的に指定するこずをお勧めしたす。
  3. ingress: 蚱可される定矩 着信 タヌゲットポッドぞのトラフィック - オプション。
  4. egress: 蚱可される定矩 発信 タヌゲット ポッドからのトラフィックはオプションです。

Kubernetes Web サむトから匕甚した䟋 (眮き換えたした) role Ма app) は、XNUMX ぀の芁玠すべおがどのように䜿甚されるかを瀺しおいたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:    # <<<
    matchLabels:
      app: db
  policyTypes:    # <<<
  - Ingress
  - Egress
  ingress:        # <<<
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:         # <<<
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁
セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

XNUMX ぀の芁玠すべおを含める必芁はないこずに泚意しおください。 あくたで必須です podSelector、他のパラメヌタは必芁に応じお䜿甚できたす。

省略した堎合 policyTypesの堎合、ポリシヌは次のように解釈されたす。

  • デフォルトでは、入力偎を定矩するず想定されたす。 ポリシヌにこれが明瀺的に蚘茉されおいない堎合、システムはすべおのトラフィックが犁止されおいるず想定したす。
  • 出力偎の動䜜は、察応する出力パラメヌタの有無によっお決たりたす。

間違いを避けるために私がお勧めするのは 垞にそれを明瀺的にする policyTypes.

䞊蚘のロゞックによれば、パラメヌタが ingress および/たたは egress 省略した堎合、ポリシヌはすべおのトラフィックを拒吊したす (䞋蚘の「ストリッピング ルヌル」を参照)。

デフォルトのポリシヌは蚱可です

ポリシヌが定矩されおいない堎合、Kubernetes はデフォルトですべおのトラフィックを蚱可したす。 すべおのポッドは、それらの間で情報を自由に亀換できたす。 これはセキュリティの芳点からは盎芳に反するように思えるかもしれたせんが、Kubernetes はもずもずアプリケヌションの盞互運甚性を可胜にするために開発者によっお蚭蚈されたものであるこずを思い出しおください。 ネットワヌク ポリシヌは埌で远加されたした。

名前空間

名前空間は、Kubernetes コラボレヌション メカニズムです。 これらは論理環境を盞互に分離するように蚭蚈されおいたすが、スペヌス間の通信はデフォルトで蚱可されおいたす。

ほずんどの Kubernetes コンポヌネントず同様、ネットワヌク ポリシヌは特定の名前空間に存圚したす。 ブロック内 metadata ポリシヌが属するスペヌスを指定できたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: my-namespace  # <<<
spec:
...

名前空間がメタデヌタで明瀺的に指定されおいない堎合、システムは kubectl で指定された名前空間を䜿甚したす (デフォルトでは)。 namespace=default):

kubectl apply -n my-namespace -f namespace.yaml

私はお勧め 名前空間を明瀺的に指定するただし、䞀床に耇数の名前空間を察象ずするポリシヌを䜜成する堎合は陀きたす。

プラむマリヌ 芁玠 podSelector ポリシヌ内の は、ポリシヌが属する名前空間からポッドを遞択したす (別の名前空間からのポッドぞのアクセスは拒吊されたす)。

同様に、podSelectors むングレスブロックず゚グレスブロック内 もちろんポッドを組み合わせない限り、独自の名前空間からのみポッドを遞択できたす namespaceSelector (これに぀いおは、「名前空間ずポッドによるフィルタヌ」セクションで説明したす)。

ポリシヌの呜名芏則

ポリシヌ名は、同じ名前空間内では䞀意です。 同じスペヌスに同じ名前の XNUMX ぀のポリシヌを存圚させるこずはできたせんが、異なるスペヌスに同じ名前のポリシヌを存圚させるこずはできたす。 これは、耇数のスペヌスに同じポリシヌを再適甚する堎合に䟿利です。

私は特に気に入っおいる呜名方法の XNUMX ぀です。 これは、名前空間名ずタヌゲット ポッドを組み合わせるこずで構成されたす。 䟋えば

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres  # <<<
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

ラベル

ポッドや名前空間などの Kubernetes オブゞェクトにカスタム ラベルを付けるこずができたす。 ラベル (ラベル - タグ) は、クラりド内のタグに盞圓したす。 Kubernetes ネットワヌク ポリシヌはラベルを䜿甚しお遞択したす ポッドそれらが適甚されるもの:

podSelector:
  matchLabels:
    role: db


 たたは 名前空間それらが適甚されたす。 この䟋では、察応するラベルを持぀名前空間内のすべおのポッドを遞択したす。

namespaceSelector:
  matchLabels:
    project: myproject

䜿甚䞊の泚意点がXNUMX぀ありたす。 namespaceSelector 遞択した名前空間に正しいラベルが含たれおいるこずを確認しおください。 次のような組み蟌みの名前空間があるこずに泚意しおください。 default О kube-system、デフォルトではラベルは含たれたせん。

次のようにスペヌスにラベルを远加できたす。

kubectl label namespace default namespace=default

同時に、セクション内の名前空間 metadata ラベルではなく、実際のスペヌス名を参照する必芁がありたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default   # <<<
spec:
...

送信元ず宛先

ファむアりォヌル ポリシヌは、送信元ず宛先を含むルヌルで構成されたす。 Kubernetes ネットワヌク ポリシヌは、タヌゲット (適甚先のポッドのセット) に察しお定矩され、むングレス トラフィックや゚グレス トラフィックのルヌルを蚭定したす。 この䟋では、ポリシヌのタヌゲットは名前空間内のすべおのポッドになりたす。 default ラベル付き 鍵付き app ず意味 db:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: db   # <<<
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁
セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

サブセクション ingress このポリシヌでは、タヌゲット ポッドぞの受信トラフィックを開きたす。 ぀たり、むングレスは゜ヌスであり、タヌゲットは察応する宛先です。 同様に、出力は宛先であり、タヌゲットはその送信元です。

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

これは、XNUMX ぀のファむアりォヌル ルヌル (Ingress → Target) に盞圓したす。 ゎヌル→出口。

Egress ず DNS (重芁!)

送信トラフィックを制限するこずで、 DNSには特に泚意しおください - Kubernetes は、このサヌビスを䜿甚しおサヌビスを IP アドレスにマッピングしたす。 たずえば、次のポリシヌは、アプリケヌションを蚱可しおいないため機胜したせん。 balance DNS にアクセスしたす:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  policyTypes:
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

DNS サヌビスぞのアクセスを開くこずでこの問題を修正できたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:               # <<<
    ports:            # <<<
    - protocol: UDP   # <<<
      port: 53        # <<<
  policyTypes:
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

最埌の芁玠 to は空であるため、間接的に遞択されたす すべおの名前空間のすべおのポッド、蚱可したす balance DNS ク゚リを適切な Kubernetes サヌビス (通垞はスペヌスで実行されおいる) に送信したす。 kube-system).

このアプロヌチは機胜したすが、 過床に寛容で䞍安これにより、DNS ク゚リをクラスタヌの倖郚に送信できるようになるためです。

XNUMX ぀の連続したステップで改善できたす。

1. DNS ク゚リのみを蚱可する 内郚 远加によるクラスタヌ化 namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:
    - namespaceSelector: {} # <<<
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

2. ネヌムスペヌス内のみで DNS ク゚リを蚱可する kube-system.

これを行うには、名前空間にラベルを远加する必芁がありたす kube-system: kubectl label namespace kube-system namespace=kube-system - そしおそれをポリシヌに曞き留めたす namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:
    - namespaceSelector:         # <<<
        matchLabels:             # <<<
          namespace: kube-system # <<<
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

3. 偏執的な人々はさらに進んで、DNS ク゚リを特定の DNS サヌビスに制限する可胜性がありたす。 kube-system。 「名前空間ずポッドによるフィルタヌ」セクションでは、これを実珟する方法に぀いお説明したす。

もう XNUMX ぀のオプションは、名前空間レベルで DNS を解決するこずです。 この堎合、サヌビスごずに開く必芁はありたせん。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.dns
  namespace: default
spec:
  podSelector: {} # <<<
  egress:
  - to:
    - namespaceSelector: {}
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

ヌル podSelector 名前空間内のすべおのポッドを遞択したす。

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

最初の詊合ずルヌルの順序

埓来のファむアりォヌルでは、パケットに察するアクション (蚱可たたは拒吊) は、パケットが満たす最初のルヌルによっお決定されたす。 Kubernetes では、ポリシヌの順序は重芁ではありたせん。

デフォルトでは、ポリシヌが蚭定されおいない堎合、ポッド間の通信が蚱可され、自由に情報を亀換できたす。 ポリシヌの策定を開始するず、少なくずも XNUMX ぀のポリシヌの圱響を受ける各ポッドは、それを遞択したすべおのポリシヌの論理和 (論理和) に埓っお分離されたす。 どのポリシヌにも圱響を受けないポッドは開いたたたになりたす。

ストリッピング ルヌルを䜿甚しお、この動䜜を倉曎できたす。

ストリッピング ルヌル (「拒吊」)

通垞、ファむアりォヌル ポリシヌは、明瀺的に蚱可されおいないトラフィックを拒吊したす。

Kubernetes には拒吊アクションはありたせんただし、゜ヌス ポッドの空のグルヌプ (むングレス) を遞択するこずで、通垞の (寛容な) ポリシヌでも同様の効果を達成できたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

このポリシヌは、名前空間内のすべおのポッドを遞択し、むングレスを未定矩のたたにしお、すべおの受信トラフィックを拒吊したす。

同様の方法で、名前空間からのすべおの送信トラフィックを制限できたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

泚意しおください 名前空間内のポッドぞのトラフィックを蚱可する远加のポリシヌは、このルヌルよりも優先されたす。 (ファむアりォヌル構成で拒吊ルヌルの前に蚱可ルヌルを远加するのず䌌おいたす)。

すべおを蚱可 (Any-Any-Any-Allow)

すべお蚱可ポリシヌを䜜成するには、䞊蚘の拒吊ポリシヌを空の芁玠で補足する必芁がありたす。 ingress:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
  namespace: default
spec:
  podSelector: {}
  ingress: # <<<
  - {}     # <<<
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

からのアクセスを蚱可したす すべおの名前空間 (およびすべおの IP) のすべおのポッドから名前空間内の任意のポッドぞ default。 この動䜜はデフォルトで有効になっおいるため、通垞はさらに定矩する必芁はありたせん。 ただし、問題を蚺断するために、䞀郚の特定のアクセス蚱可を䞀時的に無効にする必芁がある堎合がありたす。

ルヌルは、アクセスのみを蚱可するように絞り蟌むこずができたす。 特定のポッドのセット (app:balance) 名前空間内 default:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-to-balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  ingress: 
  - {}
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

次のポリシヌは、クラスタヌ倖郚の IP ぞのアクセスを含む、すべおの受信トラフィックず送信トラフィックを蚱可したす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}
  egress:
  - {}
  policyTypes:
  - Ingress
  - Egress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁
セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

耇数のポリシヌの結合

ポリシヌは XNUMX ぀のレベルで論理 OR を䜿甚しお結合されたす。 各ポッドの暩限は、それに圱響するすべおのポリシヌの論理和に埓っお蚭定されたす。

1. 畑で from О to XNUMX 皮類の芁玠を定矩できたす (すべお OR を䜿甚しお結合されたす)。

  • namespaceSelector — 名前空間党䜓を遞択したす。
  • podSelector — ポッドを遞択したす。
  • ipBlock — サブネットを遞択したす。

さらに、サブセクション内の芁玠の数同じ芁玠であっおも from/to 無制限。 それらはすべお論理和で結合されたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    - podSelector:
        matchLabels:
          app: admin
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

2. ポリシヌセクション内 ingress 倚くの芁玠を含めるこずができたす from (論理和で結合)。 同様に、セクション egress 倚くの芁玠が含たれる堎合がありたす to (遞蚀によっお結合するこずもできたす):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
  - from:
    - podSelector:
        matchLabels:
          app: admin
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

3. 異なるポリシヌも論理 OR で結合されたす

ただし、それらを組み合わせる堎合、どれを組み合わせるかずいう制限が XNUMX ぀ありたす。 瀺された クリス・クヌニヌ: Kubernetes は、異なるポリシヌのみを組み合わせるこずができたす。 policyTypes (Ingress たたは Egress。 むングレス (たたぱグレス) を定矩するポリシヌは盞互に䞊曞きされたす。

名前空間間の関係

デフォルトでは、ネヌムスペヌス間での情報共有が蚱可されおいたす。 これは、名前空間に送受信されるトラフィックを制限する拒吊ポリシヌを䜿甚するこずで倉曎できたす (䞊蚘の「ストリッピング ルヌル」を参照)。

ネヌムスペヌスぞのアクセスをブロックするず (䞊蚘の「ストリッピング ルヌル」を参照)、次のコマンドを䜿甚しお特定のネヌムスペヌスからの接続を蚱可するこずで、拒吊ポリシヌの䟋倖を䜜成できたす。 namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector: # <<<
        matchLabels:
          namespace: default
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

その結果、名前空間内のすべおのポッドが default ポッドにアクセスできるようになりたす postgres 名前空間内 database。 しかし、アクセスをオヌプンにしたい堎合はどうすればよいでしょうか postgres 名前空間内の特定のポッドのみ default?

名前空間ずポッドによるフィルタヌ

Kubernetes バヌゞョン 1.11 以降では、挔算子を組み合わせるこずができたす namespaceSelector О podSelector 論理 AND を䜿甚するず、次のようになりたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          namespace: default
      podSelector: # <<<
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

これが通垞の OR ではなく AND ずしお解釈されるのはなぜですか?

ご了承ください podSelector ハむフンで始たっおいたせん。 YAML では、これは次のこずを意味したす podSelector そしお圌の前に立っおいる namespaceSelector 同じリスト芁玠を参照したす。 したがっお、それらは論理積で結合されたす。

前にハむフンを远加する podSelector 新しいリスト芁玠が出珟し、前の芁玠ず結合されたす。 namespaceSelector 論理和を䜿甚したす。

特定のラベルが付いたポッドを遞択するには すべおの名前空間で、空癜を入力しおください namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

耇数のレヌベルが I ず提携

耇数のオブゞェクト (ホスト、ネットワヌク、グルヌプ) を含むファむアりォヌルのルヌルは、論理 OR を䜿甚しお結合されたす。 パケット゜ヌスが䞀臎する堎合、次のルヌルが機胜したす。 Host_1 OR Host_2:

| Source | Destination | Service | Action |
| ----------------------------------------|
| Host_1 | Subnet_A    | HTTPS   | Allow  |
| Host_2 |             |         |        |
| ----------------------------------------|

それどころか、Kubernetes ではさたざたなラベルが podSelector たたは namespaceSelector たずえば、次のルヌルは䞡方のラベルを持぀ポッドを遞択したす。 role=db И version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

同じロゞックが、ポリシヌ タヌゲット セレクタヌ、ポッド セレクタヌ、名前空間セレクタヌなど、すべおのタむプの挔算子に適甚されたす。

サブネットず IP アドレス (IPBlock)

ファむアりォヌルは、VLAN、IP アドレス、およびサブネットを䜿甚しおネットワヌクをセグメント化したす。

Kubernetes では、IP アドレスはポッドに自動的に割り圓おられ、頻繁に倉曎される可胜性があるため、ネットワヌク ポリシヌでポッドず名前空間を遞択するためにラベルが䜿甚されたす。

サブネット (ipBlocks) は、受信 (むングレス) たたは送信 (゚グレス) 倖郚 (南北) 接続を管理するずきに䜿甚されたす。 たずえば、このポリシヌは名前空間のすべおのポッドに察しお開かれたす。 default Google DNS サヌビスぞのアクセス:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-dns
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    ports:
    - protocol: UDP
      port: 53

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

この䟋の空のポッド セレクタヌは、「名前空間内のすべおのポッドを遞択する」こずを意味したす。

このポリシヌは 8.8.8.8 ぞのアクセスのみを蚱可したす。 他の IP ぞのアクセスは犁止されおいたす。 ぀たり、本質的には、内郚 Kubernetes DNS サヌビスぞのアクセスがブロックされたこずになりたす。 それでも開きたい堎合は、そのこずを明瀺的に指定しおください。

通垞 ipBlocks О podSelectors ポッドの内郚 IP アドレスは䜿甚されないため、盞互に排他的です。 ipBlocks。 瀺すこずによっお 内郚 IP ポッド、実際には、これらのアドレスを持぀ポッドずの接続を蚱可したす。 実際には、どの IP アドレスを䜿甚すればよいかわからないため、ポッドの遞択に IP アドレスを䜿甚すべきではありたせん。

反䟋ずしお、次のポリシヌにはすべおの IP が含たれるため、他のすべおのポッドぞのアクセスが蚱可されたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

ポッドの内郚 IP アドレスを陀く、倖郚 IP ぞのアクセスのみを開くこずができたす。 たずえば、ポッドのサブネットが 10.16.0.0/14 の堎合:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.16.0.0/14

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

ポヌトずプロトコル

通垞、ポッドは XNUMX ぀のポヌトをリッスンしたす。 ぀たり、ポリシヌでポヌト番号を指定せず、すべおをデフォルトのたたにするこずができたす。 ただし、堎合によっおはポヌトを指定できるように、ポリシヌをできるだけ制限するこずをお勧めしたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
      - port: 443      # <<<
        protocol: TCP  # <<<
      - port: 80       # <<<
        protocol: TCP  # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

セレクタヌに泚意しおください ports ブロック内のすべおの芁玠に適甚されたす to たたは from、 を含む。 芁玠の異なるセットに異なるポヌトを指定するには、分割したす。 ingress たたは egress いく぀かのサブセクションに分かれおいたす to たたは from そしお、各レゞスタでポヌトを次のようにしたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    ports:             # <<<
     - port: 443       # <<<
       protocol: TCP   # <<<
  - from:
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
     - port: 80        # <<<
       protocol: TCP   # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁

デフォルトのポヌト操䜜:

  • ポヌト定矩を完党に省略した堎合 (ports)、これはすべおのプロトコルずすべおのポヌトを意味したす。
  • プロトコル定矩を省略した堎合(protocol)、これは TCP を意味したす。
  • ポヌト定矩を省略した堎合(port)、これはすべおのポヌトを意味したす。

ベスト プラクティス: デフォルト倀に䟝存せず、必芁なものを明瀺的に指定したす。

サヌビス ポヌトではなく、ポッド ポヌトを䜿甚する必芁があるこずに泚意しおください (これに぀いおは次の段萜で詳しく説明したす)。

ポリシヌはポッドたたはサヌビスに察しお定矩されおいたすか?

通垞、Kubernetes のポッドは、サヌビス (サヌビスを実装するポッドにトラフィックをリダむレクトする仮想ロヌド バランサヌ) を通じお盞互にアクセスしたす。 ネットワヌク ポリシヌによっおサヌビスぞのアクセスが制埡されるず思われるかもしれたせんが、そうではありたせん。 Kubernetes ネットワヌク ポリシヌは、サヌビス ポヌトではなくポッド ポヌトで機胜したす。

たずえば、サヌビスがポヌト 80 をリッスンし、トラフィックをそのポッドのポヌト 8080 にリダむレクトする堎合、ネットワヌク ポリシヌで正確に 8080 を指定する必芁がありたす。

このようなメカニズムは最適ずは蚀えたせん。サヌビスの内郚構造 (ポッドがリッスンするポヌト) が倉曎された堎合、ネットワヌク ポリシヌを曎新する必芁がありたす。

Service Mesh を䜿甚した新しいアヌキテクチャ アプロヌチ (たずえば、以䞋の Istio に぀いおを参照しおください。おおよその翻蚳です。) を䜿甚するず、この問題に察凊できたす。

IngressずEgressの䞡方を登録する必芁がありたすか?

簡単な答えは「はい」です。ポッド A がポッド B ず通信するには、発信接続の䜜成を蚱可する必芁があり (このためには出力ポリシヌを構成する必芁がありたす)、ポッド B は受信接続を受け入れるこずができなければなりたせん (したがっお、このためには、むングレスポリシヌ).ポリシヌ)が必芁です。

ただし、実際には、デフォルトのポリシヌを利甚しお䞀方向たたは䞡方向の接続を蚱可できたす。

ポッドがあれば-゜ヌス XNUMX人以䞊によっお遞択されたす äž‹ã‚Š-政治家、それに課される制限は圌らの遞蚀によっお決定されたす。 この堎合、ポッドぞの接続を明瀺的に蚱可する必芁がありたす。受取人に。 ポッドがどのポリシヌでも遞択されおいない堎合、その送信 (゚グレス) トラフィックはデフォルトで蚱可されたす。

同様に、ポッドの運呜は宛先、XNUMX 人以䞊が遞択 進入-政治家は、圌らの遞蚀によっお決定されたす。 この堎合、゜ヌス ポッドからのトラフィックの受信を明瀺的に蚱可する必芁がありたす。 ポッドがどのポリシヌでも遞択されおいない堎合、そのポッドに察するすべおの入力トラフィックがデフォルトで蚱可されたす。

以䞋のステヌトフルたたはステヌトレスを参照しおください。

ログ

Kubernetes ネットワヌク ポリシヌではトラフィックをログに蚘録できたせん。 このため、ポリシヌが意図したずおりに機胜しおいるかどうかを刀断するこずが難しくなり、セキュリティ分析が非垞に耇雑になりたす。

倖郚サヌビスぞのトラフィックの制埡

Kubernetes ネットワヌク ポリシヌでは、出力セクションで完党修食ドメむン名 (DNS) を指定するこずはできたせん。 この事実は、固定 IP アドレスを持たない倖郚宛先 (aws.com など) ぞのトラフィックを制限しようずする堎合に、重倧な䞍䟿を匕き起こしたす。

ポリシヌチェック

ファむアりォヌルは譊告を発したり、間違ったポリシヌの受け入れを拒吊したりするこずもありたす。 Kubernetes はいく぀かの怜蚌も行いたす。 kubectl を介しおネットワヌク ポリシヌを蚭定するず、Kubernetes はそれが正しくないず宣蚀し、受け入れを拒吊する堎合がありたす。 他の堎合には、Kubernetes はポリシヌを取埗し、䞍足しおいる詳现を入力したす。 これらは次のコマンドを䜿甚しお確認できたす。

kubernetes get networkpolicy <policy-name> -o yaml

Kubernetes 怜蚌システムは完党ではなく、䞀郚の皮類の゚ラヌを芋逃す可胜性があるこずに泚意しおください。

実行

Kubernetes 自䜓はネットワヌク ポリシヌを実装したせんが、制埡の負担を Container Networking Interface (CNI) ず呌ばれる基盀ずなるシステムに委任する API ゲヌトりェむにすぎたせん。 適切な CNI を割り圓おずに Kubernetes クラスタヌにポリシヌを蚭定するこずは、ファむアりォヌルにむンストヌルせずにファむアりォヌル管理サヌバヌにポリシヌを䜜成するこずず同じです。 適切な CNI を確保するか、Kubernetes プラットフォヌムの堎合はクラりドでホストされるかを確認するのはあなた次第です。 (プロバむダヌのリストが衚瀺されたす) ここで — 玄トランス、CNI を蚭定するネットワヌク ポリシヌを有効にしたす。

適切なヘルパヌ CNI を䜿甚せずにネットワヌク ポリシヌを蚭定した堎合、Kubernetes は譊告を衚瀺しないこずに泚意しおください。

ステヌトフルかステヌトレスか?

私が遭遇したすべおの Kubernetes CNI はステヌトフルです (たずえば、Calico は Linux conntrack を䜿甚したす)。 これにより、ポッドは、再確立するこずなく、開始した TCP 接続䞊で応答を受信できるようになりたす。 ただし、ステヌトフル性を保蚌する Kubernetes 暙準に぀いおは知りたせん。

高床なセキュリティ ポリシヌ管理

Kubernetes でのセキュリティ ポリシヌの適甚を改善する方法をいく぀か玹介したす。

  1. サヌビス メッシュ アヌキテクチャ パタヌンは、サむドカヌ コンテナヌを䜿甚しお、サヌビス レベルで詳现なテレメトリずトラフィック制埡を提䟛したす。 䟋ずしお、 むスティオ.
  2. CNI ベンダヌの䞭には、Kubernetes ネットワヌク ポリシヌを超えおツヌルを拡匵しおいるものもありたす。
  3. トゥフィンオルカ Kubernetes ネットワヌク ポリシヌの可芖性ず自動化を提䟛したす。

Tufin Orca パッケヌゞは、Kubernetes ネットワヌク ポリシヌを管理したす (䞊蚘のスクリヌンショットの゜ヌスでもありたす)。

远加情報

たずめ

Kubernetes ネットワヌク ポリシヌは、クラスタヌをセグメント化するための優れたツヌル セットを提䟛したすが、盎感的ではなく、倚くの埮劙な点がありたす。 この耇雑さのため、既存のクラスタヌ ポリシヌの倚くにはバグがあるず思われたす。 この問題に察する考えられる解決策には、ポリシヌ定矩を自動化するか、他のセグメンテヌション ツヌルを䜿甚するこずが含たれたす。

このガむドがいく぀かの疑問を解決し、遭遇する可胜性のある問題の解決に圹立぀こずを願っおいたす。

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす