演習 - ネットワーク アクセスの制限

完了

ユーザーはアプリ サーバーに接続して注文を入力し、アカウントを更新し、同様のアクティビティを実行します。 アプリ サーバーは、これらの変更に応じてデータベースを更新します。 データベースに格納されている個人データがあるため、確実に信頼されているリソースと必要なリソースからのアクセスのみを許可することが重要です。 ネットワーク経由で SQL データベースへのアクセスを制御するには、いくつかの方法があります。

ファイアウォール規則

Azure SQL Database にはファイアウォールが組み込まれており、これにより、データベース サーバー自体と、個々のデータベースの両方へのネットワーク アクセスの許可と拒否を行います。 最初は、SQL Database ファイアウォールにより、Azure SQL データベースへのすべてのパブリック アクセスがブロックされます。 データベース サーバーにアクセスするには、Azure SQL Database へのアクセスを有効にするサーバー レベルの IP ファイアウォール規則を、1 つまたは複数指定する必要があります。 IP ファイアウォール規則を使用すると、インターネットからのアクセスを許可する IP アドレス範囲、および Azure アプリケーションから Azure SQL Database への接続を試みることができるかどうかを指定できます。

ファイアウォール規則は、サーバー レベルまたはデータベース レベルで構成されます。 この規則には、データベースへの接続を確立できるネットワーク リソースを具体的に示します。 レベルに応じて適用できる規則は以下のとおりです。

  • サーバー レベルのファイアウォール規則
    • Azure サービスへのアクセスを許可する
    • IP アドレス規則
    • 仮想ネットワーク規則
  • データベース レベルのファイアウォール規則
    • IP アドレス規則

Note

SQL Data Warehouse では、サーバー レベルの IP ファイアウォール規則のみがサポートされており、データベース レベルの IP ファイアウォール規則はサポートされていません。

これらの規則の機能について詳しく見ていきましょう。

サーバー レベルのファイアウォール規則

これらの規則により、クライアントから Azure SQL サーバー全体、つまり、同じ論理サーバー内のすべてのデータベースにアクセスできるようになります。 サーバー レベルで適用できる規則には、次の 3 つの種類があります。

Azure サービスへのアクセスを許可する規則では、Azure SQL Database への Azure 内のサービスの接続が許可されます。 有効な場合、この設定ではすべての Azure パブリック IP アドレスからの通信が許可されます。 この通信には、Azure App Service や Azure Container Service などの Azure のサービスとしてのプラットフォーム (PaaS) と、送信インターネット アクセスを持つ Azure VM がすべて含まれます。 この規則は、ポータル内のファイアウォール ウィンドウのオン/オフ オプションを介して、あるいは開始および終了 IP アドレスを 0.0.0.0 とする IP 規則を使用して構成できます。

図は Azure サービス ネットワークへのアクセスを許可する方法を示しています。

この規則は、Azure SQL Database へのアクセスが必要な、Azure Logic Apps や Azure Functions などの、Azure の PaaS サービスで実行されているアプリケーションがある場合に使用されます。 これらのサービスの多くには静的 IP アドレスがないため、この規則を使って、データベースに確実に接続できるようにします。

重要

このオプションでは、他のお客様のサブスクリプションからの接続を含む、Azure からのすべての接続を許可するようにファイアウォールを構成します。 このオプションを選択する場合は、サインインとユーザーのアクセス許可により、許可されているユーザーのみにアクセスが制限されていることを確認してください。

IP アドレス規則は、特定のパブリック IP アドレス範囲に基づく規則です。 許可されたパブリック IP アドレス範囲から接続する IP アドレスは、データベースへの接続が許可されます。

図は IP アドレス規則を表しています。

データベースにアクセスする必要がある静的パブリック IP アドレスがある場合、これらの規則を使用できます。

