コンテンツにスキップ

FrankenPHP (Laravel Octane)

このガイドでは、アプリケーションへの Zen Firewall by Aikido のインストールとセットアップの手順を説明します。以下の手順に従ってアプリケーションを保護してください。

問題や不具合が発生した場合は、遠慮なくサポートチャットまたは Github issues でご連絡ください。

https://github.com/AikidoSec/firewall-php

1. Zen Firewall by Aikido をインストールする

Section titled “1. Zen Firewall by Aikido をインストールする”

FrankenPHP 向けの Zen はシステムパッケージとしてインストールされます。

前提条件:

  • sudo 権限があることを確認してください。
  • サポートされている FrankenPHP バージョン(8.2+)を使用してください。

Red Hat系システム(RHEL、CentOS、Fedora)の場合:

Terminal window
rpm -Uvh --oldpackage https://github.com/AikidoSec/firewall-php/releases/latest/download/aikido-php-firewall.x86_64.rpm

Red Hat系 arm64 / aarch64 の場合:

Terminal window
rpm -Uvh --oldpackage https://github.com/AikidoSec/firewall-php/releases/latest/download/aikido-php-firewall.aarch64.rpm

Debian系システム(Debian、Ubuntu)の場合:

Terminal window
curl -L -O https://github.com/AikidoSec/firewall-php/releases/latest/download/aikido-php-firewall.x86_64.deb
dpkg -i -E ./aikido-php-firewall.x86_64.deb

Debian系 arm64 / aarch64 の場合:

Terminal window
curl -L -O https://github.com/AikidoSec/firewall-php/releases/latest/download/aikido-php-firewall.aarch64.deb
dpkg -i -E ./aikido-php-firewall.aarch64.deb

2. Zen Firewall をドライ / 検知専用モードで起動する

Section titled “2. Zen Firewall をドライ / 検知専用モードで起動する”

Laravel Sail 経由

Aikido インストールパッケージをダウンロードする

docker/version/Dockerfile にて:

ARG AIKIDO_VERSION=1.5.2
RUN curl -L -o /tmp/aikido-php-firewall.deb \
"https://github.com/AikidoSec/firewall-php/releases/download/v${AIKIDO_VERSION}/aikido-php-firewall.$(uname -m).deb"

Octane の Caddyfile で Aikido の環境変数を FrankenPHP に渡し、ワーカーを設定する

vendor/laravel/octane/src/Commands/stubs/Caddyfile にて:

+if (extension_loaded('aikido')) {
+ \aikido\set_user('123', 'John Doe');
+
+ $decision = \aikido\should_block_request();
+
+ if ($decision->block && $decision->type === 'blocked') {
+ http_response_code(403);
+ exit('You are blocked by Zen.');
+ }
+
+ if ($decision->block && $decision->type === 'ratelimited') {
+ http_response_code(429);
+ exit('You are rate limited by Zen.');
+ }
+}

Octane のワーカースクリプト内で \aikido\worker_rinit() と \aikido\worker_rshutdown() を呼び出す

リクエストハンドラーをこれらの呼び出しでラップし、Aikido が各リクエストを処理できるようにします。

vendor/laravel/octane/bin/frankenphp-worker.php にて:

! Dockerfile
FROM dunglas/frankenphp:php${PHP_VERSION}-bookworm
+ARG AIKIDO_VERSION=1.5.2
+RUN apt-get update && apt-get install -y curl \
+ && curl -L -o /tmp/aikido-php-firewall.deb \
+ "https://github.com/AikidoSec/firewall-php/releases/download/v${AIKIDO_VERSION}/aikido-php-firewall.$(uname -m).deb" \
+ && dpkg -i /tmp/aikido-php-firewall.deb \
+ && rm /tmp/aikido-php-firewall.deb \
+ && apt-get clean
COPY . /app
ENTRYPOINT ["php", "artisan", "octane:frankenphp"]

docker/version/start-container にて、スクリプトの末尾付近に以下のインストール手順を追加します。

Terminal window
ls -sf /var/www/html/frankenphp /usr/bin/frankenphp
dpkg -i -E ./aikido-php-firewall.$(uname -m).deb

これで Sail を起動できます。

Terminal window
./vendor/bin/sail up --build

Docker イメージ経由

Dockerfile に Aikido をインストールする

