Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: Автор ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” Reuven Harrison β€” ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ 20 Π»Π΅Ρ‚ ΠΎΠΏΡ‹Ρ‚Π° Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π° Π½Π° сСгодняшний дСнь являСтся тСхничСским Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ соучрСдитСлСм ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Tufin, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для управлСния ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ бСзопасности. Рассматривая сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes ΠΊΠ°ΠΊ достаточно ΠΌΠΎΡ‰Π½ΠΎΠ΅ срСдство для сСгмСнтации сСти Π² кластСрС, ΠΎΠ½ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя считаСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Π°ΠΊ просты Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» (довольно ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹ΠΉ) ΠΏΡ€ΠΈΠ·Π²Π°Π½ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΎΡΠ²Π΅Π΄ΠΎΠΌΠ»Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ спСциалистов Π² этом вопросС ΠΈ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠΌ Π² создании Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ.

БСгодня ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ всС Ρ‡Π°Ρ‰Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ Kubernetes для запуска своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π˜Π½Ρ‚Π΅Ρ€Π΅Ρ ΠΊ этому ПО Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ высок, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Kubernetes Β«Π½ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой для Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…Β». ΠŸΠΎΡΡ‚Π΅ΠΏΠ΅Π½Π½ΠΎ Kubernetes (ΠΈΠ»ΠΈ k8s) Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ критичСски ваТная Ρ‡Π°ΡΡ‚ΡŒ бизнСса, которая Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Ρ€Π΅Π»Ρ‹Ρ… бизнСс-процСссов, Π² Ρ‚ΠΎΠΌ числС обСспСчСния сСтСвой бСзопасности.

Для спСциалистов ΠΏΠΎ бСзопасности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ·Π°Π΄Π°Ρ‡ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ с Kubernetes, настоящим ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всё.

Π­Ρ‚ΠΎ руководство ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ устройствС сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ; ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ» для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… брандмауэров. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… камнях ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π°Π½Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ прилоТСния Π² Kubernetes.

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Kubernetes позволяСт ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ взаимодСйствиСм Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° сСтСвом ΡƒΡ€ΠΎΠ²Π½Π΅ (Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ OSI). Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π»ΠΈΡˆΠ΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ соврСмСнных брандмауэров, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π° 7 ΡƒΡ€ΠΎΠ²Π½Π΅ OSI ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠ³Ρ€ΠΎΠ·, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сСтСвой бСзопасности, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ pod’Π°ΠΌΠΈ

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Kubernetes Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ pod’ам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ состоят ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… совмСстно. Kubernetes присваиваСт ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ pod’у IP-адрСс, доступный ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… pod’ΠΎΠ². Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΡ€Π°Π²Π° доступа для Π³Ρ€ΡƒΠΏΠΏ pod’ΠΎΠ² Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ Π³Ρ€ΡƒΠΏΠΏΡ‹ бСзопасности Π² ΠΎΠ±Π»Π°ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния доступом ΠΊ экзСмплярам Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ

Как ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ рСсурсы 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, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΅ Π² кластСрС:

kubectl create -f policy.yaml

БпСцификация сСтСвой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

БпСцификация сСтСвой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта:

  1. podSelector: опрСдСляСт pod’Ρ‹, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ этой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ (Ρ†Π΅Π»ΠΈ) β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ;
  2. policyTypes: ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π΄Π°Π½Π½ΡƒΡŽ: ingress ΠΈ/ΠΈΠ»ΠΈ egress β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π΅Π³ΠΎ явно ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²ΠΎ всСх случаях;
  3. ingress: опрСдСляСт Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ входящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π² Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ pod’Ρ‹ β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ;
  4. egress: опрСдСляСт Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ исходящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΈΠ· Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… pod’ΠΎΠ² β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, позаимствованный с сайта Kubernetes (я Π·Π°ΠΌΠ΅Π½ΠΈΠ» role Π½Π° app), ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта:

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 для спСциалистов ΠΏΠΎ бСзопасности

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ podSelector, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ТСланию.

Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ policyTypes, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° опрСдСляСт ingress-сторону. Если явных ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ Π½Π° этот счСт Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ Π½Π΅ содСрТится, систСма Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ вСсь Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½.
  • ПовСдСниС Π½Π° egress-сторонС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ отсутствиСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ egress-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ всСгда явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ policyTypes.

