Windows Azure

Windows Azureにデプロイしたアプリに、特定のIPからのみ接続できるようにアクセス制限をする必要がある場合、Windowsファイヤーウォールの設定をプログラム的に変更することて対応できます。スタートアップ時と(Windows Azureゲストエージェントがファイヤーウォールの設定を戻してしまうので)ロールの変更時に設定する必要があります。

アクセス制限をしたい理由

Windows AzureにPaaSクラウドサースをデプロイすると、インターネット上にデプロイされます。
これは、インターネット上で誰でもアクセスできることを意味します(アプリケーションの認証ロジックがあるかもしれませんが)。
通常は、これは問題にはなりません。アプリを構築しデプロイすれば使用できるようになるからです。
しかし、特定マシンからのみ接続できるようにアクセス制限をしたいことがあります。

  • 未リリースで、準備が整うまでは非公開にしたいアプリケーション。
  • 複数の異なる環境のデプロイ(開発、テスト用など)があって、アプリケーションの認証ロジックを変更せずに許可された人だけがアクセスできるようにしたい
  • アプリケーションがインターナルユーザーのみ使用することを想定して設計されており、リモートから接続を許可したくない。この場合は、個別ユーザー認証のためアイデンティティソリューションを使用すべきです。
  • RDPや別のポートで運用している管理画面のような管理サービスに追加のセキュリティを施したい場合。

IISの「IPアドレスおよびドメインの制限」では不十分?

IIS干すテッドサービスへのトラフィックのみをブロックすることに興味がある場合、
IISの「IPアドレスおよびドメインの制限」機能が選択肢の一つになります
(詳細は、Liam CavanaghのBlog参照)。デフォルトではインストールされていないので、「IPアドレスおよびドメインの制限(IP and Domain Restrictions)」昨日をセットアップスクリプトをでインストールする必要があります。

この解決策では、RDPなどのIIS以外の接続も制限したい場合不十分です。

Windows Firewallでのアクセス制限

この場合、Windows Azure VMのローカルで動作しているWindows Firewallの設定を変更してあげる必要があります。通常、特定IPアドレスとポートからのみアクセスを許可するように設定するのは簡単です。

ここでは、Windows Server 2012、Windows Azure osFamilyの3で動作する、Netowork Security PowerShellコマンドレットを使用して、80と3389の2つのポートへの接続を特定IPからのみ許可する設定例を提示します。

# SetFirewallRestrictions.ps1
$date = Get-Date
Write-Host "Updating firewall rule restrictions at " $date "`r`n"
$allowedRanges = ('3.2.1.0/24', '1.2.3.4') 
Get-NetFirewallPortFilter | ? LocalPort -eq '80' | Get-NetFirewallRule | Set-NetFirewallRule -RemoteAddress $allowedRanges
Get-NetFirewallPortFilter | ? LocalPort -eq '3389' | Get-NetFirewallRule | Set-NetFirewallRule -RemoteAddress $allowedRanges

このスクリプトが呼び出されてたときログを出力するように.cmdファイルでラップします。

rem SetFirewallRestrictions.cmd
cd /d %~dp0
Powershell set-executionpolicy remotesigned -force
Powershell .\SetFirewallRestrictions.ps1 >> SetFirewallRestrictions.out.log 2>> SetFirewallRestrictions.err.log

スタートアップタスクで呼び出されるように、ServiceDefinition.csdefファイルを設定します。セキュリティ設定を昇格するように<Runtime>エレメントで設定します。

<ServiceDefinition name="FirewallTest" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">
  <WebRole name="WebRole1" vmsize="Small">
   ...  
    <Startup>
      <Task commandLine="Startup\SetFirewallRestrictions.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
    <Runtime executionContext="elevated" />
  </WebRole>
</ServiceDefinition>

スタートアップタスクを設定すると、Windows Azureは自動的にファイヤーウォールの設定を更新し、IP制限を設定しインスタンスを起動します。ロースをスケールさせると、Windows Azure Gesut Agentは、Windows Firewallの設定を再作成します。IP制限を継続するには、ロールのトポロジーが変わった際に、スクリプトを再適用する必要があります。

アプリケーションがスケールしたときに、ファイヤーウォールルールを再適用するために、RoleEntryPointクラスで、RoleEnvironment.Changedイベントを使用します。

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        RoleEnvironment.Changed += RoleEnvironment_Changed;
        return base.OnStart();
    }

    void RoleEnvironment_Changed(object sender, RoleEnvironmentChangedEventArgs e)
    {
        if (e.Changes.Any(ch => ch is RoleEnvironmentTopologyChange))
        {
            var processStartInfo = new ProcessStartInfo(@"Startup\SetFirewallRestrictions.cmd");
            var process = Process.Start(processStartInfo);
        }
    }
}

元記事

MSDNブログ:Using Windows Firewall to restrict access to Windows Azure instances

SQL Azure

SQL Server Management Studio や Visual Studio のサーバーエクスプローラーからWindows Azure SQL Database (SQL Azure)に接続するのに必要な点を説明します。

ソフトウェアのバージョンを確認する

SQL Server Management Studio

SQL Server Management Studioを使用する場合は、SQL Server Management Studio 2008 R2 SP1以降(SQL Server Management Studio 2012でもOK)を使用する必要があります。

Windows Azure SQL Database Federationを管理したいのなら、SQL Server Management Studio 2012を使用したほうが良いでしょう。

Visual Studio

Visual Studio 2010から直接接続したい場合は、Visual Studio 2010 SP1を使用する必要があります。
さらに、最新のWindows Azure SDKがインストールされているかを確認してください。
Visual Studio 2010からWindows Azure SQL Databaseに接続する場合、Azure SDK内に含まれているコンポーネントが接続をフックし、データベースへの接続を確立します。

