練習 - 限制網路存取

已完成

使用者連線到您的應用程式伺服器以輸入訂單、更新其帳戶,以及執行類似的活動。 應用程式伺服器接著會以這些變更更新資料庫。 因為使用者將個人資料儲存在資料庫中,所以務必確保只允許來自受信任和所需資源的存取。 有數種方式可讓您透過網路控制對 SQL 資料庫的存取。

防火牆規則

Azure SQL Database 具有內建的防火牆,可允許和拒絕對資料庫伺服器本身以及個別資料庫的網路存取。 一開始,SQL Database 防火牆會封鎖對您 Azure SQL Database 的所有公開存取。 若要存取資料庫伺服器,您必須指定一或多個可啟用對您 Azure SQL Database 的存取的一或多個伺服器層級 IP 防火牆規則。 您必須使用 IP 防火牆規則指定允許網際網路的哪些 IP 位址範圍,以及 Azure 應用程式是否可以嘗試連線到 Azure SQL Database。

防火牆規則會在伺服器或資料庫層級設定。 這些規則會特別說明允許哪些網路資源建立與資料庫的連線。 視層級而定,您可以套用的規則如下所示:

  • 伺服器層級防火牆規則
    • 允許存取 Azure 服務
    • IP 位址規則
    • 虛擬網路規則
  • 資料庫層級防火牆規則
    • IP 位址規則

注意

SQL 資料倉儲只支援伺服器層級 IP 防火牆規則,而不支援資料庫層級 IP 防火牆規則。

進一步了解這些規則的運作方式。

伺服器層級防火牆規則

這些規則可讓用戶端存取整個 Azure SQL Server,也就是相同邏輯伺服器內的所有資料庫。 可以在伺服器層級套用三種類型的規則。

允許存取 Azure 服務規則允許 Azure 內的服務連線到您的 Azure SQL Database。 當啟用時,此設定允許來自所有 Azure 公用 IP 位址的通訊。 此通訊包括所有 Azure 平台即服務 (PaaS) 服務,例如 Azure App Service 和 Azure Container Service,以及具有連出網際網路存取的 Azure VM。 此規則可以透過入口網站 [防火牆] 窗格中的 [開啟/關閉] 選項進行設定,也可以透過將 0.0.0.0 作為起始和結束 IP 位址的 IP 規則進行設定。

Diagram shows how to allow access to Azure services network.

當 Azure 中的 PaaS 服務上執行的應用程式 (例如 Azure Logic Apps 或 Azure Functions) 需要存取您的 Azure SQL Database 時,即會使用此規則。 其中許多服務都沒有靜態 IP 位址,因此此規則要確保它們能夠連線到資料庫。

重要

這個選項會設定防火牆,以允許所有來自 Azure 的連線,包括來自其他客戶訂用帳戶的連線。 選取此選項時,請確保您的登入和使用者權限會限制為只有授權的使用者才能存取。

IP 位址規則是以特定公用 IP 位址範圍為基礎的規則。 從允許的公用 IP 範圍連線的 IP 位址都能夠連線到資料庫。

Diagram represents an IP address rule.

當您具有需要存取資料庫的靜態公用 IP 位址時,即可使用這些規則。

虛擬網路規則可讓您明確地允許來自一或多個 Azure 虛擬網路內指定子網路的連線。 虛擬網路規則可以為您的資料庫提供更好的存取控制,並且可以是慣用的選項。 由於 Azure 虛擬網路位址空間是私人的,因此您可以有效地避免暴露到公用 IP 位址,並保護您所控制的位址之連線安全。

Diagram represents a virtual network rule.

當您擁有需要存取資料庫的 Azure VM 時,請使用虛擬網路規則。

針對伺服器層級規則,所有這些規則都可以透過入口網站、PowerShell、CLI 和 Transact-SQL (T-SQL) 建立和操作。

資料庫層級防火牆規則

這些規則允許存取邏輯伺服器上的個別資料庫,並且會儲存在資料庫本身中。 針對資料庫層級規則,僅能設定 IP 位址規則。 其功能與在伺服器層級套用時的功能相同,但範圍僅限於資料庫。

Diagram represents a database IP address network rule.

資料庫層級規則的優點是其可攜性。 將資料庫複寫到另一部伺服器時,會複寫資料庫層級規則,因為它們就儲存在資料庫本身。

資料庫層級規則的缺點是您只能使用 IP 位址規則。 這些規則可能會限制您的彈性,而且可能會增加額外的系統管理負荷。

資料庫層級防火牆規則只能透過 T-SQL 建立和操作。

限制網路存取實務

以最佳做法而言,請使用資料庫層級 IP 防火牆規則來加強安全性,並讓您的資料庫更可攜。 當您有數個資料庫具有相同存取需求,因此不想花時間個別設定每個資料庫時,不妨使用系統管理員的伺服器層級 IP 防火牆規則。

