コンテンツにスキップ

統合Wallarmサービス付きNGINX Ingress Controllerのデプロイ

本手順は、K8sクラスターにWallarm NGINXベースのIngress Controllerをデプロイする手順を提供します。ソリューションはWallarm Helmチャートからデプロイされます。

本ソリューションは、Wallarmサービスが統合されたCommunity Ingress NGINX Controllerをベースに構築されています。最新バージョンでは、Community Ingress NGINX Controller 1.11.3およびNGINX stable 1.25.5が使用されています。

以下のアーキテクチャとなります。

Solution architecture

ユースケース

全てのサポートされているWallarmのデプロイオプションの中で、このソリューションは以下のユースケースに対して推奨されます:

  • Ingress Controllerが存在せず、Community Ingress NGINX Controllerに対応するIngressリソースにトラフィックをルーティングするセキュリティレイヤーが存在しない場合。

  • 現在Community Ingress NGINX Controllerを使用しており、標準のController機能と強化されたセキュリティ機能を両立するセキュリティソリューションを探している場合。本手順に記載のWallarm-NGINX Ingress Controllerに簡単に切り替えることが可能です。既存の設定を新たなデプロイメントに移行することで、入れ替えが完了します。

    既存のIngress ControllerとWallarm Controllerを同時に使用する場合は、設定の詳細についてIngress Controllerチェーンガイドをご参照ください。

必要条件

  • Kubernetes platform version 1.26-1.30

  • Helm package manager

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

  • 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 below 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

    34.96.64.17
    34.110.183.149
    35.235.66.155
    34.102.90.100
    34.94.156.115
    35.235.115.105
    
    34.160.38.183
    34.144.227.90
    34.90.110.226
    

既知の制限事項

  • postanalyticsモジュールなしでの動作はサポートされません。

  • postanalyticsモジュールのスケールダウンにより、攻撃データが部分的に欠落する可能性があります。

インストール

  1. Wallarm Ingress Controllerをインストールします。

  2. Ingressに対してトラフィック分析を有効化します。

  3. Wallarm Ingress Controllerの動作を確認します。

Step 1: Wallarm Ingress Controllerのインストール

Wallarm Ingress Controllerをインストールするには、以下の手順に従います。

  1. 該当するタイプのフィルタリングノードトークンを生成します。

    1. Wallarm ConsoleのSettingsAPI tokensを、US CloudまたはEU Cloudで開きます。
    2. Deployソースロールを持つAPI tokenを見つけるか、作成します。
    3. このトークンをコピーします。
    1. Wallarm ConsoleのNodesを、US CloudまたはEU Cloudで開きます。
    2. Wallarm nodeタイプのフィルタリングノードを作成し、生成されたトークンをコピーします。

      Creation of a Wallarm node

  2. Wallarm Ingress Controllerを含むHelmチャートをデプロイするため、Kubernetesのnamespaceを作成します。

    kubectl create namespace <KUBERNETES_NAMESPACE>
    
  3. Wallarmチャートリポジトリを追加します。

    helm repo add wallarm https://charts.wallarm.com
    helm repo update wallarm
    
  4. Wallarm設定を記載したvalues.yamlファイルを作成します。最小構成の例は以下の通りです。

    API tokenを使用する場合は、nodeGroupパラメータにノードグループ名を指定してください。ノードはこのグループに割り当てられ、Wallarm ConsoleのNodesセクションに表示されます。デフォルトのグループ名はdefaultIngressGroupです。

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

    また、WallarmノードトークンをKubernetes Secretsに保存してHelmチャートで参照することもできます。詳細はこちら

    Deployment from your own registries

    values.yamlファイルの要素を上書きすることで、自社レジストリに保存されたイメージからWallarm Ingress Controllerをインストールすることができます。

  5. Wallarmパッケージをインストールします。

    helm install --version 5.3.0 <RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE> -f <PATH_TO_VALUES>
    
    • <RELEASE_NAME>はIngress ControllerチャートのHelmリリース名です。
    • <KUBERNETES_NAMESPACE>はWallarm Ingress Controllerを含むHelmチャート用に作成したKubernetes namespaceです。
    • <PATH_TO_VALUES>values.yamlファイルへのパスです。

