コンテンツにスキップ

Wallarmサイドカーのデプロイ

KubernetesクラスターにPodとしてデプロイされたアプリケーションを保護するため、アプリケーションの前にNGINXベースのWallarmノードをサイドカーコントローラーとして実行できます。Wallarmサイドカーコントローラーは、正当なリクエストのみを許可し、不正なリクエストを緩和することで、アプリケーションPodへの着信トラフィックをフィルタリングします。

Wallarmサイドカーソリューションの主な特徴

  • アプリケーションと同様のデプロイ形式を提供することで、個々のマイクロサービスとそのレプリカやシャードの保護を容易にします

  • どのIngressコントローラーとも完全に互換性があります

  • サービスメッシュアプローチで一般的な高負荷下でも安定して動作します

  • アプリケーションを保護するための最小限のサービス構成で済みます。アプリケーションPodに適切な注釈とラベルを追加するだけです

  • Wallarmコンテナのデプロイには、中程度の負荷向けにWallarmサービスを1つのコンテナで動作させるモードと、高負荷向けにWallarmサービスを複数のコンテナに分割するモードの2種類をサポートします

  • Wallarmサイドカーソリューションのローカルデータ解析バックエンドとして、多くのメモリを消費するpostanalyticsモジュール専用のエンティティを提供します

ユースケース

すべてのWallarmデプロイメントオプションの中でも、このソリューションは以下のユースケースに推奨されます:

  • 既存のIngressコントローラー(例:AWS ALB Ingress Controller)を使用しているため、Wallarm NGINXベースWallarm KongベースのIngressコントローラーのいずれかをデプロイできない場合

  • ゼロトラスト環境で、各マイクロサービス(内部APIを含む)をセキュリティソリューションで保護する必要がある場合

トラフィックフロー

Wallarmサイドカーによるトラフィックフロー:

Wallarmサイドカーによるトラフィックフロー

ソリューションアーキテクチャ

Wallarmサイドカーソリューションは、以下のDeploymentオブジェクトによって構成されます:

  • サイドカーコントローラー (wallarm-sidecar-controller) は、Helmチャートの値とPodの注釈に基づいてPodにWallarmサイドカーリソースを注入し、ノードコンポーネントをWallarm Cloudに接続する変異的アドミッションウェブフックです。

    Kubernetesでwallarm-sidecar: enabledラベルが付与された新しいPodが起動すると、コントローラーは自動的に着信トラフィックをフィルタリングする追加のコンテナをPodに注入します。

  • Postanalyticsモジュール (wallarm-sidecar-postanalytics) は、Wallarmサイドカーソリューションのローカルデータ解析バックエンドです。このモジュールはインメモリストレージのTarantoolと、collectdやattack export servicesなどのヘルパーコンテナセットを使用します。

Wallarmデプロイメントオブジェクト

Wallarmサイドカーには、ライフサイクル上で2つの標準ステージがあります:

  1. 初期ステージでは、コントローラーがHelmチャートの値とPodの注釈に基づいてPodにWallarmサイドカーリソースを注入し、ノードコンポーネントをWallarm Cloudに接続します。

  2. 実行時ステージでは、postanalyticsモジュールを含むリクエストの解析とプロキシ/転送を行います。

このソリューションは、Alpine LinuxベースかつAlpineが提供するNGINXバージョンのDockerイメージを使用します。現在、最新のイメージはAlpine Linuxバージョン3.20を使用しており、NGINXの安定版1.26.1が含まれています。

必要条件

  • Kubernetes platform version 1.19-1.29

  • Helm v3 package manager

  • An application deployed as a Pod in a Kubernetes cluster

  • 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

  • Access to the Wallarm repositories on Docker Hub https://hub.docker.com/r/wallarm

  • 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
    
  • Access to the account with the Administrator role in Wallarm Console for the US Cloud or the EU Cloud

デプロイメント

Wallarmサイドカーソリューションをデプロイするには:

  1. フィルタリングノードトークンを生成します。

  2. Wallarm Helmチャートをデプロイします。

  3. アプリケーションPodにWallarmサイドカーをアタッチします。

  4. Wallarmサイドカーの動作をテストします。