Π’ соотвСтствии с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Π² случаС, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ingress ΠΈ/ΠΈΠ»ΠΈ egress ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ вСсь Ρ‚Ρ€Π°Ρ„ΠΈΠΊ (см. Β«ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ зачистки» Π½ΠΈΠΆΠ΅).

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ

Если ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Kubernetes ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ вСсь Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. ВсС pod’Ρ‹ свободно ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бСзопасности это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ, Π½ΠΎ вспомнитС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Kubernetes ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ создавался Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ с Ρ†Π΅Π»ΡŒΡŽ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ взаимодСйствиС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½ (Namespaces) β€” ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Kubernetes. Они ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для изолирования логичСских ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, ΠΏΡ€ΠΈ этом ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ пространствами ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½.

Как ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Kubernetes, сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΎΠ±ΠΈΡ‚Π°ΡŽΡ‚ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½. Π’ Π±Π»ΠΎΠΊΠ΅ metadata ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ пространству ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°:

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

Если пространство ΠΈΠΌΠ΅Π½ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… явно Π½Π΅ прописано, систСма Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ namespace, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² kubectl (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ namespace=default):

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

Π― Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ namespace, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΡƒΡŽ сразу для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространств ΠΈΠΌΠ΅Π½.

Основной элСмСнт podSelector Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ pod’ы ΠΈΠ· пространства ΠΈΠΌΠ΅Π½, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° (ΠΎΠ½ лишСн доступа ΠΊ pod’Π°ΠΌ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½).

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ podSelector’Ρ‹ Π² Π±Π»ΠΎΠΊΠ°Ρ… ingress ΠΈ egress ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ pod’ы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· своСго пространства ΠΈΠΌΠ΅Π½, Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ Π½Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ namespaceSelector (ΠΎΠ± этом ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½ ΠΈ pod’Π°ΠΌΒ»).

ΠŸΡ€Π°Π²ΠΈΠ»Π° имСнования ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ

Названия ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½. Π”Π²ΡƒΡ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ названиями Π² Ρ€Π°Π·Π½Ρ‹Ρ… пространствах. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространствах.

МнС особСнно нравится ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов имСнования. Он состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ с Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌΠΈ pod’ами. НапримСр:

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, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ pod’ы ΠΈ пространства ΠΈΠΌΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π»Π΅ΠΉΠ±Π»Ρ‹. Π›Π΅ΠΉΠ±Π»Ρ‹ (labels β€” ΠΌΠ΅Ρ‚ΠΊΠΈ) ΡΠ²Π»ΡΡŽΡ‚ΡΡ эквивалСнтом Ρ‚Π΅Π³ΠΎΠ² Π² ΠΎΠ±Π»Π°ΠΊΠ΅. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π»Π΅ΠΉΠ±Π»Ρ‹ для Π²Ρ‹Π±ΠΎΡ€Π° pod’ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ:

podSelector:
  matchLabels:
    role: db

… ΠΈΠ»ΠΈ пространств ΠΈΠΌΠ΅Π½, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ всС pod’Ρ‹ Π² пространствах ΠΈΠΌΠ΅Π½ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π»Π΅ΠΉΠ±Π»Π°ΠΌΠΈ:

namespaceSelector:
  matchLabels:
    project: myproject

Одно прСдостСрСТСниС: ΠΏΡ€ΠΈ использовании namespaceSelector ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Π΅ пространства ΠΈΠΌΠ΅Π½ содСрТат Π² сСбС Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π»Π΅ΠΉΠ±Π». Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ встроСнныС пространства ΠΈΠΌΠ΅Π½, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ default ΠΈ kube-system, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ содСрТат Π² сСбС Π»Π΅ΠΉΠ±Π»ΠΎΠ².

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π»Π΅ΠΉΠ±Π» ΠΊ пространству ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

kubectl label namespace default namespace=default