Step 2: Ingressに対するトラフィック分析の有効化

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の名前です。

  • <YOUR_INGRESS_NAMESPACE>はIngressのnamespaceです。

  • <APPLICATION_ID>は、それぞれのアプリケーションまたはアプリケーショングループに固有の正の数です。これにより、個別の統計情報取得や、対応するアプリケーションを対象とした攻撃の識別が可能になります。

Step 3: Wallarm Ingress Controllerの動作確認

  1. Podのリストを取得します。

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

    各PodはSTATUS: RunningおよびREADY: N/Nと表示される必要があります。例:

    NAME                                                              READY     STATUS    RESTARTS   AGE
    ingress-controller-nginx-ingress-controller-675c68d46d-cfck8      3/3       Running   0          5m
    ingress-controller-nginx-ingress-controller-wallarm-tarantljj8g   4/4       Running   0          5m
    
  2. テスト用のPath Traversal攻撃を含むリクエストをIngress Controller Serviceに送信します。

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

    フィルタリングノードがblockモードで動作している場合、リクエストのレスポンスとして403 Forbiddenが返され、Wallarm ConsoleのAttacksセクションに攻撃が表示されます。

ARM64デプロイメント

NGINX Ingress ControllerのHelmチャートバージョン4.8.2より、ARM64プロセッサとの互換性が導入されました。初期はx86アーキテクチャ向けに設定されていましたが、ARM64ノードでのデプロイはHelmチャートパラメータの変更が必要です。

ARM64環境では、Kubernetesノードにarm64ラベルが付与されることが多いため、Wallarmワークロードを適切なノードタイプに割り当てるため、Helmチャート設定内でnodeSelectortolerations、またはaffinityルールを参照してください。

以下は、Google Kubernetes Engine(GKE)向けのWallarm Helmチャートの例です。該当ノードにはkubernetes.io/arch: arm64ラベルが利用されています。このテンプレートは、他のクラウド環境におけるARM64のラベリング規則に合わせて変更可能です。

controller:
  nodeSelector:
    kubernetes.io/arch: arm64
  admissionWebhooks:
    nodeSelector:
      kubernetes.io/arch: arm64
    patch:
      nodeSelector:
        kubernetes.io/arch: arm64
  wallarm:
    tarantool:
      nodeSelector:
        kubernetes.io/arch: arm64
    enabled: true
    token: "<NODE_TOKEN>"
    apiHost: "us1.api.wallarm.com" # if using EU Cloud, comment out this line
    # If using an API token, uncomment the following line and specify your node group name
    # 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:
    tarantool:
      tolerations:
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
    enabled: true
    token: "<NODE_TOKEN>"
    apiHost: "us1.api.wallarm.com" # if using EU Cloud, comment out this line
    # If using an API token, uncomment the following line and specify your node group name
    # nodeGroup: defaultIngressGroup

自社レジストリからのデプロイ

何らかの理由でWallarmパブリックリポジトリからDockerイメージを取得できない場合(例えば、社内セキュリティポリシーにより外部リソースの使用が制限されている場合)、代替として以下を行うことが可能です:

  1. これらのイメージを自社のプライベートレジストリにクローンします。

  2. 自社レジストリに保存されたイメージを使用して、Wallarm NGINXベースのIngress Controllerをインストールします。

HelmチャートでNGINXベースのIngress Controllerのデプロイメントに使用されるDockerイメージは、以下の通りです:

自社レジストリに保存されたイメージを使用してWallarm NGINXベースのIngress Controllerをインストールするには、Wallarm Ingress Controller Helmチャートのvalues.yamlファイルを上書きしてください:

controller:
  image:
    ## The image and tag for wallarm nginx ingress controller
    ##
    registry: <YOUR_REGISTRY>
    image: wallarm/ingress-controller
    tag: <IMAGE_TAG>
  wallarm:
    helpers:
      ## The image and tag for the helper image
      ##
      image: <YOUR_REGISTRY>/wallarm/node-helpers
      tag: <IMAGE_TAG>

その後、修正済みのvalues.yamlを使用してインストールを実行してください。

設定

Wallarm Ingress Controllerのインストールおよび動作確認が完了した後、以下のような高度な設定を行うことができます:

高度な設定に使用されるパラメータや詳細な手順については、こちらのリンクを参照してください。