限制 Azure 中的跨租使用者私人端點連線

客戶越來越多地在其租使用者中使用私人端點,以私下且安全地連線到其 Azure 平臺即服務 (PaaS) 服務。 私人端點可以連線到跨 Microsoft Entra 租使用者的服務。 為了符合安全性與合規性,您可能需要封鎖私人端點上的跨 Microsoft Entra 租使用者連線。 本指南說明建議的設定選項,以限制或防止跨租使用者私人端點連線。 這些選項可協助您在 Azure 環境中建立資料外泄防護 (DLP) 控制項。

私人端點簡介

使用私人端點,使用現有的網路周邊來控制 Azure 環境內的流量。 但在某些情況下,您必須只在公司 Microsoft Entra 租使用者內保留私人端點連線。 下列範例顯示可能會造成安全性風險的連線。

  • 連線 A: Rogue 系統管理員會在客戶虛擬網路上建立私人端點。 這些端點會連結至裝載于客戶環境外部的服務,例如另一個 Microsoft Entra 租使用者。
  • 連線ion B: Rogue 系統管理員會在其他 Microsoft Entra 租使用者中建立私人端點,以連結到客戶 Microsoft Entra 租使用者中裝載的服務。

Diagram that shows cross-tenant private endpoint connection scenarios.

圖 1:私人端點跨租使用者案例的圖例。

針對這兩種情況,您會指定服務的資源識別碼,並手動核准私人端點連線。 使用者也需要角色型存取控制 (RBAC) 存取權來執行這些動作。

圖 1 中的連線 C 和 D 顯示客戶通常想要允許的案例。 私人端點連線會保留在公司 Microsoft Entra 租使用者內。 它們不代表安全性風險,因此本文並未涵蓋這兩種案例。

下列資訊可讓您選擇防止在 Microsoft Entra 租使用者之間布建私人端點。

拒絕連結到其他租使用者服務的私人端點

案例一 :流氓系統管理員需要客戶 Microsoft Entra 租使用者中訂用帳戶中的下列許可權。

  • 子網上的 Microsoft.Network/virtualNetworks/join/action 許可權,並將 privateEndpointNetworkPolicies 設定為 Disabled
  • Microsoft.Network/privateEndpoints/write 存取客戶環境中的資源群組。

透過這些許可權,Rogue 系統管理員可以在客戶的 Microsoft Entra 租使用者中建立私人端點。 此私人端點會連結到個別訂用帳戶和 Microsoft Entra 租使用者中的服務。 圖 1 將此案例顯示為連線 A。

在此案例中,使用者會設定外部 Microsoft Entra 租使用者和 Azure 訂用帳戶。 接下來,他們會手動指定服務的資源識別碼,在客戶環境中建立私人端點。 最後,Rogue 系統管理員會核准連結服務上裝載于外部 Microsoft Entra 租使用者中的私人端點,以允許透過連線的流量。

在 Rogue 系統管理員核准私人端點連線之後,公司資料就可以從公司虛擬網路複製到外部 Microsoft Entra 租使用者的 Azure 服務。 只有在使用 Azure RBAC 授與存取權時,才會發生此安全性風險。

案例一的風險降低

使用下列 Azure 原則 ,自動封鎖在連結到外部 Azure 服務的公司 Microsoft Entra 租使用者中建立私人端點的能力。

"if": {
    "allOf": [
        {
            "field": "type",
            "equals": "Microsoft.Network/privateEndpoints"
        },
        {
            "anyOf": [
                {
                    "count": {
                        "field": "Microsoft.Network/privateEndpoints/manualprivateLinkServiceConnections[*]",
                        "where": {
                            "allOf": [
                                {
                                    "field": "Microsoft.Network/privateEndpoints/manualprivateLinkServiceConnections[*].privateLinkServiceId",
                                    "notEquals": ""
                                },
                                {
                                    "value": "[split(concat(first(field('Microsoft.Network/privateEndpoints/manualprivateLinkServiceConnections[*].privateLinkServiceId')), '//'), '/')[2]]",
                                    "notEquals": "[subscription().subscriptionId]"
                                }
                            ]
                        }
                    },
                    "greaterOrEquals": 1
                },
                {
                    "count": {
                        "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*]",
                        "where": {
                            "allOf": [
                                {
                                    "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].privateLinkServiceId",
                                    "notEquals": ""
                                },
                                {
                                    "value": "[split(concat(first(field('Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].privateLinkServiceId')), '//'), '/')[2]]",
                                    "notEquals": "[subscription().subscriptionId]"
                                }
                            ]
                        }
                    },
                    "greaterOrEquals": 1
                }
            ]
        }
    ]
},
"then": {
    "effect": "Deny"
}