ステップ1: フィルタリングノードトークンの生成

Wallarm Cloudにサイドカーポッドを接続するため、適切なタイプのフィルタリングノードトークンを生成します:

  1. Wallarm Console → SettingsAPI tokensUS CloudまたはEU Cloudで開きます。
  2. DeployソースロールのAPIトークンを探すか作成します。
  3. このトークンをコピーします。
  1. Wallarm Console → NodesUS CloudまたはEU Cloudで開きます。
  2. Wallarm nodeタイプのフィルタリングノードを作成し、生成されたトークンをコピーします。

Wallarmノードの作成

ステップ2: Wallarm Helmチャートのデプロイ

  1. Wallarmチャートリポジトリを追加します:

    helm repo add wallarm https://charts.wallarm.com
    helm repo update wallarm
    

  2. Wallarmサイドカーの構成を使用してvalues.yamlファイルを作成します。最小限の構成例は以下の通りです。

    APIトークンを使用する場合、nodeGroupパラメータにノードグループ名を指定します。サイドカーポッド用に作成されたノードは、このグループに割り当てられ、Wallarm ConsoleのNodesセクションに表示されます。デフォルトのグループ名はdefaultSidecarGroupです。必要に応じて、後でsidecar.wallarm.io/wallarm-node-group注釈を使用して、保護するアプリケーションのPodごとにフィルタリングノードグループ名を個別に設定できます。

    config:
      wallarm:
        api:
          token: "<NODE_TOKEN>"
          host: "us1.api.wallarm.com"
          # nodeGroup: "defaultSidecarGroup"
    
    config:
      wallarm:
        api:
          token: "<NODE_TOKEN>"
          # nodeGroup: "defaultSidecarGroup"
    

    <NODE_TOKEN>は、Kubernetesで実行するWallarmノードのトークンです。

    Using one token for several installations

    You can use one token in several installations regardless of the selected platform. It allows logical grouping of node instances in the Wallarm Console UI. Example: you deploy several Wallarm nodes to a development environment, each node is on its own machine owned by a certain developer.

  3. Wallarm Helmチャートをデプロイします:

    helm install --version 5.3.0 <RELEASE_NAME> wallarm/wallarm-sidecar --wait -n wallarm-sidecar --create-namespace -f <PATH_TO_VALUES>
    
    • <RELEASE_NAME>はWallarmサイドカーチャートのHelmリリース名です
    • wallarm-sidecarはWallarmサイドカーチャートのHelmリリースをデプロイする新しいnamespaceであり、別のnamespaceにデプロイすることを推奨します
    • <PATH_TO_VALUES>values.yamlファイルへのパスです

ステップ3: アプリケーションPodにWallarmサイドカーをアタッチ

Wallarmがアプリケーショントラフィックをフィルタリングするため、該当するアプリケーションPodにwallarm-sidecar: enabledラベルを追加します:

kubectl edit deployment -n <APPLICATION_NAMESPACE> <APP_LABEL_VALUE>
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
        wallarm-sidecar: enabled
    spec:
      containers:
        - name: application
          image: kennethreitz/httpbin
          ports:
            - name: http
              containerPort: 80
  • もし、アプリケーションPodのwallarm-sidecarラベルがdisabledに設定されているか明示的に指定されていない場合、WallarmサイドカーコンテナはPodに注入されず、そのためWallarmはトラフィックをフィルタリングしません。

  • アプリケーションPodのwallarm-sidecarラベルがenabledに設定されていれば、WallarmサイドカーコンテナがPodに注入され、着信トラフィックがWallarmによってフィルタリングされます。

ステップ4: Wallarmサイドカーの動作確認