仮想ネットワーク規則では、1 つ以上の Azure 仮想ネットワーク内の指定されたサブネットからの接続を明示的に許可することができます。 仮想ネットワーク規則では、データベースへのアクセスをより詳細に制御できるので、推奨されるオプションになることもあります。 Azure 仮想ネットワーク アドレス空間はプライベートであるため、パブリック IP アドレスへの露出を効果的に排除し、制御対象のこれらのアドレスへの接続をセキュリティで保護することができます。

図は仮想ネットワーク規則を表しています。

仮想ネットワーク規則は、データベースにアクセスする必要がある Azure VM がある場合に使います。

サーバーレベルの規則の場合、このようなすべての規則は、ポータル、PowerShell、CLI、Transact-SQL (T-SQL) を使って作成および操作できます。

データベース レベルのファイアウォール規則

これらの規則では、論理サーバー上の個々のデータベースへのアクセスが許可されます。これらの規則はデータベース自体に格納されます。 データベースレベルの規則の場合、構成できるのは IP アドレス規則のみです。 これらはサーバー レベルで適用される場合と同じように機能しますが、スコープはデータベースのみとなります。

図はデータベースの IP アドレス ネットワーク規則を表しています。

データベース レベルの規則の利点は、その移植性です。 別のサーバーにデータベースをレプリケートする場合、データベースレベルの規則がレプリケートされます。これはデータベース自体に格納されているためです。

データベース レベルの規則の欠点は、使用できるのが IP アドレス規則のみとなることです。 これらの規則により、柔軟性が制限され、管理オーバーヘッドが増える可能性があります。

データベースレベルのファイアウォール規則の作成と操作には、T-SQL を使う必要があります。

実際のネットワーク アクセスを制限する

セキュリティを強化し、データベースの移植性を高めるため、ベスト プラクティスとしてデータベースレベルの IP ファイアウォール規則を使ってください。 アクセス要件が同じデータベースが複数存在し、個々のデータベースの構成に時間を費やしたくない場合は、管理者向けのサーバーレベルの IP ファイアウォール規則を使います。

これらの規則が実際にどのように機能するのかと、ネットワーク アクセスをセキュリティで保護して必要なものだけを許可する方法を見ていきましょう。 Azure SQL Database 論理サーバー、データベース、アプリケーション サーバーとして機能する appServer Linux VM を作成したことを思い出してください。 このシナリオは多くの場合、データベースが Azure SQL Database に移行され、仮想ネットワーク内のリソースからそれにアクセスする必要がある場合に発生します。 Azure SQL Database のファイアウォール機能は多くのシナリオで使用できますが、この例は実際に適用でき、各規則がどのように機能するかを示します。

ファイアウォールの設定を見て、その機能を確認しましょう。 これらの演習では、ポータルと Cloud Shell の両方を使います。

作成したデータベースでは、現在、どの接続からのアクセスも許可されません。 この制限されたアクセスは設計によるものであり、論理サーバーとデータベースを作成するために実行したコマンドに基づいています。 アクセス権がないことを確認します。

  1. Cloud Shell で、Linux VM にまだ SSH 接続していない場合は接続します。 nnn.nnn.nnn.nnn は前のユニットの publicIpAddress の値に変更します。

    ssh nnn.nnn.nnn.nnn
    
  2. 先ほど取得した sqlcmd コマンドを再実行し、データベースへの接続を試行します。 [server-name] をご自分のサーバーの名前に置き換えます。 [username][password] を、前のユニットで指定した ADMINUSER の資格情報に置き換えます。 シェルで特殊文字が誤って解釈されないように、ユーザー名とパスワードは単一引用符で囲みます。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    

    接続しようとすると、次の出力のようなエラーが表示されます。 データベースへのアクセスが許可されていないため、このような出力になるはずです。

    Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
    Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AF9.
    Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible.Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
    

接続できるようにアクセス権を付与します。

サーバー レベルの Azure サービスへのアクセスを許可する規則を使用する