此原則會拒絕在連結服務訂用帳戶外部建立的任何私人端點,例如連線 A 和 D。此原則也提供使用 manualPrivateLinkServiceConnectionsprivateLinkServiceConnections 的彈性。

您可以更新此原則,讓私人端點只會在一組特定訂用帳戶中建立。 您可以藉由新增 list 參數並使用 建構來進行 "notIn": "[parameters('allowedSubscriptions')]" 這項變更。 但不建議使用此方法,因為這表示您必須持續維護此原則的訂用帳戶清單。 每當租使用者內建立新的訂用帳戶時,都必須將訂用帳戶識別碼新增至 參數。

請改為將原則指派給最上層管理群組,然後在需要時使用豁免。

案例一的考慮

此原則會封鎖建立與服務本身不同訂用帳戶的私人端點的能力。 如果某些使用案例需要這些端點,請使用原則豁免。 為 Data Factory 和 Azure Synapse 建立更多原則,以確保受控虛擬網路上裝載的受控私人端點只能連線到 Microsoft Entra 租使用者中裝載的服務。

拒絕從其他租使用者中建立的私人端點連線

案例二 :惡意系統管理員需要 客戶環境中應建立私人端點的服務寫入權限。

透過此許可權,Rogue 系統管理員可以在外部 Microsoft Entra 租使用者和訂用帳戶中建立私人端點。 此端點會連結到客戶 Microsoft Entra 租使用者中的服務。 圖 1 將此案例顯示為連線 B。

在此案例中,Rogue 系統管理員必須先設定外部私人 Microsoft Entra 租使用者和 Azure 訂用帳戶。 接下來,他們會手動指定公司 Microsoft Entra 租使用者中服務的資源識別碼和群組識別碼,以在其環境中建立私人端點。 最後,他們會核准連結服務上的私人端點,以允許跨 Microsoft Entra 租使用者的連線流量。

在 Rogue 系統管理員或服務擁有者核准私人端點之後,會從外部虛擬網路存取資料。

案例 2 的風險降低

使用服務特定原則來防止整個客戶租使用者發生此案例。 私人端點連線是個別服務的子資源,並顯示在其屬性區段底下。 使用下列 原則定義 來拒絕不符合規範的連線:

"if": {
    "allOf": [
        {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts/privateEndpointConnections"
        },
        {
            "field": "Microsoft.Storage/storageAccounts/privateEndpointConnections/privateLinkServiceConnectionState.status",
            "equals": "Approved"
        },
        {
            "anyOf": [
                {
                    "field": "Microsoft.Storage/storageAccounts/privateEndpointConnections/privateEndpoint.id",
                    "exists": false
                },
                {
                    "value": "[split(concat(field('Microsoft.Storage/storageAccounts/privateEndpointConnections/privateEndpoint.id'), '//'), '/')[2]]",
                    "notEquals": "[subscription().subscriptionId]"
                }
            ]
        }
    ]
},
"then": {
    "effect": "Deny"
}

此原則會顯示Azure 儲存體的範例。 針對其他服務複寫相同的原則定義,例如 金鑰保存庫 認知服務和 SQL Server 。 請注意,Azure App 服務目前不支援此風險降低。

若要進一步改善管理性,請將服務特定原則組合成方案。 此原則會拒絕對個別服務訂用帳戶外部裝載的私人端點私人端點連線核准。 它不會拒絕拒絕或移除私人端點連線,這是客戶想要的行為。 自動核准工作流程,例如連線 C,不受此原則影響。

但入口網站內相容私人端點連線的核准會遭到使用此方法封鎖。 之所以發生此區塊,是因為入口網站 UI 不會在其承載中傳送連線私人端點的資源識別碼。 建議您使用 Azure Resource Manager Azure PowerShell Azure CLI 來核准私人端點連線。

