Apache APISIX 与 open-appsec WAF 集成

Christopher Lutat

Christopher Lutat

October 21, 2024

Ecosystem

はじめに

open-appsec WAFは、オープンソースのAPIゲートウェイであるApache APISIXとの新たな統合を発表できることを嬉しく思います。

このopen-appsecとAPI7チームの新たなコラボレーションにより、ユーザーはApache APISIXによって公開されているWeb APIやその他のWebサービスを、open-appsecの先進的な機械学習ベースの技術に基づいて、未知および既知の攻撃タイプから効果的に保護できるようになります。さらに、いくつかの強化されたセキュリティ機能も追加されます。

Apache APISIXについて

Apache APISIXは、モダンで柔軟性が高く、高性能なオープンソースのAPIゲートウェイソリューションです。マイクロサービスやクラウドネイティブアーキテクチャにおけるさまざまなユースケースを処理するために設計されています。その主な目的は、クライアントとバックエンドサービス間のAPIトラフィックを管理、保護、最適化するゲートウェイとして機能することで、API管理を容易にすることです。

APISIXのAPIゲートウェイとしてのさらなるユースケースには、ロードバランシング、レートリミット、認証、認可などがあります。トラフィック制御、動的なアップストリーム、プラグインの拡張性など、包括的な機能を提供し、開発者が特定のニーズに応じて機能をカスタマイズおよび拡張できるようにします。

open-appsec WAFについて

open-appsec WAFは、自動的で先制的な脅威防止を提供し、NGINXなどのリバースプロキシやAPISIXなどのAPIゲートウェイと統合します。機械学習ベースであるため、シグネチャ(または更新)を一切必要としません。これにより、真のゼロデイ攻撃に対しても自動的で最先端の脅威防止を提供し、管理者の負担と誤検知の量を大幅に削減します。

さらに、open-appsecは、AntiBot、レートリミット、スキーマ強制、Snortシグネチャサポート、カスタムルール/例外など、多くの追加セキュリティレイヤーを提供します。open-appsecは、SaaSサービスとして提供されるWeb UIを使用して中央管理することも、宣言型の設定ファイルを使用してローカルで管理することもできます。

Apache APISIXとopen-appsecの統合

この新たな統合により、APISIXユーザーは、Web APIやWebアプリケーションを保護するための統合された最先端の機械学習ベースのWAFソリューションであるopen-appsec WAFにアクセスできるようになります。

これにより、例えばopen-appsecの無料でオープンソースの「Community Edition」を使用して、APISIX APIゲートウェイによって公開されているすべてのものに対して、既知および未知の攻撃から効果的なAIベースの保護を提供し、同時に誤検知の量を大幅に削減し、管理者を例外の作成や従来のシグネチャベースのポリシーの更新などの面倒なタスクから解放します。

この統合は、Linux、Docker、Kubernetesなど、すべての一般的なプラットフォームで利用可能です。

Linux

Linuxの「組み込み」デプロイメントの場合、open-appsecインストーラーは既存のAPISIXインストールに「open-appsecアタッチメント」モジュールを追加し、それと共に「open-appsecエージェント」をインストールします。このエージェントは、アタッチメントからトラフィックを受信し、検査し、ブロックまたは許可する結論をAPISIXまたはそれに統合されたopen-appsecアタッチメントに返します。

以下は、Linuxデプロイメントの簡単なアーキテクチャ図です。

Linuxデプロイメントのアーキテクチャ

Docker

Dockerベースのデプロイメントの場合、open-appsec WAFと統合されたAPISIXの特別なコンテナイメージが利用可能です。このイメージには既にopen-appsecアタッチメントが追加されており、APISIXゲートウェイコンテナとセキュリティ検査を行い、結論をAPISIXゲートウェイに返してトラフィックを許可またはブロックするopen-appsecエージェントの両方をデプロイするための拡張されたdocker-composeファイルも提供されます。

以下は、Dockerベースのデプロイメントの簡単なアーキテクチャ図です。

Dockerベースのデプロイメントのアーキテクチャ

Kubernetes

