Azure Websites、ロール、および Virtual Machines で SSL 3.0 を無効化する方法
このポストは、10 月 19 日に投稿した How to Disable SSL 3.0 in Azure Websites, Roles, and Virtual Machines の翻訳です。
マイクロソフトは、SSL 3.0 の脆弱性の解決にお役立ていただける、セキュリティ アドバイザリ 3009008 を公開しました。これは SSL 3.0 プロトコル自体に影響を及ぼす脆弱性で、業界全体に関連するものであり、特定のマイクロソフト製品や Azure でこのプロトコルを実装する場合に特有のものではありません。Azure Websites、ロール、および Windows の Virtual Machines では、このプロトコルが既定で有効になっています。
サーバーについても SSL 3.0 を無効化することができます。この場合、より強力な TLS プロトコルをすべての接続で使用する必要があり、SSL 3.0 のみをサポートしている古いブラウザーをお使いのユーザーがサーバーに接続できなくなるため、注意が必要です。
マイクロソフトは、お客様が Azure Websites、ロール、および Virtual Machines で SSL 3.0 を無効化する方法のガイドを公開しました。ロールおよび Virtual Machines は、お客様の手でこのプロトコルを無効化できます。Azure Websites の設定を変更する機能は、2014 年 10 月 20 日 (月) から皆様にご利用いただけます。この変更を実装する前に、変更に伴うリスクについて十分に検討されることをおすすめします。
ここからは、Azure Websites、ロール、および Virtual Machines で SSL 3.0 接続を禁止するように構成する手順について説明します。
Azure Websites で SSL 3.0 を無効化する
方法 1: Site Extensions「Disable SSLv3」を使用する
こちらのブログ記事の説明に従って、新しい Azure 管理ポータル (https://portal.azure.com) から新しい Site Extensions をインストールします。Site Extensions のリストをスクロールして、「Disable SSL v3」という名前のものを選択します (下図参照)。
従来の Azure 管理ポータル (https://manage.windowsazure.com) をご利用の場合は、SCM サイト (https://<自分のサイト>.scm.azurewebsites.net/) から、この Site Extensions をインストールできます。画面上部の [Site Extensions] リンクをクリックして [Gallery] タブを選択し、検索ボックスに「SSL」と入力して検索すると、Disable SSL v3 が表示されます。これをサイトに追加します。管理ポータルでサイトのダッシュボードからサイトを再起動すると、そのサイトで SSL 3.0 が無効化されます。
方法 2: web.config で URLRewrite ルールを構成する
どのような場合でも、お客様の Web サイトに対して SSL 3.0 による HTTPS 接続がクライアントで確立されたときには、Azure Websites のフロントエンド (ロード バランサー) で X-Forwarded-SSLv30 という特殊な要求ヘッダーの値が 1 に設定され、送信されます。このため、クライアントが SSL 3.0 接続を確立した場合に、下記のサンプルのようなカスタム アクションを実行するように URLRewrite ルールを記述して構成することができます。下記のサンプルでは 403 エラーが戻されますが、接続を破棄したり、他のサイトや URL にリダイレクトしたりするような設定も簡単にできます。必要な作業は、お客さまのサイトの 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>
Azure ロール (Web ロールまたは Worker ロール) で SSL 3.0 を無効化する
Azure の PaaS (サービスとしてのプラットフォーム) ロールで、基盤となるオペレーティング システムに変更を加える場合の最良の方法は、起動タスクを使用してアプリケーションをデプロイし直すことです。構成がすべてのロール インスタンスで確実に受信され、またオートスケール処理やサービス回復処理の影響を受けないようにするには、この方法をとる必要があります。この構成は、アプリケーションをデプロイし直さないと変更できません。
VIP スワップを運用環境で実施する前に、ステージング モードでアプリケーションの回帰テストを十分に行うことを強くお勧めします。
手順 1: スタートアップ スクリプトを構築してロール構成の中に配置する
DisableSslv3.cmd という名前の次のようなファイルを新規作成し、各ロールの定義のスタートアップ ディレクトリに保存します。
PowerShell -ExecutionPolicy Unrestricted .\DisableSslv3.ps1 >> “%TEMP%\StartupLog.txt” 2>&1
EXIT /B 0
DisableSslv3.ps1 という名前の次のようなファイルを新規作成し、各ロールの定義のスタートアップ ディレクトリに保存します。
$regkeys = @(
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client",
"HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server",
"HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL0010002"
)
$cipherorder = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,"
$cipherorder += "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,"
$cipherorder += "TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,"
$cipherorder += "TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,"
$cipherorder += "TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_RC4_128_MD5"
# 何らかの設定が変更された場合、これが $True に変更されサーバーが再起動される
$reboot = $False
Function Set-CryptoSetting {
param (
$keyindex,
$value,
$valuedata,
$valuetype,
$restart
)
# レジストリ キーが存在するかどうかを確認し、存在しない場合は作成する
If (!(Test-Path -Path $regkeys[$keyindex])) {
New-Item $regkeys[$keyindex] | Out-Null
}
# レジストリの値のデータを取得する (存在しない場合は null)
$val = (Get-ItemProperty -Path $regkeys[$keyindex] -Name $value -ErrorAction SilentlyContinue).$value
If ($val -eq $null) {
# 値が存在しない場合、値を作成して必要な値に設定する
New-ItemProperty -Path $regkeys[$keyindex] -Name $value -Value $valuedata -PropertyType $valuetype | Out-Null
$restart = $True
} Else {
# 値が存在する場合で、必要な値ではない場合は値を変更する
If ($val -ne $valuedata) {
Set-ItemProperty -Path $regkeys[$keyindex] -Name $value -Value $valuedata
$restart = $True
}
}
return $restart
}
# 親レジストリ キー (SSL 2.0 および SSL 3.0) が存在するかどうかを確認し、存在しない場合は作成する
For ($i = 9; $i -le 12; $i = $i + 3) {
If (!(Test-Path -Path $regkeys[$i])) {
New-Item $regkeys[$i] | Out-Null
}
}
# クライアントで SSL 2.0 を確実に無効化する
$reboot = Set-CryptoSetting 10 DisabledByDefault 1 DWord $reboot
# サーバーで SSL 2.0 を確実に無効化する
$reboot = Set-CryptoSetting 11 Enabled 0 DWord $reboot
# クライアントで SSL 3.0 を確実に無効化する
$reboot = Set-CryptoSetting 13 DisabledByDefault 1 DWord $reboot
# サーバーで SSL 3.0 を確実に無効化する
$reboot = Set-CryptoSetting 14 Enabled 0 DWord $reboot
# 何らかの設定が変更されている場合は再起動する
If ($reboot) {
Write-Host "Rebooting now..."
shutdown.exe /r /t 5 /c "Crypto settings changed" /f /d p:2:4
}
手順 2: スタートアップ タスクをロールのサービス定義 (csdef) に追加する
<ServiceDefinition name="MyService" xmlns="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole1">
<Startup>
<Task commandLine="DisableSslv3.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
</WebRole>
<ServiceDefinition>
Azure Virtual Machines で SSL 3.0 を無効化する
上記の Azure ロール (PaaS) 用 PowerShell スクリプトは、Windows の Virtual Machines で SSL 3.0 を無効化する場合にも同様に使用できます。このスクリプトは手動で配信し、リモート デスクトップ プロトコル (RDP) またはお客様のお好みのインフラストラクチャ構成管理システム (Puppet や Chef など) を通じて実行することができます。
Linux の Virtual Machines については、ご利用のディストリビューションのガイダンスを参照してください。