コンテンツにスキップ

NGINXベースのWallarm Ingress Controllerの微調整

自己ホスト型Wallarm Ingress Controllerを最大限に活用するための微調整オプションを学びます。

公式NGINX Ingress Controllerのドキュメント

Wallarm Ingress Controllerの微調整は、公式ドキュメントに記載のNGINX Ingress Controllerの微調整と非常に類似しています。Wallarmを使用する場合、元のNGINX Ingress Controllerの設定オプションすべてが利用可能です。

Helm Chartの追加設定

設定はvalues.yamlファイルに定義されています。デフォルトでは、ファイルは以下のようになっています:

controller:
  wallarm:
    enabled: false
    apiHost: api.wallarm.com
    apiPort: 443
    apiSSL: true
    token: ""
    nodeGroup: defaultIngressGroup
    existingSecret:
      enabled: false
      secretKey: token
      secretName: wallarm-api-token
    tarantool:
      kind: Deployment
      service:
        annotations: {}
      replicaCount: 1
      arena: "1.0"
      livenessProbe:
        failureThreshold: 3
        initialDelaySeconds: 10
        periodSeconds: 10
        successThreshold: 1
        timeoutSeconds: 1
      resources: {}
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    wallarm-appstructure:
      resources: {}
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    wallarm-antibot:
      resources: {}
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    metrics:
      enabled: false

      service:
        annotations:
          prometheus.io/scrape: "true"
          prometheus.io/path: /wallarm-metrics
          prometheus.io/port: "18080"

        ## stats-exporterサービスが利用可能なIPアドレス一覧
        ## 参照: https://kubernetes.io/docs/user-guide/services/#external-ips
        ##
        externalIPs: []

        loadBalancerIP: ""
        loadBalancerSourceRanges: []
        servicePort: 18080
        type: ClusterIP
    addnode:
      resources: {}
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    cron:
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    collectd:
      resources: {}
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE
    apiFirewall:
      enabled: true
      config:
        ...
      extraEnvs:
        - name: EXTRA_ENV_VAR_NAME
        - value: EXTRA_ENV_VAR_VALUE

この設定を変更するには、Ingress Controllerのインストールの場合はhelm install、既存のIngress Controllerパラメータ更新の場合はhelm upgrade--setオプションを使用することを推奨します。たとえば:

helm install --set controller.wallarm.enabled=true <INGRESS_CONTROLLER_RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE>
helm upgrade --reuse-values --set controller.wallarm.enabled=true <INGRESS_CONTROLLER_RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE>

以下に設定可能な主なパラメータの説明を示します。他のパラメータはデフォルト値が設定され、ほとんど変更する必要はありません。

controller.wallarm.enabled

Wallarm機能の有効または無効を設定できます。

デフォルト値: false

controller.wallarm.apiHost

Wallarm APIエンドポイントです。次の場合があります:

デフォルト値: api.wallarm.com

controller.wallarm.token

フィルタリングノードのトークン値です。Wallarm APIにアクセスするために必要です。

トークンは、次のタイプのいずれかとなります:

  • API token (おすすめ) - UIの整理のために動的にノードグループを追加/削除する必要がある場合や、セキュリティ強化のためにトークンのライフサイクルを管理したい場合に最適です。API tokenの生成方法:

    1. Wallarm ConsoleのSettingsAPI tokensに移動します。US CloudまたはEU Cloudで利用可能です。
    2. DeployソースロールでAPI tokenを作成します。
    3. ノード展開時に、生成したトークンを使用し、controller.wallarm.nodeGroupパラメータでグループ名を指定します。同一グループに複数のノードを、異なるAPI tokenを使用して追加できます。
  • Node token - 既に使用するノードグループが判明している場合に適しています。

    Node tokenの生成方法:

    1. Wallarm ConsoleのNodesに移動します。US CloudまたはEU Cloudで利用可能です。
    2. ノードを作成し、ノードグループに名称を付けます。
    3. ノード展開時に、該当グループのトークンを、グループに含める各ノードに対して使用します。

パラメータは、controller.wallarm.existingSecret.enabled: trueの場合は無視されます。

デフォルト値: not specified

controller.wallarm.nodeGroup

