プログラムからSQL azureのFirewallの設定を変更する方法

2010-08-08

Programmatically Changing the Firewall Settings – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL Azureは2種類のアクセス制御をしています。

  • ユーザIDとパスワードによる認証
  • IPアドレスによるアクセス制御を行うサーバ側のFirewallによるフィルタリング

SQL Azure ServerにはIPアドレスによる通信制御を行うFirewallがあります。アクセスしようとしているクライアントのIPがFirewallのアクセス許可ルールに登録されていない場合は、クライアントはSQL Azureにアクセスすることはできません。
アクセスを許可するIPを登録するには、SQL Azureポータルを使用することが一般的です。SQL Azureを使用するには、SQL AzureポータルでFirewallルールを作成する必要があります。Firewallルールを作成するまでは、クライアントはSQL Azureにアクセスすることができません。
下のスクリーンショットは、SQL AzureのFirewallルールを追加した例です。

 

Transact-SQLでFirewallルールを変更する方法

 

SQL Azureに接続して、MasterデータベースでTransact-SQLを実行することでFirewallルールを変更することができます。
システムストアドプロシージャ「sp_set_firewall_rule」を実行することでFirewallルールを追加することができます。次の例は、FirewallルールにアクセスすることができるIPアドレスを1つ追加するTransact-SQLです。

exec sp_set_firewall_rule N'Wayne Berry','206.63.251.3','206.63.251.3'

次の例は、Microsoft servicesとWindows Azureからのアクセスを許可するFirewallルールを追加するTransact-SQLです。

exec sp_set_firewall_rule N'MicrosoftServices','0.0.0.0','0.0.0.0'

Firewallルールの名前は、一意である必要があります。

Firewallルール一覧を確認するには、sys.firewall_rulesビューを参照します。

次の例は、ルール一覧を取得するTransact-SQLです。

select * from sys.firewall_rules

次のスクリーンショットは、SQL Server Management StudioでSQL Azureに接続して、コマンドを実行した結果です。

また、「sp_delete_firewall_rule」システムストアドプロシージャを使用することで、Firewallルールを削除することができます。

exec sp_delete_firewall_rule N'Wayne Berry'

 

セキュリティの考察

 

Masterデータベースに接続している間、サーバプリンシパルレベルのログインのみSQL AzureサーバのFirewallの設定をすることができます。SQL Azureポータルに管理者でログインしたときと同じ話です。

SQL Azureに接続して、sp_set_firewall_ruleなどのプロシージャを実行する前に、予め最低一つはFirewallルールを追加しておかなければなりません。

 

コマンドラインからFirewallルールを設定する方法

 

Windowsコマンドラインからsqlcmd.exeを使用してSQL Azureに対してTransact-SQLを実行することができます。

コマンドラインを使用して、Firewallルールを設定するスクリプトを実行することができます。

 

Windows AzureからFirewallルールを設定する方法

 

ADO.NETを使用して、Windows AzureからSQL Azureに対してTransact-SQLを実行することができます。つまり、Windows AzureからSQL AzureのFirewallルールを設定することができます。

Windows Azureは、Windows Azureを呼び出したクライアントのIPがわかることです。

Windows Azure webロール上のwebページを呼び出したIPを動的に、SQL AzureのFirewallルールに追加することができます。

PowerPivotまたはWinFormsのようにユーザが直接SQL Azureに接続する場合に、とても有効です。

次の例は、動的にSQL AzureのFirewallルールに動的にIPアドレスを追加している簡単な例です。

String clientIPAddress = Request.UserHostAddress;

using (SqlConnection sqlConnection = 
    new SqlConnection(ConfigurationManager.ConnectionStrings["SqlAzureMaster"].ConnectionString))
{
    sqlConnection.Open();

    using (SqlCommand sqlCommand =
        new SqlCommand("sp_set_firewall_rule", sqlConnection))
    {
        sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;

        sqlCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value 
            = clientIPAddress;
        sqlCommand.Parameters.Add("@start_ip_address", SqlDbType.VarChar).Value 
            = clientIPAddress;
        sqlCommand.Parameters.Add("@end_ip_address", SqlDbType.VarChar).Value 
            = clientIPAddress;


        sqlCommand.ExecuteNonQuery();
    }
}