ΠŸΡ€ΠΈ этом namespace Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ metadata Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° фактичСскоС имя пространства, Π° Π½Π΅ Π½Π° Π»Π΅ΠΉΠ±Π»:

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ ΠΈ адрСсат

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ для брандмауэров состоят ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» с источниками ΠΈ адрСсатами. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ для Ρ†Π΅Π»ΠΈ β€” Π½Π°Π±ΠΎΡ€Π° ΠΈΠ· pod’ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° для входящСго (ingress) ΠΈ/ΠΈΠ»ΠΈ исходящСго (egress) Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ всС pod’ы Π² пространствС ΠΈΠΌΠ΅Π½ 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 Π² этой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ входящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΊ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ pod’ам. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ingress выступаСт источником, Π° Ρ†Π΅Π»ΡŒ β€” ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ адрСсатом. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ egress являСтся адрСсатом, Π° Ρ†Π΅Π»ΡŒ β€” Π΅Π³ΠΎ источником.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

Π­Ρ‚ΠΎ эквивалСнтно Π΄Π²ΡƒΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ для брандмауэра: Ingress β†’ ЦСль; ЦСль β†’ Egress.

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 β€” пустой, ΠΈ поэтому ΠΎΠ½ косвСнно Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ всС pod’Ρ‹ Π²ΠΎ всСх пространствах ΠΈΠΌΠ΅Π½, позволяя balance ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ DNS-запросы Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ слуТбу Kubernetes (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² пространствС kube-system).

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΈ нСбСзопасный, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ позволяСт Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ DNS-запросы Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ кластСра.

Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ трСмя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ шагами.

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. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½ И pod’Π°ΠΌΒ» Π±ΡƒΠ΄Π΅Ρ‚ рассказано, ΠΊΠ°ΠΊ этого Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ 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 Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ всС pod’ы Π² пространствС ΠΈΠΌΠ΅Π½.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ соотвСтствиС ΠΈ порядок ΠΏΡ€Π°Π²ΠΈΠ»

Π’ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… брандмауэрах дСйствиС (Β«Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒΒ» ΠΈΠ»ΠΈ Β«Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒΒ») Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ удовлСтворяСт. Π’ Kubernetes порядок ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹, ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ pod’Π°ΠΌΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ свободно ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ pod, Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΉ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…, становится ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² соотвСтствии с Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (логичСским Π˜Π›Π˜) всСх ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π³ΠΎ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ. Pod’ы, Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ, ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ.

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π°Π²ΠΈΠ»Π° зачистки.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ зачистки (Β«Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒΒ»)

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ брандмауэров ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ любой явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

Π’ Kubernetes Π½Π΅Ρ‚ дСйствия Β«Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒΒ» (deny), ΠΎΠ΄Π½Π°ΠΊΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ (Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ) ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ, Π²Ρ‹Π±Ρ€Π°Π² ΠΏΡƒΡΡ‚ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ pod’ΠΎΠ²-источников (ingress):

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

Π­Ρ‚Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ всС pod’Ρ‹ Π² пространствС ΠΈΠΌΠ΅Π½ ΠΈ оставляСт ingress Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, запрСщая вСсь входящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

ΠŸΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ вСсь исходящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΈΠ· пространства ΠΈΠΌΠ΅Π½:

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΊ pod’Π°ΠΌ Π² пространствС ΠΈΠΌΠ΅Π½, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ этим ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ добавлСнию Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ брандмауэра).

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всС (Any-Any-Any-Allow)

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Β«Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всС», Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ пустым элСмСнтом ingress:

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