此外,將原則指派給最上層管理群組,並在需要時使用豁免。

案例 2 的考慮

Azure Synapse Analytics 和 Azure Data Factory 提供受控虛擬網路和受控私人端點。 由於這些新功能,原則會封鎖這些服務的安全和私用。

建議您在案例兩種 風險 降低的原則定義中使用 稽核 效果,而不是 拒絕 效果。 這項變更可協助您追蹤在不同訂用帳戶和租使用者中建立的私人端點。 您也可以針對個別的資料平臺範圍使用原則豁免。

Azure Data Factory

若要克服 Azure Data Factory 受控虛擬網路上的案例, 請使用下列 原則定義

"if": {
    "allOf": [
        {
            "field": "type",
            "equals": "Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints"
        },
        {
            "anyOf": [
                {
                    "field": "Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints/privateLinkResourceId",
                    "exists": false
                },
                {
                    "value": "[split(field('Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints/privateLinkResourceId'), '/')[2]]",
                    "notEquals": "[subscription().subscriptionId]"
                }
            ]
        }
    ]
},
"then": {
    "effect": "[parameters('effect')]"
}

此原則會拒絕連結到 Data Factory 訂用帳戶外部之服務的受控私人端點。 您可以變更此原則,以允許連線到一組訂用帳戶中裝載的服務,方法是新增 list 參數,以及使用 "notIn": "[parameters('allowedSubscriptions')]" 建構。 針對具有受控虛擬網路和受控私人端點的服務廣泛使用的租使用者或環境內的資料平臺範圍,建議您進行這項變更。

建議您將此原則指派給最上層管理群組,並視需要使用豁免。 針對資料平臺,進行這些變更,並將原則指派給一組資料平臺訂用帳戶。

Azure Synapse

Azure Synapse 也會使用受控虛擬網路。 我們建議將類似的原則套用至案例一 Data Factory 原則。 Azure Synapse 不提供受控私人端點的原則別名。 但是有一個資料外泄防護功能,可以使用下列原則針對工作區強制執行此功能:

"if": {
    "allOf": [
        {
            "field": "type",
            "equals": "Microsoft.Synapse/workspaces"
        },
        {
            "anyOf": [
                {
                    "field": "Microsoft.Synapse/workspaces/managedVirtualNetworkSettings.preventDataExfiltration",
                    "exists": false
                },
                {
                    "field": "Microsoft.Synapse/workspaces/managedVirtualNetworkSettings.preventDataExfiltration",
                    "notEquals": true
                },
                {
                    "count": {
                        "field": "Microsoft.Synapse/workspaces/managedVirtualNetworkSettings.allowedAadTenantIdsForLinking[*]",
                        "where": {
                            "field": "Microsoft.Synapse/workspaces/managedVirtualNetworkSettings.allowedAadTenantIdsForLinking[*]",
                            "notEquals": "[subscription().tenantId]"
                        }
                    },
                    "greaterOrEquals": 1
                }
            ]
        }
    ]
},
"then": {
    "effect": "Deny"
}

此原則會強制使用 Azure Synapse 的資料外泄功能。 使用 Azure Synapse,您可以拒絕來自客戶租使用者外部所裝載之服務的任何私人端點。 您也可以拒絕裝載在一組指定租使用者識別碼之外的任何私人端點。 此原則只允許建立連結至客戶租使用者中裝載之服務的受控私人端點。

這些原則現在可供內建使用。

  • Azure Synapse 工作區應該只允許輸出資料流量進入已核准的目標。

    定義識別碼: /providers/Microsoft.Authorization/policyDefinitions/3484ce98-c0c5-4c83-994b-c5ac24785218

  • Azure Synapse 受控私人端點應該只會連線到已核准 Microsoft Entra 租使用者中的資源。

    定義識別碼: /providers/Microsoft.Authorization/policyDefinitions/3a003702-13d2-4679-941b-937e58c443f0

建議您將原則指派給最上層管理群組,並在需要時使用豁免。

下一步

請務必瞭解對公用網際網路進行輸入和輸出連線的建議連線模型。 下一篇文章會檢閱設計考慮、設計建議和建議內容,以供進一步閱讀。