VM からアウトバウンド インターネット アクセスが可能であるため、Azure サービスへのアクセスを許可する規則を使って、VM からのアクセスを許可することができます。

  1. サンドボックスをアクティブ化したときと同じアカウントを使用して、Azure portal にサインインします。

  2. 上部にある [リソース、サービス、ドキュメントの検索] ボックスで、server-name というデータベース サーバー名を検索します。 SQL サーバーを選択します。

  3. SQL サーバー ペインで、左側のメニュー ペインの [セキュリティ] にある [ネットワーク] を選択します。

  4. [例外] まで下にスクロールし、[Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] のチェックボックスをオンにして、[保存] を選択します。 この変更がシステムで認識されるまで待ちます。

  5. SSH セッションに戻り、もう一度データベースに接続してみましょう。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    

    この時点で、接続できるはずです。 成功した場合は、sqlcmd プロンプトが表示されるはずです。

    1>
    

接続は開きましたが、現在、この設定では、サブスクリプション外のリソースを含む、どの Azure リソースからのアクセスも許可されます。 このアクセスをさらに限定し、制御範囲内にあるリソースのみへのネットワーク アクセスに制限します。

データベース レベルの IP アドレス規則を使用する

データベース レベルの IP アドレス規則では、論理サーバー上の個々のデータベースへのアクセスのみが許可されることを思い出してください。 ここではそれを使って、appServer VM の静的 IP へのアクセスを許可します。

データベース レベルの IP 規則を作成するには、いくつかの T-SQL コマンドを実行する必要があります。 次の規則を使ってデータベース規則を作成します。ここでは、規則名、開始 IP アドレス、終了 IP アドレスを渡します。 開始 IP アドレスと終了 IP アドレスを同じに指定することで、アクセスを 1 つの IP に制限します。 アクセスを必要とするアドレスのブロックが大きい場合は、範囲を広げることができます。

EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '40.112.128.214', '40.112.128.214'
  1. sqlcmd プロンプトで次のコマンドを実行します。 両方の場所にある appServer VM のパブリック IP アドレスを置き換えます。

    ヒント

    次のような T-SQL コマンドを実行すると、2 行目の GOsqlcmd プロンプトにコピーされない場合があります。 場合によってはこの部分を入力する必要があります。T-SQL コマンドは GO コマンドなしには実行できないため、必ずこれを実行してください。

    EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '[From IP Address]', '[To IP Address]';
    GO
    

    コマンドが完了したら、「exit」と入力して sqlcmd を終了します。 SSH 経由で接続したままにします。

  2. Azure portal で、お使いの SQL サーバーの [ネットワーク] ペインにある [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] をオフにして、[保存] を選びます。 この変更により、すべての Azure サービスからのアクセスが無効になりますが、サーバーにはデータベースレベルの IP 規則があるため、あなたは接続できます。

  3. Cloud Shell に戻り、SSH 経由で接続している VM で、もう一度データベースに接続してみます。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    

    この時点で、接続できるはずです。 成功した場合は、sqlcmd プロンプトが表示されます。

    1>
    

データベース レベルの規則を使用することで、アクセスを明確にデータベースに分離できます。 この規則は、データベースごとに構成されたネットワーク アクセスを保持する場合に便利です。 複数のデータ ソースで同じレベルのネットワーク アクセスを共有する場合は、サーバー レベルの規則を使用してサーバー上のすべてのデータベースに同じアクセスを適用することで、管理を簡素化できます。

ユーザー レベルの IP アドレス規則を使用する

データベースレベルの規則は優れたオプションですが、appServer VM から接続する必要がある同じサーバー上に複数のデータベースがある場合はどうでしょう。 各データベースにデータベース レベルの規則を追加できますが、データベースを追加すればするほど、作業が増える可能性があります。 管理作業を減らすには、サーバーレベルの規則を使ってアクセスを許可します。これはサーバー上のすべてのデータベースに適用されます。

サーバーレベルの IP 規則を使って、接続できるシステムを制限します。

  1. 引き続き sqlcmd プロンプトで、次のコマンドを実行し、データベース レベルの IP アドレス規則を削除します。

    EXECUTE sp_delete_database_firewall_rule N'My Firewall Rule';
    GO
    

    コマンドが完了したら、「exit」と入力して sqlcmd を終了します。 SSH 経由で接続したままにします。

  2. Azure portal に戻り、SQL サーバーの [ネットワーク] ペインの [ファイアウォール規則] で、[add a firewall rule] (ファイアウォール規則の追加) を選びます。 規則に「Allow appServer」という名前を付け、[開始 IP][終了 IP]appServer VM のパブリック IP アドレスを入力して、[OK] を選択します。

  3. [保存] を選択します。

    サーバーのファイアウォール規則の作成を示す Azure portal のスクリーンショット。

  4. Cloud Shell に戻り、appServer VM で、もう一度データベースに接続してみます。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    

    この時点で、接続できるはずです。 サーバーレベルの規則では、appServer VM のパブリック IP アドレスに基づいてアクセスを許可します。 成功した場合は、sqlcmd プロンプトが表示されるはずです。

    1>
    

    exit」と入力して、sqlcmd を実行します。 SSH 経由で接続したままにします。

規則で指定した IP アドレスのみに接続を分離しました。 この分離は非常に役立ちますが、接続する必要があるシステムをさらに追加する場合、引き続き管理上の課題となる可能性があります。 また、定義した IP アドレス範囲の静的 IP または IP も必要です。

IP アドレスが動的で変化する場合は、接続を確保するために規則を更新する必要があります。 現在、appServer VM は動的 IP アドレスを使って構成されています。 この IP アドレスはどこかの時点で変化する可能性があり、変化するとすぐにアクセスは遮断されます。 次に、仮想ネットワーク規則が構成内でどのように役立つかを見てみましょう。

サーバー レベルの仮想ネットワーク規則を使用する

この場合、VM は Azure で実行されているため、サーバー レベルの仮想ネットワーク規則を使ってアクセスを分離し、今後のサービスでデータベースに簡単にアクセスできるようにすることができます。

  1. Azure portal に戻り、引き続き [ネットワーク] ペインで、[仮想ネットワーク][Add a virtual network rule] (仮想ネットワーク規則の追加) を選びます。

  2. [Create/Update virtual network rule] (仮想ネットワーク規則の作成または更新) ダイアログ ボックスが表示されます。 次の値を設定します。

    設定
    名前 既定値のままにします
    サブスクリプション コンシェルジェ サブスクリプション
    仮想ネットワーク appServerVNET
    サブネット名 / アドレス プレフィックス appServerSubnet / 10.0.0.0/24
  3. [有効化] をクリックしてサブネット上のサービス エンドポイントを有効にします。エンドポイントが有効になったら、[OK] を選択して規則を作成します。

  4. IP アドレス規則を削除します。 [アプリケーション サーバーを許可] 規則の横にある [...] を選択し、[削除] を選択して、[保存] を選択します。

  5. Cloud Shell に戻り、appServer VM で、もう一度データベースに接続してみます。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    

    この時点で、接続できるはずです。 成功した場合は、sqlcmd プロンプトが表示されます。

    1>
    

ここで行った操作により、SQL サーバーへのパブリック アクセスは実質的に削除されます。 定義した Azure 仮想ネットワーク内の特定のサブネットからのアクセスのみが許可されます。 そのサブネットにアプリ サーバーを追加する場合、追加の構成は必要ありません。 そのサブネット内のすべてのサーバーは、SQL サーバーに接続できます。

この構成により、制御スコープから外れるサービスへの露出が制限され、サーバーを追加する場合の管理が容易になります。 この方法は、Azure SQL Database へのネットワーク アクセスをセキュリティで保護するために効果的です。