gokigenmaruのブログ

40から始めるクラウドエンジニア

AWS ALBでHostヘッダをチェックさせる

前回、証明書で自身が設定しているFQDNからのみ接続を受けるのは出来ないと書きました。証明書のCNチェックは接続元が実施している為です。
その対応方法としてAWS ALBのリスナー設定でHostヘッダが設定しているFQDNとmatchしたら処理を実施するということを言いました。
今回はその設定の方法です。

リスナー設定方法

設定を実施したいALBのリスナータブを選択してください。
画面の赤枠、リスナーの追加を選択します。

f:id:gokigenmaru:20220408134251p:plain
ALB設定1


まずはリスナーを作成します。
デフォルトアクションは403を返します。
これはこの後に作成するルールにマッチしないものは全てこのアクションを実施するという設定です。
今回はHostヘッダがFQDNとマッチしない場合は403を接続元に返す設定とします。

f:id:gokigenmaru:20220408134836p:plain
ALB設定2


リスナーの作成をすると、作成したリスナーが出てくるので、「ルールの表示/編集」で新しいルールを作成します。
今のままだとデフォルトアクションが固定で403を返すとなっているので、すべてのアクセスが403になっちゃいます。

f:id:gokigenmaru:20220408140522p:plain
ALB設定3

画面上部の+を押して、ルール挿入で画面の通り設定をします。
IFのところはホストヘッダーを選択します。
THENのところはご自由にとなります。もし後ろにEC2などがいてターゲットグループを設定済みであればターゲットグループを、リダイレクトとかをしたいのであればリダイレクトの設定を入れていただけばいいかと思います。
ここで作成しているのはテスト用なので、固定レスポンスで200、本文はtestを返す簡単なものにしました。

IFのところに条件を追加すれば、ホストヘッダにマッチした上でxxxならTHENの処理をするなどの複雑なものを作成できます。

f:id:gokigenmaru:20220408140947p:plain
ALB設定4


設定は以上で完了です。
思っているよりも簡単に出来るので、もし悩まれている人がいればやってみるといいと思います。


通信テストをしてみる

まずはホストヘッダをwww.google.co.jpとした場合

$ curl -vvv --resolve www.google.co.jp:80:35.161.81.199 http://www.google.co.jp/
* Added www.google.co.jp:80:35.161.81.199 to DNS cache
* Hostname www.google.co.jp was found in DNS cache
*   Trying 35.161.81.199:80...
* TCP_NODELAY set
* Connected to www.google.co.jp (35.161.81.199) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.co.jp
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 403 Forbidden
< Server: awselb/2.0
< Date: Fri, 08 Apr 2022 05:14:54 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 0
< Connection: keep-alive
<
* Connection #0 to host www.google.co.jp left intact


接続は出来ましたが、ホストヘッダがexample.comではないので403が返っています。
ALBのリスナーのデフォルトアクションですね。

次はホストヘッダをexample.comとした場合です。

$ curl -vvv --resolve example.com:80:35.161.81.199 http://example.com/
* Added example.com:80:35.161.81.199 to DNS cache
* Hostname example.com was found in DNS cache
*   Trying 35.161.81.199:80...
* TCP_NODELAY set
* Connected to example.com (35.161.81.199) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: awselb/2.0
< Date: Fri, 08 Apr 2022 05:15:23 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 4
< Connection: keep-alive
<
* Connection #0 to host example.com left intact

接続が出来て、200応答が返ってきました。
想定通りです。
これでホストヘッダをALBが識別してアクションを変えていることが分かります。

こんな感じで簡単にできます。
クライアントからの接続をFQDNでアクション変えたいという人はこれを試してみてください。