Kubernetes NetworkPolicy: Ağ Güvenliğinde Derin Dalış

Pod'lar arası iletişimi kontrol ederek uygulama güvenliğini artırın.

Giriş: NetworkPolicy Nedir?

Kubernetes kümesinde varsayılan olarak, tüm Pod'lar herhangi bir kısıtlama olmaksızın birbirleriyle iletişim kurabilir. Bu durum, özellikle çoklu kiracılı (multi-tenant) ortamlarda veya farklı güvenlik seviyelerine sahip uygulamaların bir arada çalıştığı durumlarda ciddi güvenlik riskleri oluşturabilir. İşte bu noktada **NetworkPolicy**'ler (Ağ Politikaları) devreye girer.

**NetworkPolicy**, Pod'lar arasındaki ve Pod'lara/Pod'lardan gelen/giden ağ trafiğini kontrol etmek için kullanılan bir Kubernetes API objesidir. Bu politikalar, seçilen Pod gruplarına hangi diğer Pod'ların (veya dış IP aralıklarının) erişebileceğini belirleyerek, "en az ayrıcalık" ilkesini (least privilege) ağ seviyesinde uygulamanıza olanak tanır. Temelde, bir güvenlik duvarı (firewall) kuralı gibi çalışarak Pod'lar için ağ segmentasyonu ve izolasyon sağlar.

NetworkPolicy Çalışma Prensibi

📦
Uygulama A (frontend)
📦
Uygulama B (backend)

**Varsayılan Durum:** Tüm Pod'lar sınırsız iletişim kurabilir.

📦
Uygulama A
--x--

NetworkPolicy

"Sadece A'dan gelen trafiğe izin ver"

📦
Uygulama B

**NetworkPolicy Uygulandığında:** Politikaya göre trafik kısıtlanır veya izin verilir.

NetworkPolicy Yapısı ve Kuralları

Bir NetworkPolicy, hangi Pod'lara uygulanacağını ve bu Pod'lara gelen (ingress) ve giden (egress) trafiği nasıl filtreleyeceğini tanımlar.

Temel Alanlar:

  • `metadata.name`: NetworkPolicy'nin adı.
  • `spec.podSelector`: Bu politikanın uygulanacağı Pod'ları seçer. Boş bir `podSelector: {}` tüm Pod'lara uygulanacağı anlamına gelir.
  • `spec.policyTypes`: Uygulanacak politika tipleri. `Ingress` (gelen trafik), `Egress` (giden trafik) veya ikisi birden olabilir. Eğer belirtilmezse, sadece `ingress` kuralları içeren bir politika için `Ingress`, sadece `egress` kuralları içeren bir politika için `Egress` varsayılır. Hem `ingress` hem de `egress` kuralları içeren bir politika için ikisi de belirtilmelidir.

Gelen (Ingress) Trafik Kuralları:

`ingress` kuralı, seçilen Pod'lara gelen trafiği kontrol eder. Her bir `ingress` kuralı, hangi kaynaklardan ve hangi portlara izin verileceğini belirtir.

  • `from`: Trafiğin hangi kaynaklardan gelebileceğini tanımlar.
    • `ipBlock`: CIDR notasyonu kullanarak IP adresi aralığı.
    • `podSelector`: Aynı namespace içindeki Pod'ları etiket seçici ile belirler.
    • `namespaceSelector`: Belirli bir namespace'deki tüm Pod'ları seçer.
    • Hem `podSelector` hem de `namespaceSelector` kullanıldığında, belirli bir namespace içindeki belirli Pod'ları seçer.
  • `ports`: Hangi portlara izin verileceğini ve protokolü (TCP/UDP) belirtir.

Giden (Egress) Trafik Kuralları:

`egress` kuralı, seçilen Pod'lardan dışarı giden trafiği kontrol eder. Her bir `egress` kuralı, trafiğin hangi hedeflere ve hangi portlardan gidebileceğini belirtir.

  • `to`: Trafiğin hangi hedeflere gidebileceğini tanımlar. `from` ile aynı seçicileri (`ipBlock`, `podSelector`, `namespaceSelector`) kullanır.
  • `ports`: Hangi portlardan giden trafiğe izin verileceğini ve protokolü (TCP/UDP) belirtir.

Örnek NetworkPolicy: Sadece Belirli Uygulamalara İzin Veren


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-backend-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web-backend # Bu politika 'app: web-backend' etiketli Pod'lara uygulanır
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from: # Sadece 'app: web-frontend' etiketli Pod'lardan gelen trafiğe izin ver
      - podSelector:
          matchLabels:
            app: web-frontend
      ports: # Sadece 8080 portuna gelen trafiğe izin ver
        - protocol: TCP
          port: 8080
  egress:
    - to: # Sadece 'app: database' etiketli Pod'lara giden trafiğe izin ver
      - podSelector:
          matchLabels:
            app: database
      ports: # Sadece 5432 portundan giden trafiğe izin ver
        - protocol: TCP
          port: 5432
                

Bu politika, `web-backend` Pod'larının yalnızca `web-frontend` Pod'larından gelen TCP 8080 trafiğini kabul etmesini ve yalnızca `database` Pod'larına TCP 5432 trafiği göndermesini sağlar. Diğer tüm gelen ve giden trafik engellenir.

NetworkPolicy Altında Yatan Teknolojiler

NetworkPolicy'ler, soyut bir Kubernetes kaynağı olsa da, arka planda Linux çekirdeğinin ağ yeteneklerini kullanarak trafiği yönetirler. En yaygın olarak `iptables` veya `eBPF` gibi teknolojiler kullanılır. NetworkPolicy'lerin çalışması için kümenizde bir Ağ Politikası Denetleyicisi (Network Policy Controller) kurulu olması gerekir (örneğin Calico, Cilium, Weave Net). Varsayılan Kubernetes kurulumları genellikle bu özelliği sağlamaz, bu yüzden uygun bir CNI (Container Network Interface) eklentisi seçimi kritik öneme sahiptir.

1. iptables

**iptables**, Linux çekirdeğinde bulunan bir güvenlik duvarı ve ağ paketi filtreleme mekanizmasıdır. Ağ paketlerinin nasıl yönlendirileceğini, değiştirileceğini veya düşürüleceğini belirleyen kuralları yönetir. Geleneksel olarak, çoğu Kubernetes CNI eklentisi (örneğin kube-proxy) NetworkPolicy'leri iptables kurallarına dönüştürerek uygular.

Nasıl Çalışır?

iptables, paketlerin bir dizi kuraldan (zincirler, chains) geçtiği bir "paket filtreleme döngüsü" prensibiyle çalışır. Her kural, paketin belirli kriterlere (kaynak/hedef IP, port, protokol vb.) uyup uymadığını kontrol eder ve eşleşirse bir eylem (kabul et, düşür, reddet, başka zincire atla) gerçekleştirir.

iptables ile Paket Akışı (Basitleştirilmiş)

Gelen Paket
PREROUTING
INPUT
Yerel Süreç
Yerel Süreç
OUTPUT
POSTROUTING
Giden Paket

Paketler, kernel içindeki farklı iptables zincirlerinden geçerken kurallara göre işlenir.

**Dezavantajları:**

  • Büyük ve karmaşık kurallar setlerinde performans sorunları yaşayabilir.
  • Kural ekleme/silme işlemleri atomik değildir ve performans etkileri olabilir.
  • Dinamik ortamlarda (Kubernetes gibi) kural yönetimi karmaşıklaşabilir.

2. eBPF (extended Berkeley Packet Filter)

**eBPF**, Linux çekirdeğinde çalışan, olay tabanlı, sanal bir makine teknolojisidir. Geliştiricilerin, çekirdek kodu değiştirmeden, çekirdek içinde güvenli bir şekilde programlar çalıştırmasına olanak tanır. Ağ, güvenlik, izleme gibi alanlarda devrim niteliğinde yetenekler sunar. Cilium gibi modern CNI eklentileri, NetworkPolicy'leri uygulamak için iptables yerine eBPF'i kullanır.

Nasıl Çalışır?

eBPF programları, paketlerin ağ yığını içinde erken bir aşamada ele geçirilmesini ve işlenmesini sağlar. Bu programlar, sanal ağ arayüzlerine (veth çiftleri), trafik kontrol kancalarına veya soketlere bağlanabilir. Daha düşük bir seviyede çalışarak, iptables'a göre daha yüksek performans, daha fazla esneklik ve daha iyi gözlemlenebilirlik sunar.

eBPF ile Paket Akışı (Basitleştirilmiş)

Gelen Paket
eBPF Programı (Network Interface)
Konteyner
Konteyner
eBPF Programı (Network Interface)
Giden Paket

eBPF programları, çekirdek içinde kritik noktalara bağlanarak paketleri daha verimli işler.

**Avantajları:**

  • **Yüksek Performans:** Paketleri çekirdek seviyesinde daha erken yakalar ve işler, bu da daha düşük gecikme süresi ve daha yüksek verim sağlar.
  • **Esneklik ve Genişletilebilirlik:** Çekirdek kodu değiştirmeden özel ağ ve güvenlik mantığı eklemeye olanak tanır.
  • **Gözlemlenebilirlik:** Çekirdek olaylarını takip etmek ve ağ trafiği hakkında ayrıntılı telemetri toplamak için güçlü yetenekler sunar.
  • **Daha Az Karmaşıklık:** İptables kurallarının karmaşıklığını ve yönetim zorluğunu azaltır.

Sonuç

NetworkPolicy'ler, Kubernetes ortamlarında ağ güvenliğini sağlamanın ve mikrosegmentasyon uygulamanın temel aracıdır. Bu politikalar, uygulamanızın hassasiyetine ve güvenlik gereksinimlerine göre trafik akışını hassas bir şekilde kontrol etmenizi sağlar. Arka planda `iptables` veya `eBPF` gibi teknolojilerin kullanılması, Kubernetes'in bu ağ politikalarını verimli ve güvenli bir şekilde uygulamasını mümkün kılar. Güvenli bir Kubernetes kümesi için NetworkPolicy'lerin doğru bir şekilde yapılandırılması hayati öneme sahiptir. Özellikle yeni nesil CNI'lar ile eBPF'in sunduğu performans ve esneklik, Kubernetes ağ güvenliği için geleceğin standardını belirlemektedir.