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();
}
}