いろいろありましたがDavid Ebbo先生がAzure WebサイトでSSL 3.0をオフにする方法を用意してくれました。(正確にはオフではなく拒否ですが)
- How to disable SSL v 3.0 on Azure Website
- How to Disable SSL 3.0 in Azure Websites, Roles, and Virtual Machines
やりかたは2パターンあります。とりあえずSSL 3.0が有効な状態を見ときましょう。(curlでやるとクールだけどIEでとりあえず。)
TLSがOnだとそっち使っちゃうので一時的に。で、Azure Webサイトにつないで見ます。
こんな感じでSSL 3.0です。サイトは普通に見えます
1. Disable SSLv3 Extensionを使う
KuduにアクセスしてSite ExtensionsでDisable SSLv3をインストールします。
プレビューポータルだともう少し簡単です。(わざわざKuduにつながなくても良い)
簡単です。プレビューポータルだと再起動もされるので簡単ですね。ではブラウザでつないで見ましょう。
403になりました。TLS有効にするとちゃんと見えます。
※ちなみにこのExtension有効にすると、Extension消しても403になっちゃう気がします。。
2. URLRewriteを使う
もう1つの方法として提示されたのがURLRewriteを使う方法です。Azure Webサイトのフロントエンドのロードバランサーが、クライアントがSSL 3.0を要求してきたときに X-Forwarded-SSLv30 という特別なリクエストヘッダを付与してくれるので、こちらを見て判断する方法です。
(TLSで接続している場合などはこのリクエストヘッダが付与されません)
以下のようなルールをWeb.configに追記します。
<configuration> <system.webServer> <rewrite> <rules> <rule name="Block SSL3.0" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" /> <conditions> <add input="{HTTP_X_FORWARDED_SSL30}" pattern="1" /> </conditions> <action type="CustomResponse" statusCode="403" subStatusCode="900" statusReason="Forbidden" statusDescription="SSLv3 connections are forbidden by this site" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
こんな感じになります。
Web.configだけで設定のOn/Offできるので、こちらのほうが使い勝手がいいかもです。(但しステータスコードが例だと403になるだけなので注意 ※CustomErrorsとか設定してないとという話)
クラウドサービスや仮想マシンについては以前書いた通りです。
SSL 3.0が完全に使われてない技術であればWebサイトもホスト側ですぱっとオフにできるのでしょうけど、そうじゃないクライアントがあるのでサービス側としてはこのような形でエラーにさせる方向なのでしょうね。
完全にクライアントの問題とも言えませんがクライアント側で少なくともSSL3.0使わなければ良いはずですので、サーバー側でどうするかは状況によりけりということでしょうか。(少なくとも現状は)
あ、ちなみにモバイルサービスもKudu使えるはずなので、同じ手段で対策できるかと思います。
追記
URLRewriteでSSL3.0接続のときに403を返しつつカスタムエラーでユーザーにSSL3.0の無効化を促すようにする場合はこんな感じにすると良さそうです。
カスタムエラー用のCSHTML
@{ Response.StatusCode = 403; } <!DOCTYPE html> <html> <body> <h1>SSL 3.0を無効にしてTLSを有効にしてください</h1> </body> </html>
Web.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="webpages:Enabled" value="true" /> </appSettings> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> <httpErrors errorMode="Custom"> <remove statusCode="403" /> <error statusCode="403" path="/403.cshtml" responseMode="ExecuteURL" /> </httpErrors> <rewrite> <rules> <rule name="TestBlock" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" /> <conditions> <add input="{HTTP_X_FORWARDED_SSL30}" pattern="1" /> </conditions> <action type="CustomResponse" statusCode="403" subStatusCode="900" statusReason="Forbidden" statusDescription="SSLv3 connections are forbidden by this site" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
結果
静的ファイルだとステータスコードが200に上書きされるようなので、CSHTMLで強制的に403を返すようにするようです。
たけぱらさんありがとうございます。
これでSSL3.0の時はエラー扱いにして且つユーザーに注意を促すことができますね。
※ ただ結局SSL3.0で繋いじゃってるので脆弱な状態といえば脆弱です。注意しましょう。まぁ注意を促したりするための対応なのでクライアント側で気を付けましょうね。ということです。