エンハンスドロードバランサのオリジン保護|IP制限とオリジンガード

セキュリティ , ネットワーク # エンハンスドロードバランサ

こんにちは、UOZUです!

今回は、さくらのクラウドの「エンハンスドロードバランサ」を利用する際に、実サーバ(オリジンサーバ)への直接アクセスを制限する方法について紹介します。

エンハンスドロードバランサを利用すると、

クライアント


エンハンスドロードバランサ


実サーバ

という構成でWebサイトへアクセスできます。

しかし、実サーバにグローバルIPアドレスが設定されている場合、エンハンスドロードバランサを経由せず、実サーバのIPアドレスへ直接アクセスできてしまいます。

そこで今回は、

・プロキシ元IPアドレスを利用したアクセス制限
・オリジンガードを利用したアクセス制限

の2つを確認してみます。

制限前の状態

制限前の状態は以下です。エンハンスドロードバランサへのアクセスも、オリジンサーバのアクセスも双方が可能な状態になっています。

エンハンスドロードバランサへのアクセス
# curl -I http://203.0.113.130/index.html
HTTP/1.1 200 OK
date: Sun, 06 Sep 2026 07:44:19 GMT
server: Apache/2.4.63 (AlmaLinux)
last-modified: Sun, 09 Aug 2026 08:12:00 GMT
etag: "9-65898cac78b13"
accept-ranges: bytes
content-length: 9
content-type: text/html; charset=UTF-8
via: 1.1 sac-elb
オリジンサーバへのアクセス
# curl -I http://198.51.100.189/index.html
HTTP/1.1 200 OK
Date: Sun, 06 Sep 2026 07:44:54 GMT
Server: Apache/2.4.63 (AlmaLinux)
Last-Modified: Sun, 09 Aug 2026 08:12:00 GMT
ETag: "9-65898cac78b13"
Accept-Ranges: bytes
Content-Length: 9
Content-Type: text/html; charset=UTF-8

エンハンスドロードバランサのプロキシ元ネットワーク

エンハンスドロードバランサはプロキシ型のロードバランサのため、クライアントから受信したリクエストを実サーバへプロキシします。

そのため、実サーバから見ると、接続元はエンハンスドロードバランサとなります。

エンハンスドロードバランサの「情報」画面を確認すると、「プロキシ元ネットワーク」という項目があります。

エンハンスドロードバランサのプロキシ元ネットワークの表示

このネットワークは、エンハンスドロードバランサが実サーバへ接続する際や、ヘルスチェックを実行する際の送信元となるネットワークです。

つまり、このネットワークからの通信のみを実サーバ側で許可すれば、

インターネット


エンハンスドロードバランサ

│ (エンハンスドロードバランサからのアクセスのみ許可)

実サーバ

という経路に制限できます。

サーバ内のファイアウォールや、パケットフィルタで制限を行うことで、オリジンサーバ自体へのアクセス制限を行います。

オリジンサーバへの制限設定例(firewalld)

Firewalldで制限を行うなら、serviceからhttpを削除し、エンハンスドロードバランサのプロキシ元IPのみ、tcp 80 へのアクセスを許可する、といった制限が可能です。

