Ana içeriğe geç

Entegre Wallarm Servisleri ile NGINX Ingress Controller Dağıtımı

Bu talimatlar, Wallarm NGINX tabanlı Ingress controller'ını K8s kümenize dağıtmanız için gereken adımları sağlar. Çözüm, Wallarm Helm chart’ından dağıtılır.

Çözüm, entegre Wallarm servisleri ile Community Ingress NGINX Controller üzerine inşa edilmiştir. En son sürüm, NGINX stable 1.25.5 ile Community Ingress NGINX Controller 1.11.8’i, upstream Helm chart 4.11.8’i ve temel imaj olarak Alpine Linux 3.22.0’ı kullanır.

Aşağıdaki mimariye sahiptir:

Çözüm mimarisi

Kullanım senaryoları

Desteklenen tüm Wallarm dağıtım seçenekleri arasında, bu çözüm aşağıdaki kullanım senaryoları için önerilir:

  • Community Ingress NGINX Controller ile uyumlu Ingress kaynaklarına trafiği yönlendiren bir Ingress controller'ınız ve güvenlik katmanınız yok.

  • Hâlihazırda Community Ingress NGINX Controller kullanıyor ve hem standart controller işlevselliğini hem de gelişmiş güvenlik özelliklerini sunan bir güvenlik çözümü arıyorsunuz. Bu durumda, bu talimatta detaylandırılan Wallarm‑NGINX Ingress Controller’a zahmetsizce geçiş yapabilirsiniz. Değişimi tamamlamak için mevcut yapılandırmanızı yeni dağıtıma taşımanız yeterlidir.

    Hem mevcut Ingress controller’ı hem de Wallarm controller’ı aynı anda kullanmak için yapılandırma detayları için Ingress Controller zincirleme kılavuzuna bakın.

Gereksinimler

  • Kubernetes platform version 1.26-1.30

  • Helm package manager

  • Compatibility of your services with the Community Ingress NGINX Controller version 1.11.8

  • Access to the account with the Administrator role in Wallarm Console for the US Cloud or EU Cloud

  • Access to https://us1.api.wallarm.com for working with US Wallarm Cloud or to https://api.wallarm.com for working with EU Wallarm Cloud

  • Access to https://charts.wallarm.com to add the Wallarm Helm charts. Ensure the access is not blocked by a firewall

  • Access to the Wallarm repositories on Docker Hub https://hub.docker.com/r/wallarm. Make sure the access is not blocked by a firewall

  • Access to the IP addresses and their corresponding hostnames (if any) listed below. This is needed for downloading updates to attack detection rules and API specifications, as well as retrieving precise IPs for your allowlisted, denylisted, or graylisted countries, regions, or data centers

    node-data0.us1.wallarm.com - 34.96.64.17
    node-data1.us1.wallarm.com - 34.110.183.149
    us1.api.wallarm.com - 35.235.66.155
    34.102.90.100
    34.94.156.115
    35.235.115.105
    
    node-data1.eu1.wallarm.com - 34.160.38.183
    node-data0.eu1.wallarm.com - 34.144.227.90
    api.wallarm.com - 34.90.110.226
    

Ayrıca bakınız

Bilinen kısıtlamalar

  • Postanalytics modülü olmadan çalıştırma desteklenmez.

  • Postanalytics modülünün küçültülmesi saldırı verilerinin kısmi kaybına yol açabilir.

Kurulum

  1. Wallarm Ingress controller’ı kurun.

  2. Ingress’iniz için trafik analizini etkinleştirin.

  3. Wallarm Ingress controller’ın çalışmasını kontrol edin.

Adım 1: Wallarm Ingress Controller'ın kurulumu