Она ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ доступ со всСх pod’ΠΎΠ² Π²ΠΎ всСх пространствах ΠΈΠΌΠ΅Π½ (ΠΈ всСх IP) ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ pod’у Π² пространствС ΠΈΠΌΠ΅Π½ default. ПодобноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, поэтому ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Однако ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для диагностики ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ pod’ΠΎΠ² (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 для спСциалистов ΠΏΠΎ бСзопасности

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ вСсь входящий (ingress) И исходящий (egress) Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ доступ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ IP Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ кластСра:

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности
Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности

ОбъСдинСниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСского Π˜Π›Π˜ Π½Π° Ρ‚Ρ€Π΅Ρ… уровнях; Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ pod’Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² соотвСтствии с Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠ΅ΠΉ всСх ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π³ΠΎ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚:

1. Π’ полях from ΠΈ to ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° элСмСнтов (всС ΠΎΠ½ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π˜Π›Π˜):

  • namespaceSelector β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ пространство ΠΈΠΌΠ΅Π½ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ;
  • podSelector β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ pod’ы;
  • 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. Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ логичСским Π˜Π›Π˜

Но ΠΏΡ€ΠΈ ΠΈΡ… объСдинСнии сущСствуСт ΠΎΠ΄Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π» Chris Cooney: Kubernetes ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ policyTypes (Ingress ΠΈΠ»ΠΈ Egress). ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ 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 для спСциалистов ΠΏΠΎ бСзопасности

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всС pod’ы Π² пространствС ΠΈΠΌΠ΅Π½ default ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ доступ ΠΊ pod’Π°ΠΌ postgres Π² пространствС ΠΈΠΌΠ΅Π½ database. Но Ρ‡Ρ‚ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ доступ ΠΊ postgres Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ pod’Π°ΠΌ Π² пространствС ΠΈΠΌΠ΅Π½ default?

Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½ И pod’Π°ΠΌ

Kubernetes вСрсии 1.11 ΠΈ Π²Ρ‹ΡˆΠ΅ позволяСт ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ namespaceSelector ΠΈ podSelector с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСского И. Выглядит это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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 для спСциалистов ΠΏΠΎ бСзопасности

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это трактуСтся ΠΊΠ°ΠΊ И вмСсто ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π˜Π›Π˜?

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ podSelector Π½Π΅ начинаСтся с дСфиса. Π’ YAML это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ podSelector ΠΈ стоящий ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ namespaceSelector относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ элСмСнту списка. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ логичСским И.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ дСфиса ΠΏΠ΅Ρ€Π΅Π΄ podSelector ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ возникновСнию Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ namespaceSelector с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСского Π˜Π›Π˜.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ pod’Ρ‹ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π»Π΅ΠΉΠ±Π»ΠΎΠΌ Π²ΠΎ всСх пространствах ΠΈΠΌΠ΅Π½, Π²ΠΏΠΈΡˆΠΈΡ‚Π΅ пустой 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 для спСциалистов ΠΏΠΎ бСзопасности

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ Π»Π΅ΠΉΠ±Π»Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с И

ΠŸΡ€Π°Π²ΠΈΠ»Π° для брандмауэра со мноТСством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (хостами, сСтями, Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ) ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСского Π˜Π›Π˜. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ сработаСт, Ссли источник ΠΏΠ°ΠΊΠ΅Ρ‚Π° совпадаСт с Host_1 Π˜Π›Π˜ Host_2:

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

Наоборот, Π² Kubernetes Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π»Π΅ΠΉΠ±Π»Ρ‹ Π² podSelector ΠΈΠ»ΠΈ namespaceSelector ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ логичСским И. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ pod’ы, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Π΅ΠΈΠΌΠΈ Π»Π΅ΠΉΠ±Π»Π°ΠΌΠΈ, role=db И version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

Π’Π° ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° примСняСтся ΠΊΠΎ всСм Ρ‚ΠΈΠΏΠ°ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²: сСлСкторам Ρ†Π΅Π»Π΅ΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, сСлСкторам pod’ΠΎΠ² ΠΈ сСлСкторам пространств ΠΈΠΌΠ΅Π½.

ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΠΈ ΠΈ IP-адрСса (IPBlocks)

Для сСгмСнтирования сСти брандмауэры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ VLAN, IP-адрСса ΠΈ подсСти.

Π’ Kubernetes IP-адрСса ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ pod’Π°ΠΌ автоматичСски ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ часто ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, поэтому для Π²Ρ‹Π±ΠΎΡ€Π° pod’ΠΎΠ² ΠΈ пространств ΠΈΠΌΠ΅Π½ Π² сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π»Π΅ΠΉΠ±Π»Ρ‹.

ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΠΈ (ipBlocks) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ входящими (ingress) ΠΈΠ»ΠΈ исходящими (egress) внСшними (North-South) ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, эта ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всСм pod’Π°ΠΌ ΠΈΠ· пространства ΠΈΠΌΠ΅Π½ default доступ ΠΊ DNS-сСрвису Google:

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 для спСциалистов ΠΏΠΎ бСзопасности

ΠŸΡƒΡΡ‚ΠΎΠΉ сСлСктор pod’ΠΎΠ² Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС pod’ы Π² пространствС ΠΈΠΌΠ΅Π½Β».

Данная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ 8.8.8.8; доступ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ IP Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎ сути, Π²Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»ΠΈ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ слуТбС DNS Kubernetes. Если Π²Ρ‹ всС ΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ это явно.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ipBlocks ΠΈ podSelectors ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ IP-адрСса pod’ΠΎΠ² Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ipBlocks. Π£ΠΊΠ°Π·Π°Π² Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ IP pod’ΠΎΠ², Π²Ρ‹ фактичСски Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ/ΠΎΡ‚ pod’ΠΎΠ² с этими адрСсами. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Ρ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ IP-адрСс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому ΠΈΡ… Π½Π΅ стоит ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Π²Ρ‹Π±ΠΎΡ€Π° pod’ΠΎΠ².

Π’ качСствС ΠΊΠΎΠ½Ρ‚Ρ€-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС IP ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ доступ ΠΊΠΎ всСм Π΄Ρ€ΡƒΠ³ΠΈΠΌ pod’Π°ΠΌ:

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-адрСса pod’ΠΎΠ². НапримСр, Ссли ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ вашСго pod’Π° 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 для спСциалистов ΠΏΠΎ бСзопасности

ΠŸΠΎΡ€Ρ‚Ρ‹ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ pod’Ρ‹ ΡΠ»ΡƒΡˆΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ… ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ рСкомСндуСтся Π΄Π΅Π»Π°Ρ‚ΡŒ максимально ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, поэтому Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях всС ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹:

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), это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ всС ΠΏΠΎΡ€Ρ‚Ρ‹.

