# FrankenPHP (Laravel Octane)


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

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

[https://github.com/AikidoSec/firewall-php](https://github.com/AikidoSec/firewall-php)

## 要件

* FrankenPHP 8.2以上（FrankenPHP 8.5まで動作確認済み）。
* フレームワークなし / カスタムミドルウェア。
* [Aikidoアカウント](https://help.aikidogov.us/docs/docs-ja/getting-started/setting-up-your-account) & [Zen Firewallトークン](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-installation-instructions/creating-an-aikido-zen-firewall-token)

## インストールと設定

{% stepper %}
{% step %}
**Zen Firewall by Aikidoをインストールする**


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

前提条件:

* `sudo` 権限があることを確認してください。
* サポートされている FrankenPHP のバージョン（8.2 以降）を使用してください。

Red Hat 系システム（RHEL、CentOS、Fedora）の場合:

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

Red Hat 系 arm64 / aarch64 の場合:

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

Debian 系システム（Debian、Ubuntu）の場合:

```bash
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 の場合:

```bash
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
```
{% endstep %}

{% step %}
**Zen Firewallをドライ / 検出専用モードで起動する**

**Laravel Sailを使用する場合**

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

`docker/version/Dockerfile` 内：

```docker
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` 内：

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

**Octaneワーカースクリプトで \aikido\worker\_rinit() と \aikido\worker\_rshutdown() を呼び出す**

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

`vendor/laravel/octane/bin/frankenphp-worker.php` 内：

```code-highlight language="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/version/start-container` のスクリプト末尾付近に、以下のインストール手順を追加します：

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

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

```bash
./vendor/bin/sail up --build
```

**Dockerイメージを使用する場合**

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

```code-highlight
! 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"]
```

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

`vendor/laravel/octane/src/Commands/stubs/Caddyfile` 内：

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

**Octaneワーカースクリプトで \aikido\worker\_rinit() と \aikido\worker\_rshutdown() を呼び出す**

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

`vendor/laravel/octane/bin/frankenphp-worker.php` 内：

```code-highlight language="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"
```

{% hint style="info" %}
環境変数 `AIKIDO_DEBUG=true` を定義するとデバッグモードが有効になり、エージェントの動作に関するより詳細な情報を確認できます。環境変数の詳細については、[configuration-via-environment-variables.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-installation-instructions/configuration-via-environment-variables "mention") を参照してください。
{% endhint %}

例：

```env
AIKIDO_TOKEN=AIK_RUNTIME_...
AIKIDO_BLOCK=false
```

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

{% step %}
**レート制限とユーザーブロックを有効にする**

リクエストパイプラインで `set_user` と `should_block_request` を使用します：

```code-highlight language="php"
+if (extension_loaded('aikido')) {
+   \aikido\set_user('123', 'John Doe');
+
+   $decision = \aikido\should_block_request();
+
+   if ($decision->block) {
+       if ($decision->type === 'ratelimited') {
+           http_response_code(429);
+           header('Retry-After: ' . $decision->retry_after);
+           exit('You are rate limited by Zen.');
+       }
+       http_response_code(403);
+       exit('You are blocked by Zen.');
+   }
+}
```
{% endstep %}

{% step %}
**アプリをテストする**


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

{% hint style="info" %}
Zen は 10 分ごとに Aikido へデータを送信します
{% endhint %}

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

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

<figure><img src="https://help.aikidogov.us/_assets/c2caef7203b6/Screenshot-2025-06-23-at-10.08.35.png" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**ダッシュボードでレート制限を設定する**


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

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

![認証ルートと保護およびレート制限のオプションを表示している API ルート管理画面。](https://help.aikidogov.us/_assets/5c97a4dd85f0/Screenshot-2025-10-30-at-10.38.17.png)

![POST /auth/login のレート制限を 1 分あたり 5 リクエストに設定。](https://help.aikidogov.us/_assets/a8c11e989a3b/ucarecdn-34b1af76-facb-4b6d-9c87-155236236b8f.png)

**レート制限の確認**

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

```
You are rate limited by Aikido firewall. (Your IP: 1.2.3.4)
```
{% endstep %}

{% step %}
**次のステップ**


Zen Firewall のインストールが完了しました。問題が発生した場合や、ご不明な点、機能のご要望がある場合は、お気軽にサポートまでお問い合わせください。

Zen Firewall が提供するさまざまな機能をぜひご覧ください：

* [blocking-bot-traffic-with-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-bot-traffic-with-zen-firewall "mention")
* [blocking-tor-traffic-with-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-tor-traffic-with-zen-firewall "mention")
* [blocking-users-with-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-users-with-zen-firewall "mention")
* [blocking-known-threat-actors-with-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-known-threat-actors-with-zen-firewall "mention")
* [blocking-traffic-by-country-with-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-traffic-by-country-with-zen-firewall "mention")
* [setting-up-rate-limiting-for-routes.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/setting-up-rate-limiting-for-routes "mention")
* [monitor-outbound-domains.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/monitor-outbound-domains "mention")

その他の情報：

* [how-zen-works-performance-reliability.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/miscellaneous/how-zen-works-performance-reliability "mention")
* [blocking-vs-detection-mode-in-zen-firewall.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/blocking-vs-detection-mode-in-zen-firewall "mention")
* [understanding-your-zen-statistics.md](https://help.aikidogov.us/docs/docs-ja/zen-firewall/zen-features/understanding-your-zen-statistics "mention")
{% endstep %}
{% endstepper %}