Wallarm Ingress Controller’ı kurmak için:

  1. Uygun türde bir filtreleme düğümü belirteci (token) oluşturun:

    1. Wallarm Console → SettingsAPI tokens’ı US Cloud veya EU Cloud içinde açın.
    2. Kullanım türü Node deployment/Deployment olan bir API belirtecini bulun veya oluşturun.
    3. Bu belirteci kopyalayın.
    1. Wallarm Console → Nodes’u US Cloud veya EU Cloud içinde açın.
    2. Wallarm node türünde bir filtreleme düğümü oluşturun ve üretilen belirteci kopyalayın.

      Bir Wallarm düğümünün oluşturulması

  2. Wallarm Ingress controller ile Helm chart’ı dağıtmak için bir Kubernetes namespace’i oluşturun:

    kubectl create namespace <KUBERNETES_NAMESPACE>
    
  3. Wallarm chart deposunu ekleyin:

    helm repo add wallarm https://charts.wallarm.com
    helm repo update wallarm
    
  4. Wallarm yapılandırmasıyla values.yaml dosyasını oluşturun. Minimum yapılandırmaya sahip örnek dosya aşağıdadır.

    Bir API belirteci kullanırken, nodeGroup parametresinde bir düğüm grubu adı belirtin. Düğümünüz bu gruba atanacak ve Wallarm Console’un Nodes bölümünde görünecektir. Varsayılan grup adı defaultIngressGroup’dur.

    controller:
      wallarm:
        enabled: "true"
        token: "<NODE_TOKEN>"
        apiHost: "us1.api.wallarm.com"
        # nodeGroup: defaultIngressGroup
    
    controller:
      wallarm:
        enabled: "true"
        token: "<NODE_TOKEN>"
        # nodeGroup: defaultIngressGroup
    

    Wallarm düğüm belirtecini Kubernetes secrets içinde saklayabilir ve Helm chart’a çekebilirsiniz. Daha fazla bilgi

    Kendi kayıtlarınızdan dağıtım

    Wallarm Ingress controller’ı kendi kayıtlarınızdaki imajlardan kurmak için values.yaml dosyasının öğelerini ezebilirsiniz.

  5. Wallarm paketlerini kurun:

    helm install --version 6.5.1 <RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE> -f <PATH_TO_VALUES>
    
    • <RELEASE_NAME>: Ingress controller chart’ının Helm sürümü için ad
    • <KUBERNETES_NAMESPACE>: Wallarm Ingress controller ile Helm chart’ı için oluşturduğunuz Kubernetes namespace’i
    • <PATH_TO_VALUES>: values.yaml dosyasının yolu

Adım 2: Ingress’iniz için trafik analizini etkinleştirme

kubectl annotate ingress <YOUR_INGRESS_NAME> -n <YOUR_INGRESS_NAMESPACE> nginx.ingress.kubernetes.io/wallarm-mode=monitoring
kubectl annotate ingress <YOUR_INGRESS_NAME> -n <YOUR_INGRESS_NAMESPACE> nginx.ingress.kubernetes.io/wallarm-application="<APPLICATION_ID>"
  • <YOUR_INGRESS_NAME>: Ingress’inizin adı

  • <YOUR_INGRESS_NAMESPACE>: Ingress’inizin namespace’i

  • <APPLICATION_ID>: Uygulamalarınız veya uygulama gruplarınızdan her biri için benzersiz olan pozitif bir sayıdır. Bu, ayrı istatistikler almanıza ve ilgili uygulamalara yönelik saldırıları ayırt etmenize olanak tanır

Adım 3: Wallarm Ingress Controller’ın çalışmasını kontrol etme

  1. Pod listesini alın:

    kubectl get pods -n <NAMESPACE> -l app.kubernetes.io/name=wallarm-ingress
    

    Wallarm pod durumu STATUS: Running ve READY: N/N olmalıdır:

    NAME                                                                  READY   STATUS    RESTARTS   AGE
    ingress-controller-wallarm-ingress-controller-6d659bd79b-952gl        3/3     Running   0          8m7s
    ingress-controller-wallarm-ingress-controller-wallarm-wstore-7ddmgbfm 3/3     Running   0          8m7s
    
  2. Ingress Controller Service’e test Yol Geçişi saldırısı içeren isteği gönderin:

    curl http://<INGRESS_CONTROLLER_IP>/etc/passwd
    

    Filtreleme düğümü block modunda çalışıyorsa, isteğe verilen yanıtta 403 Forbidden kodu döner ve saldırı Wallarm Console → Attacks içinde görüntülenir.

ARM64 dağıtımı

NGINX Ingress controller’ın Helm chart sürümü 4.8.2 ile ARM64 işlemci uyumluluğu sunulmuştur. Başlangıçta x86 mimarileri için ayarlanmışken, ARM64 düğümlerine dağıtım Helm chart parametrelerinin değiştirilmesini gerektirir.

ARM64 ayarlarında, Kubernetes düğümleri genellikle arm64 etiketi taşır. Kubernetes scheduler’ın Wallarm iş yükünü uygun düğüm türüne atamasına yardımcı olmak için, Wallarm Helm chart yapılandırmasında bu etikete nodeSelector, tolerations veya affinity kurallarıyla referans verin.