Π›ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°: Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ Π½ΡƒΠΆΠ½ΠΎΠ΅ Π²Π°ΠΌ явно.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ pod’ΠΎΠ², Π° Π½Π΅ сСрвисов (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅).

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для pod’ΠΎΠ² ΠΈΠ»ΠΈ сСрвисов?

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ pod’ы Π² Kubernetes ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ Ρ‡Π΅Ρ€Π΅Π· сСрвис β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΊ pod’Π°ΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ сСрвис. МоТно ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ доступ ΠΊ сСрвисам, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ pod’ΠΎΠ², Π° Π½Π΅ сСрвисов.

НапримСр, Ссли сСрвис ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ 80-ΠΉ ΠΏΠΎΡ€Ρ‚, Π½ΠΎ пСрСнаправляСт Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° ΠΏΠΎΡ€Ρ‚ 8080 своих pod’ΠΎΠ², Π² сСтСвой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ 8080.

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ слСдуСт ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ: ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства сСрвиса (ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ»ΡƒΡˆΠ°ΡŽΡ‚ pod’Ρ‹) придСтся ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ.

Новый Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с использованиСм Service Mesh (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, см. ΠΏΡ€ΠΎ Istio Π½ΠΈΠΆΠ΅ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².) позволяСт ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.

НСобходимо Π»ΠΈ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ingress, Ρ‚Π°ΠΊ ΠΈ Egress?

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚ β€” Π΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ pod А ΠΌΠΎΠ³ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с pod’ом Π’, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ исходящСС соСдинСниС (для этого слСдуСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ egress-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ), Π° pod Π’ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ входящСС соСдинСниС (для этого, соотвСтствСнно, Π½ΡƒΠΆΠ½Π° ingress-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°).

Однако Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΡƒΡŽ соСдинСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΈΡ… направлСниях.

