コンテンツにスキップ

WallarmのeBPFベースソリューション(ベータ版)

Wallarmは、Linuxカーネルの機能を活用し、Kubernetes環境とシームレスに統合するeBPFベースのセキュリティソリューションのベータ版を提供しています。本記事では、Helmチャートを使用して本ソリューションを利用・デプロイする方法を説明します。

バージョン4.10に限定

WallarmのeBPFベースソリューションは現在、Wallarm Node 4.10で利用可能な機能のみをサポートします。

トラフィックフロー

WallarmのeBPFベースソリューションにおけるトラフィックフロー:

eBPFのトラフィックフロー

本eBPFソリューションは、次のプロトコルでのトラフィック監視に対応しています。

  • HTTP/1.xまたはHTTP/2

  • Proxy v1またはProxy v2

トラフィックはTLS/SSL暗号化またはプレーンテキストでのデータ転送を利用できます。SSLトラフィックの解析は、共有OpenSSLライブラリ(例:NGINX、HAProxy)を使用するサーバーに限定され、Envoyのような別のSSL実装を採用するサーバーでは利用できません。

動作概要

Linuxオペレーティングシステムはカーネルとユーザースペースで構成され、カーネルはハードウェアリソースと重要なタスクを管理し、アプリケーションはユーザースペースで動作します。この環境において、eBPF(Extended Berkeley Packet Filter)は、セキュリティに特化したものを含むカスタムプログラムをLinuxカーネル内で実行できるようにします。eBPFの詳細はこちら

Kubernetesはプロセス分離、リソース管理、ネットワーキングなどの重要なタスクにLinuxカーネルの機能を活用するため、eBPFベースのセキュリティソリューションを統合するのに適した環境を提供します。これに沿って、Wallarmはカーネルの機能を活用し、Kubernetesとシームレスに統合するeBPFベースのセキュリティソリューションを提供します。

本ソリューションは、トラフィックのミラーを生成してWallarmノードに転送するエージェントで構成されます。デプロイ時に、ミラーの対象範囲をNamespaceまたはPodレベルで指定できます。Wallarmノードはミラーされたトラフィックをセキュリティ脅威の観点から検査しますが、不正なアクティビティをブロックはしません。代わりに、検知したアクティビティをWallarm Cloudに記録し、Wallarm Console UIを通じてトラフィックのセキュリティ可視化を提供します。

次の図は本ソリューションのコンポーネントを示します。

eBPFのコンポーネント

eBPFエージェントは、すべてのKubernetesワーカーノードにDaemonSetとしてデプロイされます。適切に機能させるため、エージェントコンテナは特権モードで実行し、必須のケーパビリティとしてSYS_PTRACESYS_ADMINを付与する必要があります。

さらに本ソリューションはレスポンスコードも処理し、Wallarmの中核モジュールであるAPI DiscoveryがAPIエンドポイントを特定し、APIインベントリを構築して最新状態に保てるようにします。

ユースケース

サポートされているWallarmのデプロイオプションの中で、本ソリューションはアウトオブバンド運用に推奨されます。インラインで動作するのではなくトラフィックのミラーコピーを取得することで、eBPFベースのソリューションはトラフィックの流れを中断させません。この方式により、本番トラフィックへの影響を最小化し、レイテンシに影響する余分な遅延の発生を回避します。

技術要件

eBPFソリューションを正常にデプロイするために、以下の技術的前提条件を満たしていることを確認してください。

  • サポート対象のKubernetesバージョン:

    • AWS - Kubernetes 1.24以上
    • Azure - Kubernetes 1.26以上
    • GCP - 任意のKubernetesバージョン
    • ベアメタルサーバー - Kubernetes 1.22以上
  • エージェントがキャプチャしたトラフィックを安全にWallarmの処理ノードへミラーリングできるよう、cert-managerがインストールされていること。

  • Helm v3パッケージマネージャー。

  • BTF(BPF Type Format)が有効なLinuxカーネル5.10または5.15。対象OSはUbuntu、Debian、RedHat、Google COS、Amazon Linux 2です。

  • x86_64アーキテクチャのプロセッサ。

  • 本ソリューションはベータ版のため、すべてのKubernetesリソースを効果的にミラーできるわけではありません。そのため、Kubernetes内のNGINX Ingressコントローラ、Kong Ingressコントローラ、または通常のNGINXサーバーに対してトラフィックミラーリングを有効化することを推奨します。

  • ご利用のユーザーアカウントはWallarm ConsoleへのAdministratorアクセスを持っている必要があります。

上記要件とユースケースが異なる場合は、環境に関する詳細な技術情報を添えてセールスエンジニアまでご連絡ください。お客様の要件に合わせた調整の可能性を検討します。

ネットワークアクセス

送信トラフィックが制限された環境でも本ソリューションが正しく機能するよう、以下の外部リソースへのアクセスを許可するようにネットワークを設定してください。

  • https://charts.wallarm.comでWallarmのHelmチャートを追加します。

  • Docker HubからWallarmのDockerイメージを取得するためにhttps://hub.docker.com/r/wallarm

  • USのWallarm Cloudをご利用の場合はhttps://us1.api.wallarm.com。EUのWallarm Cloudをご利用の場合はhttps://api.wallarm.com

  • 攻撃検知ルールやAPI仕様の更新をダウンロードし、許可リスト、拒否リスト、またはグレーリストに登録した国、地域、またはデータセンターの正確なIPを取得するために、以下のIPアドレス。

    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
    

デプロイ

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

  1. Wallarmノードを作成します。

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

  3. トラフィックミラーリングを有効化します。

  4. Wallarm eBPFの動作をテストします。

ステップ1:Wallarmノードを作成する

  1. 以下のリンクからWallarm Console → Nodesを開きます。

  2. Wallarm nodeタイプのフィルタリングノードを作成し、生成されたトークンをコピーします。

    !Wallarmノードの作成

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

  1. 上記の要件を満たしており、cert-managerがインストールされていることを確認します。

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

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

  3. Wallarm eBPFソリューションの構成に沿ってvalues.yamlファイルを作成します。

    最小構成の例:

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

    <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.

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

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

ステップ3:トラフィックミラーリングを有効化する

NGINX Ingressコントローラ、Kong Ingressコントローラ、または通常のNGINXサーバーでWallarmのeBPFベースソリューションを効果的に活用するため、トラフィックミラーリングを有効化することを推奨します。

デフォルトでは、デプロイ済みのソリューションはトラフィックを解析しません。トラフィック解析を有効にするには、以下のいずれかのレベルでトラフィックミラーリングを有効化する必要があります。

  • Namespace単位

  • Pod単位

  • ノード名またはコンテナ単位

トラフィックミラーリングの有効化方法は2つあります。NamespaceラベルやPodアノテーションとして動的フィルタを使用する方法、またはvalues.yamlファイルのconfig.agent.mirror.filtersブロックで制御する方法です。これらを併用することもできます。詳細

ラベルを用いたNamespace単位

Namespaceに対してミラーリングを有効化するには、Namespaceラベルwallarm-mirrorenabledに設定します:

kubectl label ns <NAMESPACE> wallarm-mirror=enabled

アノテーションを用いたPod単位

Podに対してミラーリングを有効化するには、アノテーションmirror.wallarm.com/enabledtrueに設定します:

kubectl patch deployment <DEPLOYMENT_NAME> -n <NAMESPACE> -p '{"spec": {"template":{"metadata":{"annotations":{"mirror.wallarm.com/enabled":"true"}}}} }'

values.yamlを用いたNamespace、Pod、コンテナ、またはノード単位

よりきめ細かな制御が必要な場合は、Wallarm eBPFのvalues.yamlファイル内にあるconfig.agent.mirror.filtersブロックでミラーリングのレベルを指定できます。フィルタの設定方法や、WallarmのNamespaceラベルおよびPodアノテーションとの相互作用については記事をご参照ください。

ステップ4:Wallarm eBPFの動作をテストする

Wallarm eBPFが正しく動作していることを確認するには:

  1. WallarmのPod詳細を取得し、正常に起動していることを確認します:

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

    各Podは、例えば次のようにREADY: N/NかつSTATUS: Runningと表示されます:

    NAME                                                   READY   STATUS    RESTARTS   AGE
    wallarm-ebpf-wallarm-oob-agent-599xg                   1/1     Running   0          7m16s
    wallarm-ebpf-wallarm-oob-aggregation-f68959465-vchxb   4/4     Running   0          30m
    wallarm-ebpf-wallarm-oob-processing-694fcf9b47-rknx9   4/4     Running   0          30m
    
  2. アプリケーションに対してテスト用のパストラバーサル攻撃を送信します。<LOAD_BALANCER_IP_OR_HOSTNAME>を、対象にトラフィックを転送するロードバランサの実IPアドレスまたはDNS名に置き換えて実行してください:

    curl https://<LOAD_BALANCER_IP_OR_HOSTNAME>/etc/passwd
    

    Wallarm eBPFソリューションはアウトオブバンド方式で動作するため、攻撃をブロックせず、検知のみを行います。

    攻撃が記録されたことを確認するには、Wallarm Console → Eventsに進みます:

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

制限事項

  • アウトオブバンド(OOB)で動作し、実際のフローとは独立してトラフィックを解析する方式のため、本ソリューションにはいくつかの内在的な制約があります。

  • サーバーのレスポンスボディはミラーされないため:

  • ベータ版であるため、すべてのKubernetesリソースを効果的にミラーできるわけではありません。そのため、Kubernetes内のNGINX Ingressコントローラ、Kong Ingressコントローラ、または通常のNGINXサーバーに対してトラフィックミラーリングを有効化することを推奨します。