Wallarmサイドカーが正しく動作しているかテストするには:

  1. Wallarmコントロールプレーンの詳細を取得し、正常に起動しているか確認します:

    kubectl get pods -n wallarm-sidecar -l app.kubernetes.io/name=wallarm-sidecar
    

    各Podは、例のようにREADY: N/NおよびSTATUS: Runningを表示する必要があります:

    NAME                                              READY   STATUS    RESTARTS   AGE
    wallarm-sidecar-controller-54cf88b989-gp2vg      1/1     Running   0          91m
    wallarm-sidecar-postanalytics-86d9d4b6cd-hpd5k   4/4     Running   0          91m
    
  2. アプリケーションPodの詳細を取得し、Wallarmサイドカーコンテナが正常に注入されているか確認します:

    kubectl get pods -n <APPLICATION_NAMESPACE> --selector app=<APP_LABEL_VALUE>
    

    出力は、サイドカーコンテナの注入成功を示すREADY: 2/2と、Wallarm Cloudへの接続成功を示すSTATUS: Runningを表示するはずです:

    NAME                     READY   STATUS    RESTARTS   AGE
    myapp-5c48c97b66-lzkwf   2/2     Running   0          3h4m
    
  3. Wallarmがトラフィックをフィルタリングできるように、アプリケーションクラスターアドレスに対してテストのPath Traversal攻撃を送信します:

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

    Wallarmプロキシはデフォルトでmonitoringfiltration modeで動作するため、Wallarmノードは攻撃をブロックすることはなく、記録します。

    攻撃が記録されたことを確認するには、Wallarm Console → Attacksに進んでください:

    インターフェース上の攻撃

ARM64デプロイメント

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

ARM64環境では、Kubernetesノードにarm64ラベルが付与されている場合が多いです。KubernetesスケジューラーがWallarmのワークロードを適切なノードに割り当てるために、Helmチャートの構成内でnodeSelectortolerations、またはアフィニティルールを参照して、このラベルを指定します。

以下は、Google Kubernetes Engine (GKE)向けのWallarm Helmチャートの例です。ここでは、関連するノードに対してkubernetes.io/arch: arm64ラベルを使用しています。このテンプレートは、他のクラウド環境に合わせたARM64ラベリングの規約に応じて修正可能です。

config:
  wallarm:
    api:
      token: "<NODE_TOKEN>"
      # If using an API token, uncomment the following line and specify your node group name
      # nodeGroup: "defaultSidecarGroup"
  postanalytics:
    nodeSelector:
      kubernetes.io/arch: arm64
  controller:
    nodeSelector:
      kubernetes.io/arch: arm64
config:
  wallarm:
    api:
      token: "<NODE_TOKEN>"
      # If using an API token, uncomment the following line and specify your node group name
      # nodeGroup: "defaultSidecarGroup"
  postanalytics:
    tolerations:
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
  controller:
    tolerations:
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule

OpenShiftにおけるSecurity Context Constraints (SCC)

OpenShiftプラットフォームにSidecarソリューションをインストールする際、プラットフォームのセキュリティ要件に合わせたカスタムSecurity Context Constraint (SCC) を定義する必要があります。デフォルトの制約ではWallarmソリューションにとって不十分となり、エラーが発生する可能性があります。

以下は、OpenShift向けに調整されたWallarmサイドカーソリューション推奨のカスタムSCCです。この構成は、特権モードを使用せず、iptablesを利用しない状態でソリューションを実行するために設計されています。

SCCをデプロイ前に適用してください

