Cloudflareを経由しない直アクセスの禁止を、変換ルールとオリジンのWebサーバ設定で実施してみた

ALBやAWS WAFなどが利用できない環境で、Cloudflareで付与した認証用のリクエストヘッダを Nginx、httpdで判定、オリジンの直参照を禁止する利用を試してみました。
2024.03.18

AWSのVPS(Amazon Lightsail)を Webサーバ、Cloudflareを CDN,WAF として利用する環境で、 LightsailのWebサーバに対する直接アクセスを抑制するため、

  • Cloudflareの 変換ルール(Transform Rules) を利用して、認証用のリクエストヘッダを追加
  • LightsailのWebサーバで認証用のヘッダーの判定を行い、Cloudflare 経由のアクセスのみを許可

とした設定を試す機会がありましたので、紹介させて頂きます。

イメージ図

Cloudflare構成図

Cloudflare設定

リクエストヘッダーを修正する変換ルールを作成しました。

変換ルール作成

※無料プランでも、10個までのルールは作成可能です。

保護対象のホスト名に一致した場合、固定のカスタムヘッダをリクエストヘッダとして追加する設定としました。

リクエストヘッダ追加

  • スタティック設定
  • ヘッダー名: x-hogehoge
  • 値: fugafuga

※カスタムヘッダーは「x−」で始まる認証用と解りやすいもの。値は推測されにくい、十分強度を持った文字列でご利用ください。

Lightsail設定

Lightsailの OSは AmazonLinux 2023。

httpd(Apache)、nginx は デフォルトのリポジトリよりインストールしたものを利用しました。

  • httpd-2.4.58-1.amzn2023.x86_64
  • nginx-1:1.24.0-1.amzn2023.0.2.x86_64

httpd

指定した文字列がリクエストヘッダに定義されている場合、アクセスを許可する設定としました。

  • /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
    SetEnvIf x-hogehoge fugafuga ACCESS_OK
    Require all denied
    Require env ACCESS_OK
</Directory>

nginx

指定した文字列がセットされていない場合、アクセス禁止、403 応答を戻す設定としました。

  • /etc/nginx/nginx.conf
server {
        listen       80;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf; 
        if ( $http_x_hogehoge != 'fugafuga')  {
         return 403;
        }
    }

動作確認

Lightsail

LightsailのIPアドレスを直接指定したアクセスを試み、403応答が戻る事を確認しました。

httpd

$ curl http://3.**.**.**/index.html -v
(略)
< HTTP/1.1 403 Forbidden
< Date: Sun, 17 Mar 2024 14:51:19 GMT
< Server: Apache/2.4.58 (Amazon Linux)
< Content-Length: 199
< Content-Type: text/html; charset=iso-8859-1

nginx

$ curl http://3.**.**.**/index.html -v
(略)
< HTTP/1.1 403 Forbidden
< Server: nginx/1.24.0
< Date: Sun, 17 Mar 2024 14:53:15 GMT
< Content-Type: text/html
< Content-Length: 153
< Connection: keep-alive

Cloudflare経由

$ curl http://cloudflare.example.com/index.html -v

< HTTP/1.1 200 OK
< Date: Sun, 17 Mar 2024 14:53:56 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
(略)
< Server: cloudflare
< CF-RAY: 865dd0baefe907ad-HKG
< alt-svc: h3=":443"; ma=86400

カスタムヘッダ付与

認証用のカスタムヘッダーを付与することで、IP直アクセスは可能になります。

$ curl -H 'x-hogehoge:fugafuga' http://3.**.**.**/index.html -v
(略)
< HTTP/1.1 200 OK
< Server: nginx/1.24.0
< Date: Sun, 17 Mar 2024 14:54:21 GMT
< Content-Type: text/html
< Content-Length: 615

まとめ

CDNで付与した認証用のカスタムヘッダーを WebサーバのNginx、httpdで判定を行う事で、オリジンへの直接アクセスを抑制可能です。

一定規模以上のDoS、DDoSでは、SSL/TLSのネゴシエーション負荷がボトルネックとなる事があります。 CDN、オリジン間の通信が平文となるリスクが問題とならない場合には、暫定対策として Cloudflareの SSL/TLS 暗号化モード フレキシブル、オリジンのWebサーバのhttpsは無効化する事もご検討ください。

SSL暗号化モード

※ここまでの対策がVPS(Lightsail)で必要となる場合、恒久対策としては、Application Load Balancer(ALB)や、AWS WAF の 利用できるEC2、ECSへの移行もご検討頂くことをおすすめします。