使用 Azure Private Link 或 VNet Service Endpoints 來建立私有 ACR
在現代雲端環境中,安全性 是企業最關心的議題之一,尤其是當你的 Azure Container Registry (ACR) 儲存了關鍵映像檔時,你絕對不希望它暴露在公網上,成為駭客攻擊的目標。
兩種方式讓 ACR 更安全
- Azure Private Link(推薦 ) - ACR 完全私有,封鎖所有公網流量,只允許內部 VNet 存取。
- VNet Service Endpoints - ACR 仍有公網 IP,但僅允許來自指定 VNet 的請求。
為什麼選擇 Private ACR?
- 確保 ACR 不暴露在公網上 - 預設 ACR 會有公網 IP,這是一個潛在的安全風險!
- 增強安全性,阻擋外部攻擊 - 只有內部網路能存取 ACR,提高保護級別。
- 與 AKS 無縫整合 - 確保 Kubernetes 叢集能安全拉取映像檔。
- DNS 解析更順暢 - 透過
privatelink.azurecr.io
解析內部 ACR。
🔹 選項 1:使用 Private Link(推薦 )
Private Link 讓 ACR 完全私有,不允許任何來自公網的存取。
步驟 1:建立 Private ACR
resource "azurerm_container_registry" "acr" {
name = "myprivateacr"
resource_group_name = <resource_group_name>
location = <resource_group_location>
sku = "Premium"
admin_enabled = false
public_network_access_enabled = false
}
步驟 2:建立 Private Endpoint
當使用 Azure Private Link 透過私有端點(Private Endpoint)存取 Azure Container Registry (ACR) 時,預設的 Public DNS 解析 (azurecr.io
) 將無法運作。
相對地,Azure 提供了一個 私有 DNS Zone (privatelink.azurecr.io
) 來解析 ACR 的 私有 IP。
透過 虛擬網路連結(Virtual Network Link),確保 VNet (xxx-vpc
) 內的所有資源,都能夠正確解析 ACR 的 私有 IP,而非 Public IP。
resource "azurerm_private_endpoint" "acr_pe" {
name = "acr-private-endpoint"
location = <resource_group_location>
resource_group_name = <resource_group_name>
subnet_id = azurerm_subnet.private_subnet.id
private_service_connection {
name = "acr-private-connection"
private_connection_resource_id = azurerm_container_registry.acr.id
is_manual_connection = false
subresource_names = ["registry"]
}
private_dns_zone_group {
name = "acr-dns-group"
private_dns_zone_ids = [azurerm_private_dns_zone.acr_dns.id]
}
}
# Create Private DNS Zone for ACR
resource "azurerm_private_dns_zone" "acr_dns" {
name = "privatelink.azurecr.io"
resource_group_name = <resource_group_name>
}
# Link Private DNS to VNet
resource "azurerm_private_dns_zone_virtual_network_link" "acr_dns_link" {
name = "acr-dns-vnet-link"
resource_group_name = <resource_group_name>
private_dns_zone_name = azurerm_private_dns_zone.acr_dns.name
virtual_network_id = azurerm_subnet.private_subnet.id
}
🔹 選項 2:使用 VNet Service Endpoints
如果無法使用 Private Link,可以考慮 VNet Service Endpoints,雖然仍有公網 IP,但存取權限受 VNet 限制。
步驟 1:建立 Private ACR 並啟用 VNet Service Endpoints
resource "azurerm_container_registry" "acr" {
name = "myprivateacr"
resource_group_name = local.foundation.resource_group_name
location = local.foundation.resource_group_location
sku = "Premium"
admin_enabled = false
network_rule_set {
default_action = "Deny"
virtual_network {
action = "Allow"
subnet_id = azurerm_subnet.private_subnet.id
}
}
}
哪種方式最適合你?
功能 | Private Link(推薦 ) | VNet Service Endpoints |
---|---|---|
存取方式 | 完全私有(無外網存取) | 仍使用公有 IP,但僅限 VNet 存取 |
安全性 | 🔒🔒🔒 最高 | 🔒 中等 |
效能 | 私有網路內低延遲存取 | 仍需透過 Azure Backbone |
設定難度 | 較複雜(需設定 Private Endpoint & DNS) | 較簡單 |
總結
選擇最適合你的方案:
- 如果你希望 ACR 完全私有,無外網存取 👉 選擇 Private Link
- 如果你希望 設定簡單,且可接受仍使用公有 IP 👉 選擇 VNet Service Endpoints
END
留言
張貼留言