SQL Server Native Client の設定を確認する

名前パイプに関するエラーが発生する場合、SQLクライアントのネットワークプロトコルの設定が、名前パイプを使用するように設定されている可能性があります。
Windows Azure SQL Database に接続するには、TCP/IP接続を有効にする必要があります。

SNAGHTMLa5ec48c

ローカル側のファイヤーウォールの設定確認

ポート1433を使用して、接続します。
1433が使用できるか確認してください。
ローカルマシンのファイヤーウォール、ネットワーク上のファイヤーウォールそれぞれで確認する必要があります。

SQL Azureのファイヤーウォールのルール

SQL Azureのファイヤーウォールは、接続を許可するIPを設定します。
既定では、すべてのIPからの接続を拒否するようになっていますので、接続元IPから接続できるように設定する必要があります。

SQL Azure

Windows Azure書籍

Windows Azureについて書かれた書籍が、ここ最近立て続けに発売されています。年が明けてから発売されたものでも、次の3冊が発売されています。

書籍という定型・固定的な情報源と、進化の速いクラウドの相性が悪い部分が出てしまっています。上記の書籍3冊で共通して、「SQL Azureで日本語を使用するには・・・」と特別にピックアップして説明しています。実際、あえて説明する必要があるトピックだったのです。

しかし、2011年12月にリリースされた「既定の照合順序の変更」機能により、今でも通用するけど、あえてしなくても良い話となってしまいました。

2011年12月より前にSQL Azureで日本語を使用するには・・・。

従来、SQL Azureの照合順序は、「SQL_Latin_General_CP1_CI_AS」でした。
その為、日本語を格納するには次のような対応が必要でした。

  • varchar、char、textデータ型に日本語を格納するには、個別に日本語照合順序を指定する
  • nvarchar、nchar、ntext型のようなユニコード対応データ型を使用する
  • 日本語を格納する際には、Nプレフィックスを記述する(例:「N’日本語を格納’」)

現在、SQL Azureで日本語を使用するには

2011年12月に、データベースの既定の照合順序を指定できるようになりました。そのため、データベース作成時に、照合順序を変更しておけば普通に日本語を格納することができます。

照合順序を指定してデータベースを作成するには、SQL Azure管理ポータルを使用します。Windows Azure管理ポータルからデータベースを作成する時には、照合順序を指定できません。

SQL Azure管理ポータルで、データベースを新規作成するときに照合順序を「Japanese_CS_AI」を指定します。そうすると、日本語環境のWindows Serverに日本語版のSQL Serverをインストールしたときと同じ状態になります。

image

image

とはいえ・・・

これで、話が完結しないのが日本語。

JIS2004対応をするには、結局のところ、「nvarchar、nchra、ntextデータ型を使用して、Nプレフィックスを使用する」必要があるので、結局のところ、状況はあまり変わらないのでありました。

Windows Azure

Windows Azure上で多くのインスタンスを使用している場合、特定インスタンスで発生した問題を調査する必要がでてくるかもしれません。

直接的な方法はありませんが、すべてのインスタンスかた特定インスタンスだけをオフライン化することができます。特定インスタンスでの問題を調査するために、最初にすることはロードバランサーのネットワークからインスタンスを外して、オフラインでトラブルシューティングをします。

Azureサービス管理ポータルでは、そのような機能は提供されていません。PowerShellとWindows Azureコマンドレットをコンピュートノード上で使うことで、ロードバランサーからインスタンスを除外できます。それを使用するために、Windows Azureアプリケーションにリモートログインします。

手順

  1. オフラインにしたい特定インスタンスにリモートログインします。
  2. 管理者権限でPowerShellを起動します。
  3. 次のコマンドを実行します。
    Add-PSSnapIn Microsoft.WindowsAzure.ServiceRuntime
  4. 「R」を選択します。
  5. 次のコマンドを実行します。
    Set-RoleInstanceStatus –busy
  6. オフラインモードを維持したい場合は、PowerShellのウィンドウを閉じないでください。ウィンドウを閉じると、インスタンスは再度アクティブになります。PowerShellウィンドウには次の画像のようなメッセージが表示されます。
  7. 2~5分程度で、特定インスタンスはオフラインになります。

Windows Azure管理ポータルでのステータスは次のようになります。

確認するために、オフラインにしたの同じインスタンス上でPSコマンドを実行します。
Get-RoleInstance –Curren

PowerShellウィンドウを閉じると、特定インスタンスは2~5分程度で再び、レスポンスを返すようになります。

元情報

この投稿は、Windows Azure Troubleshooting – Taking specific Windows Azure Instance offlineをざっくりと意訳した投稿です。

Windows Azure

Not enough space on the disk – Windows Azure | Matias Woloski」をざっくり意訳した投稿です。

ローカルストレージ容量が容量が少なくて、Windows Azureで容量不足が発生します。ServiceDefで容量増加をすることで簡単に解決することができます。WebDeployを使用すると度々この問題に直面します。解決方法について情報共有したいと思います。

問題

パッケージを作成する時、WebDeployがディスク容量不足の例外が発生します。

There is not enough space on the disk. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at System.IO.BinaryWriter.Write(Byte[] buffer, Int32 index, Int32 count) at Microsoft.Web.Deployment.ZipEntry.ReadFromFile(String path, Boolean shouldCompress, BinaryWriter tempWriter, Stream stream, FileAttributes attr, DateTime lastModifiedTime, String descriptor, Int64 size) at Microsoft.Web.Deployment.ZipEntry..ctor(String path, DeploymentObject source, ZipFile zipFile)