ALB で 特定のバーチャルホストへのアクセスを IP 制限したい

ALB のリスナールールを使って、バーチャルホストで構成した特定の Web サイトに対して IP 制限する方法を試してみました。
2020.01.16

みなさま Xin chao !

Application Load Balancer (以下 ALB) のリスナールールを活用することにより、以下のブログで紹介されているように、管理者向けの URL パスに対してのみ IP 制限を行うことができます。

Application Load BalancerのリスナールールによるIP制限

AWS 上に小規模かつテスト用途的な高可用性を求められない Web サイトを構築する場合、ALB と 1 台の EC2 だけで実現することが可能です。 さらに、Web サーバーでバーチャルホストを構成することにより、その EC2 上で複数の Web サイトを稼働させることもできます。

そのような構成で、特定の Web サイトへのアクセスに対してのみ、接続元 IP 制限を行いたいという状況も起こり得るのではないかと思います。

上記ブログでは、管理者向けページなど特定の URL パスに対して IP 制限する方法がまとめられていますが、今回は、バーチャルホストで構成した特定の Web サイトに対して IP 制限する方法を試してみました。

なお、Web サーバーとして Internet Information Services (以下 IIS) を使っていますが、今回のメインは ALB なので、他の Web サーバーでも同様の構成が可能です。