[root@uozu-orgin ~]# firewall-cmd --list-all
public (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="203.0.113.160/27" port port="80" protocol="tcp" accept
制限後のエンハンスドロードバランサへのアクセス
# curl -I http://203.0.113.130/index.html
HTTP/1.1 200 OK
date: Sun, 06 Sep 2026 07:50:10 GMT
server: Apache/2.4.63 (AlmaLinux)
last-modified: Sun, 09 Aug 2026 08:12:00 GMT
etag: "9-65898cac78b13"
accept-ranges: bytes
content-length: 9
content-type: text/html; charset=UTF-8
via: 1.1 sac-elb
制限後のオリジンサーバへのアクセス
# curl -I http://198.51.100.189/index.html
curl: (7) Failed to connect to 198.51.100.189 port 80 after 0 ms: Could not connect to server

IPアドレスでアクセス制限できない場合は?

上記方法では、実サーバ側でエンハンスドロードバランサのプロキシ元ネットワークのみを許可しました。

しかし、利用している環境によっては、ネットワークやファイアウォール側で送信元IPアドレスによるアクセス制限を行えない場合もあります。

そのような場合に利用できるのが、エンハンスドロードバランサの「オリジンガード」機能です。

オリジンガード機能とは

オリジンガードは、エンハンスドロードバランサから実サーバへリクエストを送信する際に、専用のHTTPヘッダーを付与する機能です。

エンハンスドロードバランサに「オリジンガードトークン」を設定すると、実サーバへのリクエストに、

X-Origin-Guard

というHTTPヘッダーが追加されます。

例えば、

X-Origin-Guard: xxxxxxxxxxxxxxxx

のような形です。

実サーバ側では、このヘッダーに設定されたトークンを確認します。

エンハンスドロードバランサ
        │
        │ X-Origin-Guard: 正しいトークン
        ▼
     実サーバ
        │
        └─ 許可

ただし、実サーバへ直接アクセスした場合には、正しい X-Origin-Guard ヘッダーが付与されていないため、

クライアント
        │
        │ X-Origin-Guardなし
        ▼
     実サーバ
        │
        └─ 403 Forbidden

といった形で拒否できます。

IPアドレスではなく、エンハンスドロードバランサが付与するトークンを使ってアクセスを判定する仕組みです。

エンハンスドロードバランサにオリジンガードを設定する

それでは、オリジンガードを設定してみます。

さくらのクラウドのコントロールパネルから、対象のエンハンスドロードバランサを開きます。

オリジンガードトークン設定画面

オリジンガードトークンには、実サーバとの確認に使用するトークンを設定します。

トークンには8~32文字の英数字・記号を指定できます。

例えば、

0Nuiynnsa4rgxxhqggGw

のようなトークンを設定します。

オリジンガードトークン設定例

※実際には推測されにくい十分にランダムな文字列を使用してください。また、記事やスクリーンショットに実際のトークンを掲載しないよう注意してください。

設定を反映すると、エンハンスドロードバランサから実サーバへのリクエストに、

X-Origin-Guard: 0Nuiynnsa4rgxxhqggGw

が付与されるようになります。

ただし、ここで重要なのは、エンハンスドロードバランサ側でオリジンガードトークンを設定しただけでは、実サーバへの直接アクセスは拒否されないという点です。

実サーバ側でも X-Origin-Guard の値を検証する設定が必要です。

Apacheでオリジンガードを設定する

実サーバがApacheの場合には、mod_rewriteを利用して X-Origin-Guard ヘッダーを確認できます。

例えば以下のように設定します。

[root@uozu-orgin ~]# vi /var/www/html/.htaccess
[root@uozu-orgin ~]# cat /var/www/html/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:X-Origin-Guard} !^0Nuiynnsa4rgxxhqggGw$
    RewriteRule ^ - [F]
</IfModule>

正しいトークンが送信されていない場合には、アクセスを拒否します。

エンハンスドロードバランサ経由でアクセスすると、

X-Origin-Guard: 0Nuiynnsa4rgxxhqggGw

が付与されるため、通常どおりWebサイトを表示できます。

一方、実サーバへ直接アクセスすると正しいトークンが存在しないため、アクセスが拒否されます。

制限後のエンハンスドロードバランサへのアクセス
# curl -I http://203.0.113.130/index.html
HTTP/1.1 200 OK
date: Sun, 06 Sep 2026 08:05:21 GMT
server: Apache/2.4.63 (AlmaLinux)
last-modified: Sun, 09 Aug 2026 08:12:00 GMT
etag: "9-65898cac78b13"
accept-ranges: bytes
content-length: 9
content-type: text/html; charset=UTF-8
via: 1.1 sac-elb
制限後のオリジンサーバへのアクセス
# curl -I http://198.51.100.189/index.html
HTTP/1.1 403 Forbidden
Date: Sun, 06 Sep 2026 08:05:22 GMT
Server: Apache/2.4.63 (AlmaLinux)
Content-Type: text/html; charset=iso-8859-1

オリジンガード利用時の注意点

オリジンガードはHTTPヘッダーを利用した仕組みです。そのため、トークンが外部へ漏えいしないように管理することが重要です。

設定ファイルを公開リポジトリへ登録したり、トークンが表示された管理画面のスクリーンショットをそのまま公開したりしないよう注意しましょう。

また、オリジンガードを有効にしただけでは実サーバ側のアクセス制御は行われません。

必ずApacheやNginxなどの実サーバ側で X-Origin-Guard ヘッダーを検証し、トークンが一致しないリクエストを拒否する設定を行います。

さいごに

今回は、さくらのクラウドのエンハンスドロードバランサを利用する際に、実サーバへの直接アクセスを防ぐ方法について確認しました。

実サーバ側でアクセス元IPアドレスを制限できる場合には、エンハンスドロードバランサの「プロキシ元ネットワーク」を利用することで、ロードバランサ経由の通信だけを許可できます。

一方、IPアドレスによるアクセス制限を行えない環境では、「オリジンガード」を利用する方法があります。

オリジンガードでは、エンハンスドロードバランサが実サーバへのリクエストに X-Origin-Guard ヘッダーを付与し、実サーバ側でトークンを検証することで、エンハンスドロードバランサを経由しないアクセスを抑制できます。

エンハンスドロードバランサを利用する際には、ロードバランサを構築するだけでなく、実サーバへ直接アクセスできる状態になっていないかについても確認しておくとよいでしょう。

今回はここまでです。

最後まで読んでいただき、ありがとうございました!

この記事を書いた人

UOZU

ネットアシスト運用チーム10年目の運用エンジニア

さくらのクラウド検定 ベーシック (第一回)

さくらのクラウド検定 アドバンスド (第一回)

AWS Certified Solutions Architect - Associate

AWS Certified AI Practitioner