Wallarmサイドカーソリューションをデプロイする前に、必ずSCCを適用してください。

  1. wallarm-scc.yamlファイルにカスタムSCCを以下のように定義します:

    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-sidecar-deployment
      name: wallarm-sidecar-deployment
    priority: null
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - ALL
    runAsUser:
      type: MustRunAs
      uid: 101
    seLinuxContext:
      type: MustRunAs
    seccompProfiles:
    - runtime/default
    supplementalGroups:
      type: RunAsAny
    users: []
    volumes:
    - configMap
    - emptyDir
    - secret
    
  2. このポリシーをクラスターに適用します:

    kubectl apply -f wallarm-scc.yaml
    
  3. WallarmサイドカーソリューションがこのSCCポリシーを使用できるようにします:

    oc adm policy add-scc-to-user wallarm-sidecar-deployment system:serviceaccount:<WALLARM_SIDECAR_NAMESPACE>:<POSTANALYTICS_POD_SERVICE_ACCOUNT_NAME>
    
    • <WALLARM_SIDECAR_NAMESPACE>はWallarmサイドカーソリューションをデプロイするnamespaceです。
    • <POSTANALYTICS_POD_SERVICE_ACCOUNT_NAME>は自動生成され、通常は<RELEASE_NAME>-wallarm-sidecar-postanalyticsという形式になります。ここで、<RELEASE_NAME>helm install時に割り当てるHelmリリース名です。

    例として、namespace名がwallarm-sidecarでHelmリリース名がwlrm-sidecarの場合、コマンドは以下のようになります:

    oc adm policy add-scc-to-user wallarm-sidecar-deployment system:serviceaccount:wallarm-sidecar:wlrm-sidecar-wallarm-sidecar-postanalytics
    
  4. デプロイメントに進み、前述のnamespaceとHelmリリース名を引き続き使用してSidecarソリューションをデプロイします。

  5. 特権のiptablesコンテナが不要となるように、iptablesの使用を無効化します。これは、values.yamlファイルをグローバルに変更するか、またはPodごとに設定することで実現できます.

    1. values.yamlで、config.injectionStrategy.iptablesEnablefalseに設定します.

      config:
        injectionStrategy:
          iptablesEnable: false
        wallarm:
          api:
            ...
      
    2. Serviceマニフェストのspec.ports.targetPort設定をproxyポートに向けて更新します。iptablesベースのトラフィックキャプチャが無効の場合、Wallarmサイドカーコンテナはproxyという名前のポートを公開します.

    1. Podの注釈sidecar.wallarm.io/sidecar-injection-iptables-enable"false"に設定して、Podごとにiptablesを無効化します.
    2. Serviceマニフェストのspec.ports.targetPort設定をproxyポートに向けて更新します。iptablesベースのトラフィックキャプチャが無効の場合、Wallarmサイドカーコンテナはproxyという名前のポートを公開します.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
            wallarm-sidecar: enabled
          annotations:
            sidecar.wallarm.io/sidecar-injection-iptables-enable: "false"
        spec:
          containers:
            - name: application
              image: kennethreitz/httpbin
              ports:
                - name: http
                  containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc
      namespace: default
    spec:
      ports:
        - port: 80
          targetPort: proxy
          protocol: TCP
          name: http
      selector:
        app: myapp
    
  6. 直前の手順で適用されたpostanalytics PodへのSCCが正しく適用されていることを、以下のコマンドで確認します:

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

    期待される出力はwallarm-sidecar-deploymentです.

  7. 初期のwallarm-sidecar-deploymentポリシーでUID 101の許可が指定されているため、アプリケーションPodにも同様のSCCを適用するよう更新します。これは、デプロイ時に注入されるWallarmサイドカーコンテナがUID 101で動作し、特定の権限を必要とするため非常に重要です.

    以下のコマンドを使用して、以前作成したwallarm-sidecar-deploymentポリシーをアプリケーションPodに適用します。通常、アプリケーションとWallarmの要件に合わせたカスタムポリシーを作成します.

    oc adm policy add-scc-to-user wallarm-sidecar-deployment system:<APP_NAMESPACE>:<APP_POD_SERVICE_ACCOUNT_NAME>
    
  8. 更新したSCCを適用してアプリケーションをデプロイします。例:

    kubectl -n <APP_NAMESPACE> apply -f <MANIFEST_FILE>
    

カスタマイズ

Wallarmポッドは、デフォルトのvalues.yamlと、デプロイメント時に指定したカスタム構成に基づいて注入されています。

Wallarmソリューションを最大限に活用するために、グローバルおよびPodごとにWallarmプロキシの動作をさらにカスタマイズすることが可能です。

Wallarmプロキシソリューションのカスタマイズガイドに進んでください。