Helm Chartバージョン4.6.8以降、これは新規展開されるノードを追加するフィルタリングノードグループの名称を指定します。この方法でのノードグルーピングは、DeployロールのAPI tokenを使用してCloudにノードを作成および接続する場合にのみ利用可能です(値はcontroller.wallarm.tokenパラメータに渡されます)。

デフォルト値: defaultIngressGroup

controller.wallarm.existingSecret

Helm Chartバージョン4.4.1以降、この設定ブロックを使用してKubernetes SecretからWallarmノードtokenの値を取得できます。別個のSecret管理が行われる環境(例: 外部Secretsオペレーターを使用している場合)で有用です。

Kubernetes Secretにノードtokenを格納し、Helm Chartに取り込む方法:

  1. Wallarmノードtokenを使用してKubernetes Secretを作成します:

    kubectl -n <KUBERNETES_NAMESPACE> create secret generic wallarm-api-token --from-literal=token=<WALLARM_NODE_TOKEN>
    
    • <KUBERNETES_NAMESPACE> はWallarm Ingress Controller用のHelmリリースを作成したKubernetes Namespaceです.
    • wallarm-api-token はKubernetes Secretの名称です.
    • <WALLARM_NODE_TOKEN> はWallarm Console UIからコピーしたWallarmノードtokenの値です.

    外部Secretオペレーターを使用している場合は、適切なドキュメントに従ってSecretを作成してください.

  2. values.yamlに以下の設定を行います:

    controller:
      wallarm:
        token: ""
        existingSecret:
          enabled: true
          secretKey: token
          secretName: wallarm-api-token
    

デフォルト値: existingSecret.enabled: false(Helm Chartはcontroller.wallarm.tokenからWallarmノードtokenを取得します)

controller.wallarm.tarantool.replicaCount

postanalyticsの稼働中のPod数を指定します。postanalyticsは、行動ベースの攻撃検出に使用されます.

デフォルト値: 1

controller.wallarm.tarantool.arena

postanalyticsサービスに割り当てるメモリ量を指定します。直近5~15分間のリクエストデータを格納できる十分な値を設定することを推奨します.

デフォルト値: 1.0

controller.wallarm.metrics.enabled

このスイッチは情報およびメトリクスの収集の切り替えを行います。KubernetesクラスターにPrometheusがインストールされている場合、追加の設定は不要です.

デフォルト値: false

controller.wallarm.apifirewall

node 5.1.0以降、API Specification Enforcementの設定を制御します。デフォルトでは有効であり、以下のように設定されています。この機能を利用する場合、これらの値は変更しないことを推奨します.

controller:
  wallarm:
    apiFirewall:
      ### API Firewall機能の有効化または無効化 (true|false)
      ###
      enabled: true
      readBufferSize: 8192
      writeBufferSize: 8192
      maxRequestBodySize: 4194304
      disableKeepalive: false
      maxConnectionsPerIp: 0
      maxRequestsPerConnection: 0
      config:
        mainPort: 18081
        healthPort: 18082
        specificationUpdatePeriod: 1m
        unknownParametersDetection: true
        #### TRACE|DEBUG|INFO|WARNING|ERROR
        logLevel: DEBUG
        ### TEXT|JSON
        logFormat: TEXT
      ...

node 5.1.0以降、以下の内容が提示されます(上記例のデフォルト値を参照):

Setting Description
readBufferSize 接続ごとのリクエスト読み取りバッファサイズです。ヘッダーの最大サイズもこれにより制限されます。クライアントが数KBのRequestURIや、数KBに及ぶヘッダー(例: 大容量のCookie)を送信する場合は、このバッファを増加させてください。
writeBufferSize 接続ごとのレスポンス書き込み用バッファサイズです。
maxRequestBodySize リクエストボディの最大サイズです。この制限を超えるリクエストはサーバーにより拒否されます。
disableKeepalive Keep-alive接続を無効化します。このオプションがtrueに設定されている場合、サーバーは最初のレスポンス送信後に全ての着信接続を閉じます。
maxConnectionsPerIp IPごとに許可される同時クライアント接続の最大数です。0は無制限を意味します。
maxRequestsPerConnection 接続ごとに処理されるリクエストの最大数です。最後のリクエスト送信後、サーバーは接続を閉じます。最後のレスポンスにはConnection: closeヘッダーが追加されます。0は無制限を意味します。

controller.wallarm.container_name.extraEnvs

本ソリューションで利用されるDockerコンテナに渡される追加の環境変数です。リリース4.10.6以降サポートされます.

以下の例は、Dockerコンテナにhttps_proxyおよびno_proxy変数を渡す方法を示しています。この設定により、外向きのHTTPSトラフィックは指定されたプロキシを経由し、ローカルトラフィックはそれをバイパスします。このような構成は、Wallarm APIなど外部通信がセキュリティ上の理由でプロキシを通過する必要がある環境で非常に重要です.

controller:
  wallarm:
    apiHost: api.wallarm.com
    enabled: "true"
    token:  <API_TOKEN>
    addnode:
      extraEnvs:
        - name: https_proxy
          value: https://1.1.1.1:3128
    cron:
      extraEnvs:
        - name: https_proxy
          value: https://1.1.1.1:3128
        - name: no_proxy
          value: "localhost"
    collectd:
      extraEnvs:
        - name: https_proxy
          value: https://1.1.1.1:3128
        - name: no_proxy
          value: "localhost"

グローバルController設定

これはConfigMapを通じて実装されます.

標準のパラメータに加え、以下の追加パラメータがサポートされています:

Ingressアノテーション

これらのアノテーションは、個々のIngressインスタンスのパラメータを設定するために使用されます.

標準のアノテーションに加え、以下の追加アノテーションがサポートされています:

Ingressリソースへのアノテーション適用

これらの設定をIngressに適用するには、以下のコマンドを使用してください:

kubectl annotate --overwrite ingress <YOUR_INGRESS_NAME> -n <YOUR_INGRESS_NAMESPACE> <ANNOTATION_NAME>=<VALUE>
  • <YOUR_INGRESS_NAME> はIngressの名称です.

  • <YOUR_INGRESS_NAMESPACE> はIngressのNamespaceです.

  • <ANNOTATION_NAME> は上記リストからのアノテーション名です.

  • <VALUE> は上記リストからのアノテーション値です.

アノテーション例

ブロッキングページとエラーコードの設定

アノテーションnginx.ingress.kubernetes.io/wallarm-block-pageは、以下の理由によりリクエストがブロックされた際にレスポンスで返すブロッキングページおよびエラーコードを設定するために使用されます:

例えば、ブロックされた任意のリクエストに対して、デフォルトのWallarmブロッキングページとエラーコード445を返すには:

kubectl annotate ingress <YOUR_INGRESS_NAME> -n <YOUR_INGRESS_NAMESPACE> nginx.ingress.kubernetes.io/wallarm-block-page="&/usr/share/nginx/html/wallarm_blocked.html response_code=445 type=attack,acl_ip,acl_source"

ブロッキングページとエラーコードの設定方法の詳細→

libdetectionモードの管理

libdetectionのデフォルトモード

libdetectionライブラリのデフォルトモードはon(有効)です.

以下のいずれかのオプションを使用して、libdetectionモードを制御できます:

  • Ingressリソースに以下のnginx.ingress.kubernetes.io/server-snippetアノテーションを適用する:

    kubectl annotate --overwrite ingress <YOUR_INGRESS_NAME> -n <YOUR_INGRESS_NAMESPACE> nginx.ingress.kubernetes.io/server-snippet="wallarm_enable_libdetection off;"
    

    wallarm_enable_libdetectionの利用可能な値はon/offです.

  • Helm Chartにパラメータcontroller.config.server-snippetを渡します:

    helm install --set controller.config.server-snippet='wallarm_enable_libdetection off;' <INGRESS_CONTROLLER_RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE>
    

    正しいIngress Controllerのインストールには、他のパラメータも必要です。これらも--setオプションに渡してください.

    helm upgrade --reuse-values --set controller.config.server-snippet='wallarm_enable_libdetection off;' <INGRESS_CONTROLLER_RELEASE_NAME> wallarm/wallarm-ingress -n <KUBERNETES_NAMESPACE>
    

    wallarm_enable_libdetectionの利用可能な値はon/offです.