了解這些規則在實務中的運作方式,以及如何保護網路存取,以便僅允許必要項目。 回想一下,您建立了 Azure SQL Database 邏輯伺服器、資料庫,以及作為應用程式伺服器的 appServer Linux VM。 當資料庫移轉至 Azure SQL Database 並且虛擬網路內的資源需要存取它時,便常常會看到這種情況。 Azure SQL Database 的防火牆功能可以在許多案例中使用,但這是一個具有實際適用性的範例,並示範了每個規則的功能。

瀏覽防火牆設定,並查看其運作方式。 您可同時使用入口網站和 Cloud Shell 進行這些練習。

您目前建立的資料庫不允許從任何連線進行存取。 此受限存取是根據您執行以建立邏輯伺服器和資料庫的命令所設計的。 確認沒有存取權。

  1. 在 Cloud Shell 中,以 SSH 連線到您的 Linux VM (若尚未連線)。 以上一個單元中的 publicIpAddress 值取代 nnn.nnn.nnn.nnn

    ssh nnn.nnn.nnn.nnn
    
  2. 重新執行您稍早擷取的 sqlcmd 命令,嘗試連線到資料庫。 請務必將 [username][password] 取代為您在上一個單元中指定的 ADMINUSER 認證。 請務必為使用者名稱和密碼加上單引號,以便殼層不會錯誤解讀任何特殊字元。

    sqlcmd -S tcp:serverNNNNN.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 入口網站

  2. 在頂端的 [搜尋資源、服務及文件] 方塊中,搜尋您的資料庫伺服器名稱 serverNNNNN。 選取 SQL Server。

  3. 在 SQL 伺服器面板左側功能窗格的 [安全性] 下,選取 [網路]

  4. 向下捲動至 [例外狀況]、選取 [允許 Azure 服務和資源存取此伺服器的] 核取方塊,然後選取 [儲存]。 等候系統認可此變更。

  5. 回到您的 SSH 工作階段中,再次嘗試連線到您的資料庫。

    sqlcmd -S tcp:serverNNNNN.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 的存取。 如果您有需要存取的較大位址區塊,則可以展開範圍。

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 命令時,第二行上的 GO 可能不會複製到 sqlcmd 提示。 您可能需要輸入這個部分。若缺乏此內容,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 入口網站中,在您 SQL 伺服器的 [網路] 窗格上,取消選取 [允許 Azure 服務和資源存取此伺服器],然後選取 [儲存]。 此變更會停用所有 Azure 服務的存取,但由於您的伺服器有資料庫層級 IP 規則,因此可保持連線。

  3. 回到 Cloud Shell,在您透過 SSH 連線的 VM 中,再次嘗試連線到您的資料庫。

    sqlcmd -S tcp:serverNNNNN.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 入口網站,在您 SQL 伺服器 [網路] 窗格的 [防火牆規則] 下,選取 [新增防火牆規則]。 將規則命名為允許 appServer、針對 [起始 IP] 與 [結束 IP] 輸入 appServer VM 的公用 IP 位址,然後選取 [確定]

  3. 選取 [儲存]。

    Screenshot of the Azure portal showing the server firewall rule creation.

  4. 回到 Cloud Shell,在您的 appServer VM 上,嘗試再次連線到您的資料庫。

    sqlcmd -S tcp:serverNNNNN.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 入口網站並仍在 [網路] 窗格上的 [虛擬網路] 下,選取 [新增虛擬網路規則]

  2. [建立/更新虛擬網路規則] 對話方塊隨即出現。 設定下列值。

    設定
    名稱 保留預設值
    訂用帳戶 指引訂用帳戶
    虛擬網路 appServerVNET
    子網路名稱 / 位址首碼 appServerSubnet / 10.0.0.0/24
  3. 選取 [啟用] 以啟用子網路上的服務端點,然後在啟用端點之後選取 [確定] 以建立規則。

  4. 移除該 IP 位址規則。 選取 [允許 appServer] 規則旁的 [...]、選取 [刪除],然後選取 [儲存]

  5. 回到 Cloud Shell,在您的 appServer VM 上,嘗試再次連線到您的資料庫。

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

    此時,您應該能夠連線。 如果成功,您會看到 sqlcmd 提示。

    1>
    

您在這裡採取的動作實際上會移除 SQL Server 的任何公用存取權。 它只允許從您定義的 Azure 虛擬網路中的特定子網路進行存取。 如果您在該子網路中新增更多應用程式伺服器,則不需要額外的設定。 該子網路中的任何伺服器都能夠連線到 SQL Server。

此設定會限制您暴露到控制範圍外的服務,而如果您要新增更多伺服器,還能簡化管理。 此方法能有效保護對 Azure SQL Database 的網路存取。