非認証APIのアクセス対策(粗大ごみセンターのシステムの例)
前回の記事で書いたとおり、全くユーザーが動作させる機能がないようなコーポレートサイトやLPサイトは静的サイトで作成するほうが、あらゆる面でメリットがある。ところがそれら以外の普通のWEBシステムでは、バックエンドでの動的な処理が必要なはずだ。今回はそのセキュリティの話。 バックエ …
AWSのALB(Application Load Balancer)を使って、HTTPS強制や、wwwありなし強制のリダイレクトを行うと思われる。その場合特に難しいことはなくそのための情報も腐るほど出てくる。ALBは料金も少し安いし通常はこのALBを使用すると思われる。
しかし、ALBを使用できないケースもある。それは、NS(ネームサーバー)をRoute53に設定できない時だ。Route53以外でDNSを設定する場合、ALBへのルーティングはCNAMEを設定せざるを得ない。しかし、例えば、WEBサーバーをドメインaaa.comとwww.aaa.comで運用したい場合(wwwなしをwwwありにリライトして)、「aaa.com」はCNAMEを設定できないのだ。DNSの仕組み上不可能である。そのため、独自ドメイン(aaa.com)をALBへ向けることができないのだ。(自分が知らないだけで、外部NSでALBを運用する方法があるのかもしれないが)
こういう場合は、NLB(Network Load Balancer)を利用すれば、リダイレクトを実現することができる。このNLBの情報があまり引っかからないので紹介する。ちなみに今回は「wwwありSSL通信」へリダイレクトするケースを紹介する。
NLBでは、 ロードバランサに対してStaticIPアドレスを設定できる。そのため、DNSにwwwなしもwwwありもAレコードで設定できNLBに向けることができる。しかもAWSのACMによってSSL証明書をセットしてhttps通信も簡単にできる。以下のイメージだ。
そして、Webサーバー側は80ポートで受けるので、ロードバランサではなくNginxでHTTP通信をHTTPS通信へリダイレクトするはずだ。ググると以下のconf設定がよく出てくる。
if ($http_x_forwarded_proto != https){
return 301 https://$host$request_uri;
}
しかし、これはALB用の書き方で、NLBではうまくできない!!
いろいろ調べたが、以下のようにすれば解決。同じ方法でApacheでも可能だ。
server {
listen 8080;
server_name _;
root /usr/share/nginx/html;
if ($http_user_agent !~* ELB-HealthChecker){
return 301 https://$host$request_uri;
}
}
これにより、NLBへのHTTP(80)通信をNginxの8080ポートへ流し、443へ強制的にリダイレクトできる。このとき、LBのヘルスチェックの時だけは200をリターンできるようにしておく。
nginxだと以下のようにやれば普通にできる。
server {
listen 80;
server_name aaa.com;
return 301 $scheme://www.aaa.com$request_uri;
}
今回のようなケースは、例えばお客さんがお名前.comでドメインを取得していて、メールアドレスのためのMXレコードを既に設定済みのためRoute53へネームサーバーを移したくないとごねられたときなんかが該当する。また、異様にAWSを毛嫌いしているおじさんが担当で、せめてNSだけはAWSにしたくないとの主張をお持ちのケースも考えられる。
ALB+Route53なら簡単にできるところをわざわざNLBを使用するというケースの紹介だ。
前回の記事で書いたとおり、全くユーザーが動作させる機能がないようなコーポレートサイトやLPサイトは静的サイトで作成するほうが、あらゆる面でメリットがある。ところがそれら以外の普通のWEBシステムでは、バックエンドでの動的な処理が必要なはずだ。今回はそのセキュリティの話。 バックエ …
WEBサイトって一般的にブラウザがHTMLやCSS、Js、その他画像などのファイルを読み込んで描写されているものを言うよね?一方Webサイトを作成するには、Webサーバーが必要という。特に有名なCMSであるWordPressではサーバーでPHPやデータベースが動作してサイトが構築 …