Aşağıda, ilgili düğümler için kubernetes.io/arch: arm64 etiketini kullanan Google Kubernetes Engine (GKE) için Wallarm Helm chart örneği verilmiştir. Bu şablon, ARM64 etiketleme kurallarına saygı duyularak diğer bulut kurulumlarıyla uyumlu olacak şekilde değiştirilebilir.

controller:
  nodeSelector:
    kubernetes.io/arch: arm64
  admissionWebhooks:
    nodeSelector:
      kubernetes.io/arch: arm64
    patch:
      nodeSelector:
        kubernetes.io/arch: arm64
  wallarm:
    postanalytics:
      nodeSelector:
        kubernetes.io/arch: arm64
    enabled: true
    token: "<NODE_TOKEN>"
    apiHost: "us1.api.wallarm.com" # EU Cloud kullanıyorsanız bu satırı yorumlayın
    # Bir API belirteci kullanıyorsanız, aşağıdaki satırı yorumdan çıkarın ve düğüm grup adınızı belirtin
    # nodeGroup: defaultIngressGroup
controller:
  tolerations:
    - key: kubernetes.io/arch
      operator: Equal
      value: arm64
      effect: NoSchedule
  admissionWebhooks:
    patch:
      tolerations:
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
  wallarm:
    postanalytics:
      tolerations:
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
    enabled: true
    token: "<NODE_TOKEN>"
    apiHost: "us1.api.wallarm.com" # EU Cloud kullanıyorsanız bu satırı yorumlayın
    # Bir API belirteci kullanıyorsanız, aşağıdaki satırı yorumdan çıkarın ve düğüm grup adınızı belirtin
    # nodeGroup: defaultIngressGroup

Kendi kayıtlarınızdan dağıtım

Bazı nedenlerle, örneğin şirket güvenlik politikanız herhangi bir harici kaynağın kullanımını kısıtladığı için Wallarm genel deposundan Docker imajlarını çekemiyorsanız, bunun yerine:

  1. Bu imajları özel kayıtlarınıza klonlayın.

  2. Bunları kullanarak Wallarm NGINX tabanlı Ingress controller’ı kurun.

NGINX tabanlı Ingress Controller dağıtımı için Helm chart tarafından aşağıdaki Docker imajları kullanılır:

Kayıtlarınızda depolanan imajları kullanarak Wallarm NGINX tabanlı Ingress controller’ı kurmak için, Wallarm Ingress controller Helm chart’ının values.yaml dosyasını aşağıdaki şekilde değiştirin:

controller:
  image:
    ## Wallarm nginx ingress controller için imaj ve etiket
    ##
    registry: <YOUR_REGISTRY>
    image: wallarm/ingress-controller
    tag: <IMAGE_TAG>
  wallarm:
    helpers:
      ## Yardımcı imaj için imaj ve etiket
      ##
      image: <YOUR_REGISTRY>/wallarm/node-helpers
      tag: <IMAGE_TAG>

Ardından, değiştirilmiş values.yaml dosyanızı kullanarak kurulumu çalıştırın.

OpenShift’te Security Context Constraints (SCC)

NGINX Ingress Controller’ı OpenShift üzerinde dağıtırken, platformun güvenlik gereksinimlerine uygun özel bir Security Context Constraint (SCC) tanımlamak gerekir. Varsayılan kısıtlamalar Wallarm çözümü için yetersiz kalabilir ve hatalara yol açabilir.

Aşağıda, Wallarm NGINX Ingress Controller için önerilen özel SCC yer almaktadır.

Controller'ı dağıtmadan önce SCC'yi uygulayın