Если Π½Π΅ΠΊΠΈΠΉ pod-источник Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ нСсколькими egress-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° Π½Π΅Π³ΠΎ ограничСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΈΡ… Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π’ этом случаС потрСбуСтся явно Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ pod’у-адрСсату. Если pod Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ, Π΅Π³ΠΎ исходящий (egress) Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΡƒΠ΄ΡŒΠ±Π° pod’Π°-адрСсата, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ нСсколькими ingress-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΈΡ… Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π’ этом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΎΡ‚ pod’Π°-источника. Если pod Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ, вСсь входящий (ingress) Ρ‚Ρ€Π°Ρ„ΠΈΠΊ для Π½Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π‘ΠΌ. ΠΏΡƒΠ½ΠΊΡ‚ Β«Stateful ΠΈΠ»ΠΈ StatelessΒ» Π½ΠΈΠΆΠ΅.

Π›ΠΎΠ³ΠΈ

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. Π­Ρ‚ΠΎ затрудняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈ сильно ослоТняСт Π°Π½Π°Π»ΠΈΠ· Π² области бСзопасности.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ ΠΊ внСшним сСрвисам

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя (DNS) Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… egress. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ нСудобству ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΊ внСшним адрСсатам, Π»ΠΈΡˆΠ΅Π½Π½Ρ‹ΠΌ фиксированного IP-адрСса (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ aws.com).

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

Брандмауэры прСдупрСдят вас ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ откаТутся ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ. Kubernetes Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. ΠŸΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ сСтСвой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· kubectl Kubernetes ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅Π²Π΅Ρ€Π½Π°, ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π΅Π΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях Kubernetes ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ Π΅Π΅ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ дСталями. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

kubernetes get networkpolicy <policy-name> -o yaml

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ систСма ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Kubernetes Π½Π΅ Π½Π΅ΠΏΠΎΠ³Ρ€Π΅ΡˆΠΈΠΌΠ° ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок.

ИсполнСниС

Kubernetes Π½Π΅ занимаСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π° являСтся лишь API-шлюзом, Π²ΠΎΠ·Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŽ Π½Π° Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ систСму, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Container Networking Interface (CNI). Π—Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π² кластСрС Kubernetes Π±Π΅Π· назначСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ CNI Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ созданию ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π½Π° сСрвСрС управлСния брандмауэром Π±Π΅Π· ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ установки Π² брандмауэры. Π’Ρ‹ сами Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ достойного CNI ΠΈΠ»ΠΈ, Π² случаС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Kubernetes, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Π»Π°ΠΊΠ΅ (со списком ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ здСсь β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.), Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ установят CNI для вас.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Kubernetes Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ вас, Ссли Π²Ρ‹ Π·Π°Π΄Π°Π΄ΠΈΡ‚Π΅ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Π±Π΅Π· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ CNI.

Stateful ΠΈΠ»ΠΈ Stateless?

ВсС CNI Kubernetes, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠ½Π΅ доводилось ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ, хранят состояния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Calico ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Linux conntrack). Π­Ρ‚ΠΎ позволяСт pod’у ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠΌ TCP-соСдинСнию Π±Π΅Π· нСобходимости ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ. ΠŸΡ€ΠΈ этом ΠΌΠ½Π΅ нСизвСстно ΠΎ стандартС Kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» Π±Ρ‹ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ состояния (statefulness).

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ бСзопасности

Π’ΠΎΡ‚ нСсколько способов ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ исполнСния ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности Π² Kubernetes:

  1. АрхитСктурный ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Service Mesh ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ sidecar-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ для обСспСчСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Ρ‚Π΅Π»Π΅ΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ ΠΈ контроля Π·Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСрвисов. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Istio.
  2. НСкоторыС ΠΈΠ· поставщиков CNI Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ свои инструмСнты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π΅ Π²Ρ‹ΡˆΠ»ΠΈ Π·Π° Ρ€Π°ΠΌΠΊΠΈ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Kubernetes.
  3. Tufin Orca обСспСчиваСт ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Kubernetes.

ΠŸΠ°ΠΊΠ΅Ρ‚ Tufin Orca управляСт сСтСвыми ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ Kubernetes (ΠΈ слуТит источником ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅).

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов для сСгмСнтации кластСров, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ нСпонятны ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ мноТСство тонкостСй. Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΈΠ·-Π·Π° этой слоТности ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… кластСров содСрТат ошибки. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ автоматизация ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдств сСгмСнтации.

НадСюсь, Ρ‡Ρ‚ΠΎ это руководство ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вопросы ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ.

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com