vendor/laravel/octane/src/Commands/stubs/Caddyfile
{$CADDY_SERVER_SERVER_NAME} {
route {
php_server {
+ env AIKIDO_TOKEN "AIK_RUNTIME_...."
+ env AIKIDO_BLOCK "True"
}
}
}

Octane の Caddyfile で Aikido の環境変数を FrankenPHP に渡し、ワーカーを設定する

vendor/laravel/octane/src/Commands/stubs/Caddyfile にて:

! vendor/laravel/octane/bin/frankenphp-worker.php
<?php
// ... Octane bootstrap ...
$handleRequest = static function () use ($worker, $frankenPhpClient, $debugMode) {
+ \aikido\worker_rinit();
// Octane request handling logic
+ \aikido\worker_rshutdown();
};
while ($requestCount < $maxRequests && frankenphp_handle_request($handleRequest)) {
$requestCount++;
}

Octane のワーカースクリプト内で \aikido\worker_rinit() と \aikido\worker_rshutdown() を呼び出す

リクエストハンドラーをこれらの呼び出しでラップし、Aikido が各リクエストを処理できるようにします。

vendor/laravel/octane/bin/frankenphp-worker.php にて:

! vendor/laravel/octane/bin/frankenphp-worker.php
<?php
// ... Octane bootstrap ...
$handleRequest = static function () use ($worker, $frankenPhpClient, $debugMode) {
+ \aikido\worker_rinit();
// Octane request handling logic
+ \aikido\worker_rshutdown();
};
while ($requestCount < $maxRequests && frankenphp_handle_request($handleRequest)) {
$requestCount++;
}

コンテナを起動する

docker run -e AIKIDO_TOKEN="AIK_RUNTIME_..." your-app

期待通りに動作し、リクエストをブロックしないことを確認するため、アプリをドライモードで起動することを推奨します。誤検知を避けるため、ステージング環境で2週間、Zen Firewall を運用することを推奨します。

env AIKIDO_BLOCK "False"

例:

AIKIDO_TOKEN=AIK_RUNTIME_...
AIKIDO_BLOCK=false

変更後は FrankenPHP のプロセスマネージャー / Web サーバーを再起動してください。

3. レート制限とユーザーブロックを有効化する

Section titled “3. レート制限とユーザーブロックを有効化する”

リクエストパイプライン内で set_usershould_block_request を使用します。

! vendor/laravel/octane/src/Commands/stubs/Caddyfile
{$CADDY_SERVER_SERVER_NAME} {
route {
php_server {
+ env AIKIDO_TOKEN "AIK_RUNTIME_...."
+ env AIKIDO_BLOCK "True"
}
}
}

アプリケーションにアクセスし、いくつかの操作を行うか、いくつかのページを開いてください。Zen はアプリケーション内のルートを自動的に検出します。

Zen アプリケーションの以下のページを確認することで、エージェントが正常に動作していることを確認できます。

  • Events: 「Application started」イベントが表示されるはずです。
  • Routes: しばらくすると、アプリケーションのルートがメソッド、ルート、リクエスト数とともにここに表示され始めます。
  • Instances: Zen がインストールされているアプリケーションのアクティブなインスタンス数が表示されるはずです。

5. ダッシュボードでレート制限を設定する

Section titled “5. ダッシュボードでレート制限を設定する”

Zen Firewall ミドルウェアを追加したら、Aikido Dashboard でレート制限を設定することで、ブルートフォース攻撃からルートを保護するテストができます。

  1. 作成したアプリをクリックします。
  2. Routes タブに移動します。
  3. 制限したいルートを見つけて Setup rate limiting をクリックします。
  4. 手順に従ってレート制限を設定します(例: 1分あたり5リクエスト)。

保護とレート制限のオプションを備えた認証ルートを表示するAPIルート管理インターフェース。

POST /auth/login のレート制限を1分あたり5リクエストに設定する。

レート制限の確認

アプリを起動し、レート制限を設定したルートに1分以内に5回アクセスしてみてください。5回目の試行後、レート制限エラーが返されるはずです。

You are rate limited by Aikido firewall. (Your IP: 1.2.3.4)

おめでとうございます。Zen Firewall のインストールに成功しました。問題が発生した場合、ご不明点やご要望がある場合は、遠慮なくサポートまでご連絡ください。

Zen Firewall が提供する多くの機能を、これから探索していきましょう。

追加情報: