WAFは切りたくない、でもAPIは使いたい
こんにちは、ZIDOOKAです。
WordPressのREST APIを使って画像をアップロードする際、WAF(ウェブアプリケーションファイアウォール) に阻まれて 403 Forbidden エラーが出ることがあります。
「WAFを無効にすれば解決する」というのは有名な話ですが、セキュリティの観点からメインサイトのWAFは切りたくないというのが本音でしょう。
そこで今回は、「メインサイトのWAFを有効にしたまま、APIによる画像アップロードだけを成功させる」 という、セキュリティと利便性を両立させるテクニックを紹介します。
解決策:API専用のサブドメインを作る
結論から言うと、「画像アップロード(API利用)専用のサブドメイン」 を用意しました。
仕組み
レンタルサーバー(今回はLolipop!)のWAF設定は、ドメイン(サブドメイン)ごとに独立しています。これを利用します。
メインサイト (
example.com):- 一般ユーザーが閲覧する場所。
- WAF:有効 (ON)
- セキュリティを高く保つ。
API用サブドメイン (
api.example.com):- 自分(CLIツール)だけがアクセスする場所。
- 設定:API用に調整
- REST APIのエンドポイントとして使用。
実装手順
サブドメインを作成する: サーバーの管理画面でサブドメインを作成し、メインサイトと同じディレクトリ(またはWordPressがインストールされているディレクトリ)を参照させます。
設定を変更する: サブドメイン側のセキュリティ設定を、API利用に支障がないように調整します。メインサイトの設定は強固なまま維持できます。
APIクライアントの設定を変える: 自作のCLIツールやプログラムからの接続先(エンドポイント)を、メインのURLからサブドメインに変更します。
// 変更前 const apiUrl = 'https://example.com/wp-json'; // 変更後 const apiUrl = 'https://api.example.com/wp-json';
セキュリティと副作用について
「WAFを切る=無防備」になるのでは?と心配されるかもしれません。 しかし、この手法は「攻撃面を限定する」という設計思想に基づいています。
さらなるセキュリティ強化策
API用サブドメインをさらに安全にするために、以下の対策を組み合わせるのがおすすめです。
- IP制限: 自宅やCI/CD環境(GitHub Actionsなど)のIPアドレスのみ許可する。
- Basic認証: Webサーバー側でBasic認証をかけ、APIクライアント側でヘッダーを追加する。
- 権限の最小化: APIを利用するユーザーには「管理者」ではなく「投稿者」権限のみを与える。
副作用の確認
- メディアURL: アップロードされた画像のURLは、設定次第でメインドメイン (
example.com) にもサブドメイン (api.example.com) にもなり得ます。SEOを気にする場合は、メインドメインのURLで返されるようにWordPress側を設定するか、CDNを挟むのが良いでしょう。 - SSL: サブドメインにも必ずSSL (HTTPS) を設定してください。
他の回避策との比較
| 手法 | セキュリティ | 再現性 | 備考 |
|---|---|---|---|
| WAF全解除 | × 危険 | ◎ 高い | 推奨されません。 |
| User-Agent偽装 | △ 微妙 | △ 低い | WAFのルール次第で防げない場合あり。 |
| プラグイン調整 | △ 普通 | △ 中 | プラグインに依存するため環境による。 |
| サブドメイン分離 | ◎ 安全 | ◎ 高い | 設定が明確で、恒久的な対策になる。 |
まとめ
これにより、以下のような理想的な環境が構築できました。
- Webサイトへの攻撃: メインサイトのWAFがブロックしてくれます。
- API経由のアップロード: サブドメイン経由で行われるため、WAFに邪魔されずに成功します。

「403エラーが出るからWAFを全解除する」というのは最終手段です。 このように入り口(ドメイン)を分けることで、セキュリティリスクを最小限に抑えつつ、自動化のメリットを享受できます。
WordPressのREST APIで403エラーに悩んでいる方は、ぜひ「サブドメイン戦略」を試してみてください。