Kubernetesベースのデプロイメントの場合、公式のAPISIX Helmチャートを基にしたHelmチャートが利用可能です。このチャートは、APISIXゲートウェイコンテナにopen-appsecアタッチメントを含めるように拡張されており、open-appsecエージェントもデプロイします。さらに、open-appsecをK8sのカスタムリソースを使用して宣言型の「DevOpsスタイル」で設定するオプションも提供されます。これは、open-appsecの中央管理Web UIを使用する代わりに使用できます。

以下は、Kubernetesデプロイメントの簡単なアーキテクチャ図です。

Kubernetesデプロイメントのアーキテクチャ

Linux上のAPISIXにopen-appsec WAFを追加する

APISIXがインストールされているLinuxシステムにopen-appsecをインストールするには、以下の手順に従ってください。

1. 前提条件

  • LinuxプラットフォームはUbuntu 22.04である必要があります。
  • APISIXがインストールされていることを確認してください。

サポートされているAPISIXバージョンのリストはこちらで確認できます: https://downloads.openappsec.io/packages/supported-apisix.txt

APISIXがまだインストールされていない場合は、以下のコマンドを使用して「従来のモード」でAPISIXをインストールできます。これらのコマンドを実行すると、まずAPISIX用のetcdデータベースをインストールし、必要なリポジトリを追加してからAPISIXをインストールして起動します。

etcdデータベースのインストール

ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && cd etcd-v${ETCD_VERSION}-linux-amd64
cp -a etcd etcdctl /usr/bin/
nohup etcd >/tmp/etcd.log 2>&1 &
etcd

パッケージリポジトリの追加と更新

apt install gnupg
echo "deb http://openresty.org/package/debian bullseye openresty" | tee /etc/apt/sources.list.d/openresty.list
wget -O - https://openresty.org/package/pubkey.gpg | apt-key add -
wget -O - http://repos.apiseven.com/pubkey.gpg | apt-key add -
echo "deb http://repos.apiseven.com/packages/debian bullseye main" | tee /etc/apt/sources.list.d/apisix.list
apt update

APISIXのインストール、初期化、起動

apt install apisix=3.9.1-0
apisix init
apisix start

2. open-appsecインストーラーのダウンロード

wget https://downloads.openappsec.io/open-appsec-install && chmod +x open-appsec-install

3. open-appsecのインストール

既存のAPISIXインストールと統合するためにopen-appsecをインストールします。

--preventフラグを使用すると、open-appsecがデフォルトのポリシーで予防モードに設定されてインストールされます。

./open-appsec-install --auto --prevent

4. APISIX管理キーの取得と保存

APISIXのconfig.yaml設定ファイルからAPISIX管理キーを取得し、APISIX_KEY環境変数に保存します。

export APISIX_KEY=$(awk '/key:/{ if ($2 ~ /^edd1/) print $2 }' /usr/local/apisix/conf/config.yaml )

5. サービスを公開するためのルートの設定

APISIXゲートウェイで外部のWebサービスまたはWeb APIを公開するための例としてルートを設定します。この例では、httpbin.orgをバックエンドとして使用します。

curl http://127.0.0.1:9180/apisix/admin/routes/100 -H "X-API-KEY:$APISIX_KEY" -X PUT -d '{
    "methods": [
      "GET"
    ],
    "uri": "/anything",
    "upstream": {
      "type": "roundrobin",
      "nodes": {
        "httpbin.org:80": 1
      }
    }
  }'

6. 検証

このルートが機能するかどうかを確認するためにアクセスします。

curl -s -v -G --data-urlencode email=user@domain.abc http://localhost:9080/anything

7. SQLインジェクション攻撃のシミュレーション

次に、APISIXゲートウェイによって公開されているhttpbin.orgサービスに対してSQLインジェクション攻撃をシミュレートしてみます(以下のHTTPリクエストの'OR '1'='1を参照)。このゲートウェイは現在、open-appsec WAFによって保護されています。

curl -s -v -G --data-urlencode email=user@domain.abc' OR '1'='1 http://localhost:9080/anything

このシミュレートされた攻撃は、open-appsecのコンテキストベースの機械学習WAFエンジンによって成功裏にブロックされます。