やりたいこと

  • IIS に名前ベースのバーチャルホストで以下の Web サイトを構築
    • サービス提供用の Web サイト (https://www.masawo.classmethod.info/)
    • 管理機能提供用の Web サイト (https://masawo.classmethod.info/)
  • ドメインを取得済みで、Route 53 に登録済みのホストゾーンに必要なレコードを追加
  • ALB のリスナールールにより 管理機能提供用 Web サイトへのアクセスを特定の IP アドレスからのみに制限
    • 特定の IP アドレス以外から管理機能提供用 Web サイトにアクセスした場合は サービス提供用の Web サイトにリダイレクト
    • HTTPS でのアクセスを強制するため HTTP でのアクセスは HTTPS にリダイレクト

やってみた

IIS の Web サイトを設定

以下のブログを参考に、1 台の EC2 上にサービス提供用の Web サイトと、管理機能提供用の Web サイトを構築します。 少々古いブログになりますが、確認したところ最新の Windows Server 2019 でも大きな違いはなかったので、そのまま活用することができました。

名前ベースのバーチャルホストをIISで実現する

作成後のWeb サイトは、以下のようになります。

  • Default Web Site
    • サービス提供用の Web サイトを想定
    • www.masawo.classmethod.info としてアクセス
  • Admin Web Site
    • 管理機能提供用の Web サイトを想定
    • masawo.classmethod.info としてアクセス

それぞれの Web サイトにアクセスしたことが分かるように確認用の index.html を配置します。 どちらのサイトにアクセスしたのか分かれば良いので内容は適当で構いませんが、今回は以下のような内容で試しました。

  • サービス提供用の Web サイト
    <!doctype html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Service Web Site</title>
    </head>
    <body>
    <p>You accessed https://www.masawo.classmethod.info/</p>
    </body>
    </html>
  • 管理機能提供用の Web サイト
    <!doctype html>
    <html> 
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Admin Web Site</title>
    </head>
    <body>
    <p>You accessed https://masawo.classmethod.info/</p>
    </body>
    </html>

Route 53 にレコードを登録

名前解決できるよう、ホストゾーンに Web サーバーに関する以下のレコードを登録します。

名前 タイプ
masawo.classmethod.info. A ALIAS dualstack.masawo-test-alb-1234567890.us-east-1.elb.amazonaws.com. (≒ALB の DNS 名)
www.masawo.classmethod.info. A ALIAS dualstack.masawo-test-alb-1234567890.us-east-1.elb.amazonaws.com. (≒ALB の DNS 名)

ALB に SSL 証明書を登録

HTTPS リスナーで使用する SSL 証明書として、事前に Amazon Certificate Manager (以下 ACM) で発行しておいた、以下の 2 つのドメイン用のパブリック証明書を登録します。 Server Name Indication (以下 SNI) に未対応のクライアントからのアクセスが予想される場合、複数の証明書を登録する代わりにワイルドカード証明書を登録することも検討します。

  • www.masawo.classmethod.info
  • masawo.classmethod.info

ALB における複数の SSL 証明書対応については、以下のブログをご参照ください。

ALBで複数のSSL/TLS証明書を設定できるSNIに対応しました

ACM での SSL 証明書の発行手順については、以下のブログが参考になります。

内部 ALB の HTTPS 通信を試してみた

ALB リスナールールを設定

HTTPS リスナーの優先順位 1 のルールとして、送信元 IP 条件と、ホストヘッダー条件を組み合わせたリスナールールを作成します。 特定の IP アドレスから、管理機能提供用の Web サイトである masawo.classmethod.info にアクセスした場合は、ターゲットグループに転送します。 ターゲットグループには Web サイトを構築した EC2 を登録しておきます。

優先順位 2 のルールとして、特定の IP アドレス以外から、管理機能提供用の Web サイトにアクセスした場合は、サービス提供用の Web サイトである www.masawo.classmethod.jp にリダイレクトさせるルールを作成します。

デフォルトアクションのルールは、ターゲットグループに転送するようにします。 上記の 2 つのルールが適用されない場合このルールが適用され、サービス提供用の Web サイトが表示されます。

まとめると、以下のようになります。

また、HTTP でのアクセスは HTTPS にリダイレクトさせるよう、HTTP リスナーのルールを以下のようにします。

接続確認

特定の IP アドレスからは、管理機能提供用の Web サイトである https://masawo.classmethod.info/ にアクセスできます。

PS C:\> $html=(Invoke-WebRequest -URI "https://masawo.classmethod.info/")
PS C:\> $html.RawContent
HTTP/1.1 200 OK
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 230
Content-Type: text/html
Date: Xxx, dd Mmm yyyy hh:nn:ss GMT
ETag: "942c14284cbd51:0"
Last-Modified: Xxx, dd Mmm yyyy hh:nn:ss GMT
Server: Microsoft-IIS/10.0

<!doctype html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Admin Web Site</title>
</head>
<body>
You accessed https://masawo.classmethod.info/
</body>
</html>

特定の IP アドレス以外から、管理機能提供用の Web サイトである https://masawo.classmethod.info/ にアクセスすると、サービス提供用の Web サイトに用意した index.html が表示されます。

PS C:\> $html=(Invoke-WebRequest -URI "https://masawo.classmethod.info/")
PS C:\> $html.RawContent
HTTP/1.1 200 OK
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 226
Content-Type: text/html
Date: Xxx, dd Mmm yyyy hh:nn:ss GMT
ETag: "e76add3184cbd51:0"
Last-Modified: Xxx, dd Mmm yyyy hh:nn:ss GMT
Server: Microsoft-IIS/10.0

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Service Web Site</title>
</head>
<body>
You accessed https://www.masawo.classmethod.info/
</body>
</html>

特定の IP アドレス以外から -MaximumRedirection 0 を指定して、管理機能提供用の Web サイトである https://masawo.classmethod.info/ にアクセスすると、HTTP ステータス 301 が返され、サービス提供用の Web サイトである https://www.masawo.classmethod.info/ にリダイレクトされているいることが確認できます。

PS C:\> $html=(Invoke-WebRequest -URI "https://masawo.classmethod.info/" -MaximumRedirection 0)
Invoke-WebRequest : リダイレクトの最大数を超えています。許容されるリダイレクトの数を増やすには、-MaximumRedirection パラメーターの値を大きくしてください。
発生場所 行:1 文字:8
+ $html=(Invoke-WebRequest -URI "https://masawo.classmethod.info/" -Max ...
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、InvalidOperationException
    + FullyQualifiedErrorId : MaximumRedirectExceeded,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
PS C:\> $html.RawContent
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 150
Content-Type: text/html
Date: Xxx, dd Mmm yyyy hh:nn:ss GMT
Location: https://www.masawo.classmethod.info:443/
Server: awselb/2.0

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

最後に、HTTP でアクセスした場合に、HTTPS にリダイレクトされることも確認しておきます。

PS C:\> $html=(Invoke-WebRequest -URI "http://www.masawo.classmethod.info/" -MaximumRedirection 0)
Invoke-WebRequest : リダイレクトの最大数を超えています。許容されるリダイレクトの数を増やすには、-MaximumRedirection パラメーターの値を大きくしてください。
発生場所 行:1 文字:8
+ $html=(Invoke-WebRequest -URI "http://www.masawo.classmethod.info/" - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、InvalidOperationException
+ FullyQualifiedErrorId : MaximumRedirectExceeded,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
PS C:\> $html.RawContent
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 150
Content-Type: text/html
Date: Xxx, dd Mmm yyyy hh:nn:ss GMT
Location: https://www.masawo.classmethod.info:443/
Server: awselb/2.0

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

まとめ

ALB のリスナールールにより、特定のバーチャルホスト宛てのアクセスに対してのみ IP 制限を掛けることができました。

本編では省略しましたが、今回の場合、ALB に適用するセキュリティグループは、すべてのアクセスを受け付けるように設定しています。 ALB に適用したセキュリティグループで IP 制限を行った場合、サービス提供用 Web サイトへのアクセスと、管理機能提供用 Web サイトへのアクセスの両方が制限対象となります。