透過程式設定 Verizon CDN 節點 IP 到儲存體防火牆

  • 54
  • 0

之前在「Azure CDN from Verizon 實做 signed cookies 驗證」透過 cookies 來驗證 signed 的 token,但是在安全性上還有一個隱藏的問題會導致要保護的檔案會公開在網路上,因為 Verizon 並非 Azure 原生的服務,所以在預設上 Verizon 的 CDN 節點是會被儲存體的安全性擋住的,所以為了 CDN 會需要設定儲存體是允許匿名的,雖然檔案基本上是透過 CDN 並且有 signed cookies 來做保護,但是如果儲存體的位置被知道,還是會被直接的存取,這樣也留了一個安全性的漏洞,這次要針對這個問題透過程式來取得 Verizon 的節點 IP 並且設定到儲存體的允許清單內。

前言

之前在「Azure CDN from Verizon 實做 signed cookies 驗證」透過 cookies 來驗證 signed 的 token,但是在安全性上還有一個隱藏的問題會導致要保護的檔案會公開在網路上,因為 Verizon 並非 Azure 原生的服務,所以在預設上 Verizon 的 CDN 節點是會被儲存體的安全性擋住的,所以為了 CDN 會需要設定儲存體是允許匿名的,雖然檔案基本上是透過 CDN 並且有 signed cookies 來做保護,但是如果儲存體的位置被知道,還是會被直接的存取,這樣也留了一個安全性的漏洞,這次要針對這個問題透過程式來取得 Verizon 的節點 IP 並且設定到儲存體的允許清單內。

實做

實做上分做兩個步驟,一個是取得 Verizon CDN 節點 IP 清單,一個是設定儲存體安全性 IP 的白名單,這邊透過微軟的 Microsoft.Azure.Management.Fluent 來實做程式,取得 oAuth Token 也沒有特別的說明,因為要說明可能要花比較大的篇幅說明取得跟設定的流程,之後有機會再特別寫一篇來說明。

首先 NuGet 安裝套件 Microsoft.Azure.Management.Fluent ,在使用這套件最開始都是都先取得 IAzure 物件。

string tenantID = "{Your Tenant ID}";
string token = "{Your Token}";
string subscriptionID = "{Your Subscription ID}";

var tokenCredentials = new TokenCredentials(token);
var azureCredentials = new AzureCredentials(tokenCredentials, tokenCredentials, tenantID,
 AzureEnvironment.AzureGlobalCloud);
RestClient client = RestClient.Configure()

	.WithEnvironment(AzureEnvironment.AzureGlobalCloud)

	.WithCredentials(azureCredentials)

	.Build();

IAzure managementAPI = Azure.Authenticate(client, tenantID).WithSubscription(subscriptionID);

取得 Verizon EdgeNode IP,這邊先取得 EdgeNode 回傳的物件,然後只取 Premium Verizon 的資料,然後取得 IPv4 作為後面的設定使用。

var edgeNodes = managementAPI.ListEdgeNodes();
var ipv4Addresses = edgeNodes.Where(x => x.Name == "Premium_Verizon").First().IpAddressGroups.First().Ipv4Addresses;

針對取得的 IP 設定到儲存體的防火牆設定,就是很簡單的針對儲存體設定 IP 範圍,底下程式碼也把移除的方法列上去供大家參考。

foreach (var ipv4Address in ipv4Addresses)
{
	managementAPI.StorageAccounts.GetByResourceGroup("{ResourceGroup}", "{ResourceName}").Update()
		.WithAccessFromIpAddress($"{ipv4Address.BaseIpAddress}/{ipv4Address.PrefixLength}")
		//.WithoutIpAddressAccess($"{ipv4Address.BaseIpAddress}/{ipv4Address.PrefixLength}")	// 移除設定的 IP
		Apply();
}

針對取得 EdgeNode IP,如果要透過 Rest API 來取得可以參考官方的「取出 Azure CDN 的目前 POP IP 清單」文件,裡面除了提到 Verizon 的 EdgeNode IP 的取得,也有說明微軟自己的 CDN 的 IP 如何取得,有需要的朋友可以參考看看。

結論

本文有兩個重點,一個是如何取得 CDN 的節點 IP,另一個則是如何設定儲存體的防火牆設定。

取得 CDN 節點的 IP 對於後端來源位置的安全性設定是很重要的資訊,不僅是像本文設定在儲存體上,如果是公司內部的機器,需要特別設定防火牆時候,也是很有幫助的,官方建議上則是至少一天更新一次,以確認防火牆的設定會是最新的資訊。

針對儲存體的防火牆,雖然例外狀況有支援 Azure 服務,但是能支援的服務有限,所以很多時候還是得自行設定,但是對於像 CDN 這樣的服務有很多節點的 IP 需要設定,不太可能每次都透過 Azure Portal 來設定,還是需要透過程式加上排程來自動化處理。

整體程式碼並不難,不過因為 Fluent 相關的文件不多,也花了點時間嘗試,而官方的套件對於 C# 的開發者,可以節省很多時間去呼叫 Rest API 和定義回傳物件的模型,微軟都以經幫我們實做好了,只需要呼叫即可,對於 Azure 管理的開發真的簡單不少,後面應該會有更多機會透過這個套件來實做一些服務的管理。

參考資料