8. ログファイルの確認

送信したシミュレートされた攻撃を含むHTTPリクエストの「prevent」を示す対応するログファイルを確認します。

tail -f /var/log/nano_agent/cp-nano-http-transaction-handler.log*| grep -i user@domain.abc

または、open-appsec-ctlツールを使用することもできます:

open-appsec-ctl --view-logs | grep -i user@domain.abc

9. open-appsecに接続して中央管理を行う(オプション)

オプションで、デプロイメントをhttps://my.openappsec.ioに接続して、open-appsecを簡単に使用できるWeb UIで中央管理し、セキュリティイベントを監視することができます。詳細については、以下のopen-appsec WAFデプロイメントを中央管理する方法セクションを参照してください。

おめでとうございます! 既存のAPISIXインストールにopen-appsec WAFを追加し、APISIXゲートウェイによって公開されているWebサービスがWeb攻撃から保護されていることを確認しました。

コンテナ化プラットフォーム(Docker)でのAPISIXとopen-appsec WAFのデプロイ

Docker上でopen-appsecと統合されたAPISIXをインストールするには、以下の手順に従ってください。

上記の例とは異なり、ここではAPISIXを「スタンドアロンモード」でデプロイします。これは、設定を保持するyamlファイルを使用して宣言的に設定されるため、etcdデータベースのデプロイを必要としません。

APISIXは、すべてのデプロイメントタイプ(Linux、Dockerなど)で従来のモードとスタンドアロンモードの両方をサポートしています。

1. 前提条件

Dockerとdocker-composeツールがインストールされているLinuxプラットフォームを用意してください。

2. open-appsec用のフォルダを作成

デプロイメントに使用するディレクトリ内に、open-appsecの宣言型設定ファイルを保持するappsec-localconfigフォルダを作成します:

mkdir ./appsec-localconfig

3. open-appsecファイルをフォルダにダウンロード

そのフォルダにopen-appsecの初期宣言型設定ファイルをダウンロードします。

wget https://raw.githubusercontent.com/openappsec/openappsec/main/config/linux/latest/prevent/local_policy.yaml -O appsec-localconfig/local_policy.yaml

この例の宣言型設定ファイルは、既に攻撃を予防するように設定されています。

4. APISIX用のフォルダを作成

APISIXの宣言型設定ファイルを保持する別のフォルダapisix-localconfigを作成します: mkdir ./apisix-localconfig.

5. APISIXファイルをフォルダにダウンロード

デプロイメント後にopen-appsecの保護を検証するために、APISIXの簡単な宣言型設定ファイルもダウンロードします。

wget https://raw.githubusercontent.com/openappsec/openappsec/main/deployment/apisix/apisix-example-config/apisix-standalone.yaml -O ./apisix-localconfig/apisix-standalone.yaml

6. docker-compose.yamlファイルを作成

以下の内容のdocker-compose.yamlファイルを作成します。このファイルは以下のようにダウンロードできます:

wget https://raw.githubusercontent.com/openappsec/openappsec/main/deployment/apisix/docker-compose.yaml
version: "3"

services:
  apisix:
    container_name: apisix
    image: "ghcr.io/openappsec/apisix-attachment:latest"
    ipc: service:appsec-agent
    restart: always
    volumes:
      - ./apisix-localconfig/apisix-standalone.yaml:/usr/local/apisix/conf/apisix.yaml:ro
    environment:
      - APISIX_STAND_ALONE=true
    ports:
      - "9180:9180/tcp"
      - "9080:9080/tcp"
      - "9091:9091/tcp"
      - "9443:9443/tcp"

  appsec-agent:
    container_name: appsec-agent
    image: 'ghcr.io/openappsec/agent:latest'
    ipc: shareable
    restart: unless-stopped
    environment:
      # 以下を自分のメールアドレスに調整してください
      - user_email=user@email.com
      - registered_server="APISIX Server"
    volumes:
      - ./appsec-config:/etc/cp/conf
      - ./appsec-data:/etc/cp/data
      - ./appsec-logs:/var/log/nano_agent
      - ./appsec-localconfig:/ext/appsec
    command: /cp-nano-agent

