先日導入したさくらのVPS上のSophos UTMでWAF設定を遊ぶメモ。
Sophos UTMのWebサーバープロテクション機能で色々実現してみた。
まず、出来ることのリスト。
・サーバロードバランシング
受けたHTTPアクセスを別のサーバに転送リクエストする。
単一サーバでも複数サーバでも出来るし、URIパスをベースに振り分けることも出来る。
・SSLオフローディング
HTTPSで受けたリクエストをHTTPリクエストで別のサーバに転送する(別のHTTPSでアクセスすることも出来る)
・6to4
IPv6で受けたリクエストをIPv4に転送リクエスト、あるいはその逆が出来る。
・パス単位のフィルタリング
ネットワークに対してアクセスできるURIパスを制御できる。
たとえば、管理画面のURIにはローカルIPのみ接続できるようにもできるので、外部からのWP-Loginを全部切り捨てることも出来る。
・上り下りのウィルス遮断
素早いシングルエンジンスキャンと高精度のデュアルエンジンスキャンの設定、アップ・ダウン方向限定及び双方向の遮断が出来る。 ウィルスをアップロードされるのを防ぎ、ウィルスを配布することを防ぐ。
・危険接続元からのアクセスを禁止
攻撃情報が多くあるIPからのアクセスを遮断することが出来る。
・典型的攻撃からの保護
プロトコル違反・リクエスト過剰・トロイ・SQLインジェクション・XSS・ソースコード/デバッグ情報漏洩等の典型的なエラーを防ぐことが出来る。
また、WAFではなくUTMのファイアウォールとしての機能で、ジオIP(IPアドレスベースによる地域情報)で接続元地域を制限することが出来る。
これらを組み合わせると、ウィルスによる被害を防ぎ、バグ・設定ミスによるセキュリティリスクを軽減する効果が期待できる。
プログラムにゼロデイのセキュリティホールがあっても、攻撃コードをネットワークレベルで遮断して保護できる効果は非常に大きい。
また、SSLオフローディングとバランシングでは、SSL負荷をリアルサーバから分割することが出来ると共にリアルサーバが複数あるときに証明書管理をUTMに一元化することも出来で管理工数が削減できる。
6to4についても、IPv6対応の要件を実サーバ側の対応無く行えることは大きい。 グローバルからグローバルへの転送リクエストも可能だから、IPv6に対応しないお名前VPSに置いたアプリケーションに、IPv6対応のさくらVPSからリクエストをリレーするなんて言う動きも可能。
WAFを構成してみる。
ナビゲーションから「Webサーバプロテクション」を開いて、WAFを選択する。
「仮想Webサーバ」を開いて、新規仮想Webサーバボタンを押して登録を行っていく。
名前は識別名なので適当に。
インターフェイスはアクセスを着信するインターフェイス。 現在構成ではPublic/Internalなので、Publicを選択。
タイプはHTTPとHTTPSはそのまま、当該プロトコルでのアクセスを着信し、HTTPS&リダイレクトだと当該ドメインのHTTPアクセスをHTTPSに自動リダイレクトしてくれる設定(常時SSLサイト化)
ポートはそのまま着信ポート。
HTTPS選択時には証明書の選択が可能。 証明書は、別途、ナビゲーションの証明書で設定。
証明書に複数のドメインが書かれていればドメイン一覧から使うドメインを選択。 HTTPの場合はドメインを手動で書き込む。
バックエンドサーバはInternal側のリアルサーバIPを設定。 右上の+ボタンで新規サーバを定義できる。
最後にファイアウォールプロファイルを選択する。 このポリシーは、上のタブからファイアウォールプロファイルで作れる。
リアルサーバで名前ベースのバーチャルサーバを作っていればホストヘッダをパスを有効化(LAN上にあるから、IPベースのバーチャルサーバに切り替えるのもアリ)
WAFの動作をチェックしてみる。
プロファイルを最弱にした状態でFuelPHPのエラーを誘発させてみる。
はい、おなじみのファイル不足エラーが出ました。 もし、このコードの周辺に攻撃に有用な情報が入っていたら最悪の事態になります。
WAFの保護を最強レベルに設定してみます。
はい、綺麗に403でブロックされました。 WAFが応答コードのコード値や、特徴的値を検出して全自動ブロックしてくれています。
この状態だと、本番時に出るエラーの内容が画面上一切わからないので、安全な接続元ではエラーをそのまま表示したいですね。
それも出来ます。 タブの除外を選んで新規追加を選ぶとこんな感じに。
特定のサーバに対して、送信元IPかURIパス、あるいはその組み合わせによる除外が効きます。
この場合は、自宅の固定IPから繋いだら全ての保護を外します。
これによって、本番サーバの設定ミスとかによるリスクを減らしつつ、楽なデバッグも出来ます。
この除外メニューにある一覧は逆に保護できる一覧なので、サイトに応じて色々設定すれば保護できるでしょう。
Memo.
v4リアルサーバでv6公開する場合:Publicのアドレスにv6も書けば、v6で受けてv4サーバの内容を表示できる。
SSLオフローディングを使った場合の実サーバのSSL判定:X-Forwarded-Protoヘッダにhttp/httpsがセットされるのでそれで判定する。
実際の接続元のIPを知る:WAFが接続元となって再リクエストするので実サーバには全部ローカルIPが記録される。 オリジナルのIPはX-Forwarded-Forヘッダにセットされる。
Apacheのログ記録をこちらに書き換える場合、httpd.confのLogFormat部
LogFormat “%h %l %u %t (%D) \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
↓
LogFormat “%{X-Forwarded-For}i %l %u %t (%D) \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
みたいな感じに、%hで記録していた接続元をX-Forwarded-Forヘッダに変更してやる。
(1208)