SCC’nin Wallarm NGINX Ingress controller dağıtımından önce uygulanmış olduğundan emin olun.

  1. Özel SCC’yi aşağıdaki gibi wallarm-scc.yaml dosyasında tanımlayın:

    ---
    allowHostDirVolumePlugin: false
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: false
    allowPrivilegedContainer: false
    allowedCapabilities:
    - NET_BIND_SERVICE
    apiVersion: security.openshift.io/v1
    defaultAddCapabilities: null
    fsGroup:
      type: MustRunAs
    groups: []
    kind: SecurityContextConstraints
    metadata:
      annotations:
        kubernetes.io/description: wallarm-ingress-admission provides features similar to restricted-v2 SCC
          but pins user id to 65532 and is more restrictive for volumes
      name: wallarm-ingress-admission
    priority: null
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - ALL
    runAsUser:
      type: MustRunAs
      uid: 65532
    seLinuxContext:
      type: MustRunAs
    seccompProfiles:
    - runtime/default
    supplementalGroups:
      type: RunAsAny
    users: []
    volumes:
    - projected
    ---
    allowHostDirVolumePlugin: false
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: false
    allowPrivilegedContainer: false
    allowedCapabilities:
    - NET_BIND_SERVICE
    apiVersion: security.openshift.io/v1
    defaultAddCapabilities: null
    fsGroup:
      type: MustRunAs
    groups: []
    kind: SecurityContextConstraints
    metadata:
      annotations:
        kubernetes.io/description: wallarm-ingress-controller provides features similar to restricted-v2 SCC
          but pins user id to 101 and is a little more restrictive for volumes
      name: wallarm-ingress-controller
    priority: null
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - ALL
    runAsUser:
      type: MustRunAs
      uid: 101
    seLinuxContext:
      type: MustRunAs
    seccompProfiles:
    - runtime/default
    supplementalGroups:
      type: RunAsAny
    users: []
    volumes:
    - configMap
    - secret
    - emptyDir
    
  2. Bu politikayı kümeye uygulayın:

    kubectl apply -f wallarm-scc.yaml
    
  3. NGINX Ingress controller’ın dağıtılacağı bir Kubernetes namespace’i oluşturun, örneğin:

    kubectl create namespace wallarm-ingress
    
  4. Wallarm Ingress controller iş yüklerinin bu SCC politikasını kullanmasına izin verin:

    oc adm policy add-scc-to-user wallarm-ingress-admission \
      -z <RELEASE_NAME>-wallarm-ingress-admission -n wallarm-ingress
    
    oc adm policy add-scc-to-user wallarm-ingress-controller \
      -z <RELEASE_NAME>-wallarm-ingress -n wallarm-ingress
    
    oc adm policy add-scc-to-user wallarm-ingress-controller \
      -z default -n wallarm-ingress
    
    • <RELEASE_NAME>: helm install sırasında kullanacağınız Helm sürüm adı.
    • -n wallarm-ingress: NGINX Ingress controller’ın dağıtılacağı namespace (yukarıda oluşturuldu).

    Örneğin, wallarm-ingress namespace’i ve wlrm-ingress Helm sürüm adıyla:

    oc adm policy add-scc-to-user wallarm-ingress-admission \
      -z wlrm-ingress-wallarm-ingress-admission -n wallarm-ingress
    
    oc adm policy add-scc-to-user wallarm-ingress-controller \
      -z wlrm-ingress-wallarm-ingress -n wallarm-ingress
    
    oc adm policy add-scc-to-user wallarm-ingress-controller \
      -z default -n wallarm-ingress
    
  5. Yukarıda belirtilen aynı namespace ve Helm sürüm adını kullanarak Wallarm NGINX Ingress controller’ı dağıtın.

  6. Doğru SCC’nin Wallarm pod’larına uygulandığını doğrulayın:

    WALLARM_INGRESS_NAMESPACE="<WALLARM_INGRESS_NAMESPACE>"
    POD=$(kubectl -n ${WALLARM_INGRESS_NAMESPACE} get pods -o name -l "app.kubernetes.io/component=controller" | cut -d '/' -f 2)
    kubectl -n ${WALLARM_INGRESS_NAMESPACE} get pod ${POD} -o jsonpath='{.metadata.annotations.openshift\.io\/scc}{"\n"}'
    
    WALLARM_INGRESS_NAMESPACE="<WALLARM_INGRESS_NAMESPACE>"
    POD=$(kubectl -n ${WALLARM_INGRESS_NAMESPACE} get pods -o name -l "app.kubernetes.io/component=controller-wallarm-wstore" | cut -d '/' -f 2)
    kubectl -n ${WALLARM_INGRESS_NAMESPACE} get pod ${POD} -o jsonpath='{.metadata.annotations.openshift\.io\/scc}{"\n"}'
    

    Beklenen çıktı wallarm-ingress-controller’dır.

Yapılandırma

Wallarm Ingress controller başarıyla kurulduktan ve kontrol edildikten sonra aşağıdakiler gibi gelişmiş yapılandırmalar yapabilirsiniz:

Gelişmiş yapılandırma için kullanılan parametreleri ve ilgili talimatları bulmak üzere lütfen bağlantıyı takip edin.