7. メールアドレスを更新(オプション)

docker-compose.yamlファイルを編集し、"user@email.com"を自分のメールアドレスに置き換えてください。これにより、将来の特定のデプロイメントに関する問題のサポートや、open-appsecに関する情報を積極的に提供することができます。

これはオプションのパラメータであり、削除することもできます。自動メールを送信する場合、将来の同様の通信を受信しないためのオプトアウトオプションも含まれます。

8. すべてのコンテナを起動

docker-compose upを実行して、関連するすべてのコンテナのデプロイメントを開始します:

docker-compose up -d

9. コンテナのステータスを確認

apisix-attachmentappsec-agentコンテナが起動して実行されているかどうかを確認します。

docker ps

10. スタンドアロン設定を検証

スタンドアロン設定が機能するかどうかを確認するためにアクセスします。

curl -s -v -G --data-urlencode email=user@domain.abc http://localhost:9080/anything

11. SQLインジェクション攻撃のシミュレーション

次に、open-appsecによって保護されているAPISIXゲートウェイコンテナによって公開されているhttpbin.orgサービスに対してSQLインジェクション攻撃をシミュレートしてみます。

curl -s -v -G --data-urlencode email=user@domain.abc' OR '1'='1 http://localhost:9080/anything

12. open-appsecに接続して中央管理を行う(オプション)

オプションで、デプロイメントをhttps://my.openappsec.ioに接続して、open-appsecを簡単に使用できるWeb UIで中央管理し、セキュリティイベントを監視することができます。詳細については、以下のopen-appsec WAFデプロイメントを中央管理する方法セクションを参照してください。

Helmを使用してKubernetes上でAPISIXとopen-appsec WAFをデプロイ

1. 前提条件

KubernetesプラットフォームとHelmツールが利用可能であることを確認してください。

2. open-appsecをダウンロード

APISIX Helmチャート用のopen-appsecをこちらからダウンロードします。

wget https://downloads.openappsec.io/packages/helm-charts/apisix/open-appsec-k8s-apisix-latest.tgz

3. Helmチャートをインストール

この例のhelm installコマンドは、公式のAPISIX Helmチャートを基にしたopen-appsec for APISIX Helmチャートをインストールします。

これにより、APISIXゲートウェイがAPISIX Ingress Controllerとしてデプロイされ、それに統合されたopen-appsec WAFもデプロイされます。また、open-appsec WAFの追加設定オプションも提供されます(Helmチャート内のvalues.yamlとopen-appsecのドキュメントを参照)。

デプロイメント後、K8sのIngressリソースをAPISIXゲートウェイに割り当てるために、以下のIngressクラスを使用するように設定できます: appsec-apisix.

helm install open-appsec-k8s-apisix-latest.tgz \
--name-template=appsec-apisix \
--set rbac.create=true \
--set appsec.mode=standalone \
--set service.type=LoadBalancer \
--set appsec.persistence.enabled=false \
--set ingress-controller.enabled=true \
--set ingress-controller.config.ingressClass=appsec-apisix \
--set appsec.userEmail=<your-email-address>\
--set appsec.agentToken= \
--create-namespace \
-n appsec-apisix

上記のHelmインストールコマンドのを自分のメールアドレスに置き換えてください。これにより、open-appsecに関するニュースやアップデートを送信し、必要に応じてデプロイメントをサポートすることができます!いつでも購読を解除できます。または、メールを提供したくない場合は、その行を削除してください。

4. 検証

ポッドが正しくデプロイされ、準備状態にあることを確認します:

kubectl get pods -n appsec-apisix

5. open-appsecポリシーリソースを作成

以下のコマンドを実行して、K8sに「open-appsec-best-practice-policy」を作成します。

この例のポリシーは、既に攻撃を予防するように事前設定されています。

kubectl apply -f https://raw.githubusercontent.com/openappsec/openappsec/main/config/k8s/v1beta1/open-appsec-k8s-prevent-config-v1beta1.yaml

独自のカスタムポリシーを作成することもできます。詳細はこちらで確認できます。

6. ターゲットリソース名を取得

保護したいIngressリソースの名前を確認します:

kubectl get ing -A

7. Ingressリソースを編集

kubectl edit ing/<ingress name> -n <ingress namespace>

8. ingressClassnameを変更

ingressClassnameをopen-appsecを使用するように変更します:

spec: ingressClassName: appsec-apisix

9. Ingressリソースにアノテーションを追加

このアノテーションをIngressリソースに追加して、open-appsecをこのIngressに対してアクティブにし、指定したopen-appsecポリシーカスタムリソースを使用します。

openappsec.io/policy: open-appsec-best-practice-policy

10. スタンドアロン設定を検証

スタンドアロン設定が機能するかどうかを確認するためにアクセスします:

curl -s -v -G --data-urlencode email=user@domain.abc http://[YOUR-INGRESS-HOSTNAME]

11. SQLインジェクション攻撃のシミュレーション

次に、open-appsecによって保護されているAPISIXゲートウェイコンテナによって公開されているhttpbin.orgサービスに対してSQLインジェクション攻撃をシミュレートしてみます。

curl -s -v -G --data-urlencode email=user@domain.abc' OR '1'='1 http://[YOUR-INGRESS-HOSTNAME]

上記のコマンドの[YOUR-INGRESS-HOSTNAME]を、先の手順でopen-appsec WAFで保護したIngressリソースに設定したホスト名に置き換えてください。また、必要に応じて「http」を「https」に変更してください。

おめでとうございます! APISIXとopen-appsec WAFを統合してデプロイし、APISIXゲートウェイによって公開されているWebサービスが攻撃から保護されていることを確認しました。

open-appsec WAFデプロイメントを中央管理する方法

必要に応じて、open-appsec WAFデプロイメント(APISIXと統合されたもの)を中央管理するために、https://my.openappsec.ioで利用可能なopen-appsec Web UI(SaaSサービス)を使用できます。これにより、open-appsecエージェントを中央Web UIのデプロイメントプロファイルに接続することができます。

また、ローカルでデプロイメントを管理しつつ、中央Web UIプロファイルに「宣言型モード」で接続することもできます。これにより、ローカルの設定をWeb UIで(読み取り専用で)確認することができます。

open-appsecの設定に加えて、Web UIでは、デプロイされたopen-appsecエージェントのステータス、セキュリティログ、ダッシュボードなどを確認することができます。

デプロイメントを中央Web UIに接続する方法については、https://docs.openappsec.ioで利用可能なopen-appsecドキュメントを参照してください。

以下に、Web UIのスクリーンショットをいくつか示します。

Open-websec UI 1

Open-websec UI 2

まとめ

このブログでは、open-appsecがApache APISIXと統合する方法について、通常のLinuxベースのデプロイメント、コンテナ化されたデプロイメント(Docker)、およびKubernetes環境のすべてについて説明しました。

APISIXとopen-appsec WAFのデプロイメント手順に従って、SQLインジェクション攻撃をシミュレートし、open-appsecの機械学習ベースのWAF技術によって効果的に防止されることを確認しました。

さらに、open-appsecの中央Web UIに接続して管理、監視、ログ分析、レポート作成を行う利点についても説明しました。

これらの新たな統合が、APISIX APIゲートウェイとその公開されているWeb APIおよびWebアプリケーションのセキュリティを強化するために非常に役立つことを願っています。

フィードバックや質問、または技術的な課題がある場合は、ぜひお問い合わせください。open-appsecチームには、https://www.openappsec.ioのチャットまたはメールで連絡できます: info@openappsec.io

追加リソース

open-appsec WAF

ウェブサイト: https://www.openappsec.io

GitHub: https://github.com/openappsec

ドキュメント: https://docs.openappsec.io

プレイグラウンド: https://www.openappsec.io/playground

ブログ: https://www.openappsec.io/blogs

Apache APISIX

ウェブサイト: https://apisix.apache.org

GitHub: https://github.com/apache/apisix

ドキュメント: https://apisix.apache.org/docs/

ブログ: https://apisix.apache.org/blog/

Tags: