教學課程:建立和管理原則來強制執行相容性

了解如何在 Azure 中建立及管理原則對於遵守您的公司標準和服務等級協定是非常重要的。 在本教學課程中,您將了解如何使用 Azure 原則在整個組織執行與建立、指派及管理原則相關的某些常見工作,例如:

  • 指派原則以針對您未來要建立的資源強制執行條件
  • 建立並指派計畫定義以追蹤多個資源的合規性
  • 解決不符合規範或遭拒絕的資源問題
  • 在整個組織中實作新原則

如果您想要指派原則以識別現有資源的目前合規性狀態,快速入門文章會說明如何執行這項操作。

必要條件

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

指派原則

強制遵守 Azure 原則的第一個步驟是制派原則定義。 原則定義定義了在何種條件下執行原則以及採取何種效果。 在此範例中,如果缺少名為從資源群組繼承標記的內建原則定義,請將指定的標記及其值從父代資源群組新增到缺少標記的新資源或更新的資源中。

  1. 移至 Azure 入口網站以指派原則。 搜尋並選取 [原則]

    Screenshot of searching for Policy in the search bar.

  2. 選取 [Azure 原則] 頁面左側的 [指派]。 指派是已獲指派在特定範圍內實施的原則。

    Screenshot of selecting the Assignments node from the Policy Overview page.

  3. 從 [原則 - 指派] 頁面的頂端中選取 [指派原則]

    Screenshot of selecting the 'Assign policy' button on the Assignments page.

  4. 在 [指派原則] 頁面和 [基本] 索引標籤上,選取省略號並選取管理群組或訂用帳戶來選取 [範圍]。 選擇性地選取資源群組。 範圍會決定在哪些資源或資源群組上強制執行原則指派。 然後,選取位於 [範圍] 分頁底部的 [選取]

    本範例會使用 Contoso 訂用帳戶。 您的訂用帳戶會有所不同。

  5. 您可以根據範圍來排除資源。 排除項目從比範圍層級低一層開始。 排除項目是選用的,因此請暫時將其留空。

  6. 選取 [原則定義] 省略符號,以開啟可用定義的清單。 您可以將原則定義 [類型] 篩選為 [內建],以檢視所有項目並閱讀其描述。

  7. 選取 [從資源群組繼承標籤 (若遺漏)]。 如果您無法立即找到它,請在搜尋方塊中鍵入繼承標籤,然後按 Enter 鍵或從搜尋方塊中進行選取。 一旦您找到並選取原則定義後,請選取 [可用的定義] 分頁底部的 [選取]

    Screenshot of the search filter while selecting a policy definition.

  8. [指派名稱] 會自動填入您選取的原則名稱,但您可加以變更。 對於本範例,請保留 [從資源群組繼承標籤 (若遺漏)]。 您也可以新增選擇性的 [描述]。 該描述會提供有關此原則指派的詳細資料。

  9. 將 [原則強制執行] 保留為 [啟用]。 當 [停用] 時,此設定會允許測試原則的結果,而不會觸發效果。 如需詳細資訊,請參閱強制模式

  10. [指派者] 會根據登入的人自動填寫。 此欄位是選用的,因此可以輸入自訂值。

  11. 選取精靈頂端的 [參數] 索引標籤。

  12. 針對 [標籤名稱],輸入 Environment

  13. 選取精靈頂端的 [補救] 索引標籤。

  14. 將 [建立補救工作] 保留為未核取狀態。 除了新的或更新的資源之外,此方塊還可讓您建立工作來改變現有的資源。 如需詳細資訊,請參閱補救資源

  15. 建立受控識別 會自動核取,因為此原則定義會使用 modify 效果。 [權限] 會根據原則定義自動設定為 [參與者]。 如需詳細資訊,請參閱受控識別補救存取控制的運作方式

  16. 選取精靈頂端的 [不符合規範的訊息] 索引標籤。

  17. 將 [不符合規範的訊息] 設定為 [此資源沒有必要的標籤]。 當資源遭拒絕或在一般評估期間資源不符合規範時,就會顯示此自訂訊息。

  18. 選取精靈頂端的 [檢閱 + 建立] 索引標籤。

  19. 檢閱您的選取項目,然後選取頁面底部的 [建立]

實作新的自訂原則

既然您已指派一個內建的原則定義,就可以使用 Azure 原則做更多的事。 接下來,建立一個新的自訂原則,透過驗證在您的環境中建立的虛擬機器 (不能是在 G系列中) 來節省成本。 這樣,每當組織中的使用者嘗試在 G 系列中建立虛擬機器時,要求都會被拒絕。

  1. 選取 Azure 原則分頁左側 [製作] 下的 [定義]

    Screenshot of the Definitions page under Authoring group.

  2. 選取分頁頂端的 [+ 原則定義]。 這個按鈕會開啟至 [原則定義] 頁面。

  3. 輸入下列資訊:

    • 原則定義儲存所在的管理群組或訂用帳戶。 使用 [定義位置] 上的省略符號加以選取。

      注意

      如果您計劃要將此原則定義套用至多個訂用帳戶,則作為位置的管理群組必須包含您要對其指派原則的訂用帳戶。 計畫定義也是如此。

    • 原則定義的名稱 - 需要不是 G 系列的 VM SKU

    • 原則定義目的的描述 – 此原則定義會強制讓此範圍中建立的所有虛擬機器,具有 G 系列以外的 SKU,以降低成本。

    • 從現有選項 (例如計算) 進行選擇,或為此原則定義建立新類別。

    • 複製下列 JSON 程式碼,然後針對您的需求進行更新:

      • 原則參數。
      • 原則規則/條件,在此情況下 – VM SKU 大小等於 G 系列
      • 原則效果,在此情況下 - [拒絕]

    JSON 看起來應該會像下面這樣。 將修改過的程式碼貼到 Azure 入口網站中。

    {
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "type",
                        "equals": "Microsoft.Compute/virtualMachines"
                    },
                    {
                        "field": "Microsoft.Compute/virtualMachines/sku.name",
                        "like": "Standard_G*"
                    }
                ]
            },
            "then": {
                "effect": "deny"
            }
        }
    }
    

    原則規則中的 field 屬性必須是支援的值。 在原則定義結構欄位上可找到完整的值清單。 可能的別名範例為 "Microsoft.Compute/VirtualMachines/Size"

    若要檢視更多的 Azure 原則範例,請參閱 Azure 原則範例

  4. 選取 [儲存]。

使用 REST API 來建立原則定義

您可以使用「適用於 Azure 原則定義的 REST API」來建立原則。 REST API 可讓您建立和刪除原則定義,以及取得現有定義的相關資訊。 若要建立原則定義,請使用下列範例:

PUT https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.authorization/policydefinitions/{policyDefinitionName}?api-version={api-version}

納入如下範例的要求內文:

{
    "properties": {
        "parameters": {
            "allowedLocations": {
                "type": "array",
                "metadata": {
                    "description": "The list of locations that can be specified when deploying resources",
                    "strongType": "location",
                    "displayName": "Allowed locations"
                }
            }
        },
        "displayName": "Allowed locations",
        "description": "This policy enables you to restrict the locations your organization can specify when deploying resources.",
        "policyRule": {
            "if": {
                "not": {
                    "field": "location",
                    "in": "[parameters('allowedLocations')]"
                }
            },
            "then": {
                "effect": "deny"
            }
        }
    }
}

使用 PowerShell 來建立原則定義

繼續進行 PowerShell 範例之前,請確定您已安裝最新版的 Azure PowerShell Az 模組。

您可以使用 New-AzPolicyDefinition cmdlet 建立原則定義。

若要從檔案建立原則定義,請將路徑傳遞至檔案。 針對外部檔案,請使用下列範例:

$definition = New-AzPolicyDefinition `
    -Name 'denyCoolTiering' `
    -DisplayName 'Deny cool access tiering for storage' `
    -Policy 'https://raw.githubusercontent.com/Azure/azure-policy-samples/master/samples/Storage/storage-account-access-tier/azurepolicy.rules.json'

針對本機檔案,請使用下列範例:

$definition = New-AzPolicyDefinition `
    -Name 'denyCoolTiering' `
    -Description 'Deny cool access tiering for storage' `
    -Policy 'c:\policies\coolAccessTier.json'

若要建立具有內嵌規則的原則定義,請使用下列範例:

$definition = New-AzPolicyDefinition -Name 'denyCoolTiering' -Description 'Deny cool access tiering for storage' -Policy '{
    "if": {
        "allOf": [{
                "field": "type",
                "equals": "Microsoft.Storage/storageAccounts"
            },
            {
                "field": "kind",
                "equals": "BlobStorage"
            },
            {
                "field": "Microsoft.Storage/storageAccounts/accessTier",
                "equals": "cool"
            }
        ]
    },
    "then": {
        "effect": "deny"
    }
}'

輸出會儲存在於原則指派期間使用的 $definition 物件中。 下列範例建立了包含參數的原則定義:

$policy = '{
    "if": {
        "allOf": [{
                "field": "type",
                "equals": "Microsoft.Storage/storageAccounts"
            },
            {
                "not": {
                    "field": "location",
                    "in": "[parameters(''allowedLocations'')]"
                }
            }
        ]
    },
    "then": {
        "effect": "Deny"
    }
}'

$parameters = '{
    "allowedLocations": {
        "type": "array",
        "metadata": {
            "description": "The list of locations that can be specified when deploying storage accounts.",
            "strongType": "location",
            "displayName": "Allowed locations"
        }
    }
}'

$definition = New-AzPolicyDefinition -Name 'storageLocations' -Description 'Policy to specify locations for storage accounts.' -Policy $policy -Parameter $parameters

使用 PowerShell 檢視原則定義

若要查看訂用帳戶中的所有原則定義,請使用下列命令:

Get-AzPolicyDefinition

它會傳回所有可用的原則定義,包括內建原則。 每個原則都以下列格式傳回:

Name               : e56962a6-4747-49cd-b67b-bf8b01975c4c
ResourceId         : /providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c
ResourceName       : e56962a6-4747-49cd-b67b-bf8b01975c4c
ResourceType       : Microsoft.Authorization/policyDefinitions
Properties         : @{displayName=Allowed locations; policyType=BuiltIn; description=This policy enables you to
                     restrict the locations your organization can specify when deploying resources. Use to enforce
                     your geo-compliance requirements.; parameters=; policyRule=}
PolicyDefinitionId : /providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c

使用 Azure CLI 來建立原則定義

您可以使用 Azure CLI 搭配 az policy definition 命令來建立原則定義。 若要建立具有內嵌規則的原則定義,請使用下列範例:

az policy definition create --name 'denyCoolTiering' --description 'Deny cool access tiering for storage' --rules '{
    "if": {
        "allOf": [{
                "field": "type",
                "equals": "Microsoft.Storage/storageAccounts"
            },
            {
                "field": "kind",
                "equals": "BlobStorage"
            },
            {
                "field": "Microsoft.Storage/storageAccounts/accessTier",
                "equals": "cool"
            }
        ]
    },
    "then": {
        "effect": "deny"
    }
}'

使用 Azure CLI 檢視原則定義

若要查看訂用帳戶中的所有原則定義,請使用下列命令:

az policy definition list

它會傳回所有可用的原則定義,包括內建原則。 每個原則都以下列格式傳回:

{
    "description": "This policy enables you to restrict the locations your organization can specify when deploying resources. Use to enforce your geo-compliance requirements.",
    "displayName": "Allowed locations",
    "id": "/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c",
    "name": "e56962a6-4747-49cd-b67b-bf8b01975c4c",
    "policyRule": {
        "if": {
            "not": {
                "field": "location",
                "in": "[parameters('listOfAllowedLocations')]"
            }
        },
        "then": {
            "effect": "Deny"
        }
    },
    "policyType": "BuiltIn"
}

建立及指派計劃定義

使用計畫定義,您可以將數個原則定義分組,以達成一個總體目標。 計畫會評估指派範圍內的資源,以符合所包含的原則。 如需計畫定義的詳細資訊,請參閱 Azure 原則概觀

建立計畫定義

  1. 選取 Azure 原則分頁左側 [製作] 下的 [定義]

    Screenshot of the Definitions page under the Authoring group.

  2. 選取分頁頂端的 [+ 計畫定義],可開啟 [計畫定義] 精靈。

    Screenshot of the initiative definition page and properties to set.

  3. 使用 [計畫位置] 省略符號,選取要儲存定義的管理群組或訂用帳戶。 如果在上一頁中,已將範圍設為單一管理群組或訂用帳戶,則 [計畫位置] 會自動填入。

  4. 輸入計畫的 [名稱] 和 [說明]

    此範例會驗證資源是否都符合保障安全的原則定義。 將計畫命名為保障安全,並將描述設為:已經建立計畫以處理與保護資源安全相關聯的所有原則定義

  5. 針對 [類別],從現有選項進行選擇,或建立新的類別。

  6. 設定計畫的版本,例如 1.0

    注意

    版本值是嚴格的中繼資料,不會用於 Azure 原則服務的更新或任何程序。

  7. 選取頁面底部的 [下一步] 或精靈頂端的 [原則] 索引標籤。

  8. 選取 [新增原則定義] 按鈕,然後瀏覽清單。 選取您要新增至此計畫的原則定義。 針對 [保障安全] 計畫,請選取原則定義資訊旁的核取方塊,以新增下列內建原則定義:

    • 允許的位置
    • 應在電腦上安裝 Endpoint Protection
    • 應使用網路安全性群組保護非網際網路對應的虛擬機器
    • 應該為虛擬機器啟用 Azure 備份
    • 應在虛擬機器上套用磁碟加密
    • 新增或取代資源上的標記 (新增此原則定義兩次)

    從清單中選取每個原則定義之後,請選取清單底部的 [新增]。 由於新增了兩次,「在資源上新增或取代標記」原則定義會各自取得不同的「參考識別碼」

    Screenshot of the selected policy definitions with their reference ID and group on the initiative definition page.

    注意

    選取一個或多個新增的原則定義,然後選取 [將選取的原則新增到群組],即可將選取的原則新增到群組。 群組必須先存在,您才可以在精靈的 [群組] 索引標籤上建立群組。

  9. 選取頁面底部的 [下一步] 或精靈頂端的 [群組] 索引標籤。 您可以從此索引標籤新增群組。在本教學課程中,我們不會新增任何群組。

  10. 選取頁面底部的 [下一步] 或精靈頂端的 [計畫參數] 索引標籤。 如果我們想要讓計畫中有一個用來傳遞至一個或多個內含原則定義的參數,此參數會在這裡定義,然後在 [原則參數] 索引標籤上使用。在本教學課程中,我們不會新增任何計畫參數。

    注意

    一旦將計畫參數儲存到計畫定義,就無法將其從計畫中刪除。 如果不再需要計畫參數,應將其從任何原則定義參數的使用中移除。

  11. 選取頁面底部的 [下一步] 或精靈頂端的 [原則參數] 索引標籤。

  12. 新增至計畫且具有參數的原則定義會顯示在方格中。 [值類型] 可以是 [預設值]、[設定值] 或 [使用計畫參數]。 如果選取了 [設定值],則會在 [值] 底下輸入相關的值。 如果原則定義上的參數具有允許值清單,則輸入方塊會是下拉式清單選取器。 如果選取 [使用計畫參數],則 [計畫參數] 索引標籤上會提供下拉式選單,而其中具有已建立的計畫參數名稱。

    Screenshot of the options for allowed values for the allowed locations definition parameter on the policy parameters tab of the initiative definition page.

    注意

    就某些 strongType 參數而言,值清單是無法自動決定的。 在這些情況下,參數資料列的右側會出現省略符號。 選取省略符號以開啟 [參數範圍 (<參數名稱>)] 分頁。 在此頁面上,請選取要用來提供值選項的訂用帳戶。 此參數範圍只會在建立計畫定義期間使用,且對於原則評估或指派的計畫範圍均無影響。

    將 [允許的位置] 的 [值類型] 設定為 [設定值],然後從下拉式清單選取 [美國東部 2]。 針對兩個 [新增或取代資源上的標記] 原則定義實例,將標記名稱參數設定為 'Env' 和 'CostCenter,並將標記值參數設為 'Test' 和 'Lab',如下所示。 將其他項目保留為 [預設值]。 在計畫中使用相同的定義兩次,但使用不同的參數,這項設定會在指派範圍內的資源上新增 'Test' 和 'Lab' 的值,或以這兩個值分別取代 'Env' 標記和 'CostCenter' 標記。

    Screenshot of the entered options for allowed values for the allowed locations definition parameter and values for both tag parameter sets on the policy parameters tab of the initiative definition page.

  13. 選取頁面底部或精靈頂端的 [檢閱 + 建立]

  14. 檢閱設定並選取 [建立]

使用 Azure CLI 來建立原則計畫定義

您可以使用 Azure CLI 搭配 az policy set-definition 命令來建立原則計畫定義。 若要建立具有現有原則定義的原則計畫定義,請使用下列範例:

az policy set-definition create -n readOnlyStorage --definitions '[
        {
            "policyDefinitionId": "/subscriptions/mySubId/providers/Microsoft.Authorization/policyDefinitions/storagePolicy",
            "parameters": { "storageSku": { "value": "[parameters(\"requiredSku\")]" } }
        }
    ]' \
    --params '{ "requiredSku": { "type": "String" } }'

使用 Azure PowerShell 建立原則計畫定義

您可以使用 Azure PowerShell 搭配 New-AzPolicySetDefinition Cmdlet 來建立原則計畫定義。 若要建立具有現有原則定義的原則計畫定義,請使用下列原則計畫定義檔案作為 VMPolicySet.json

[
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/2a0e14a6-b0a6-4fab-991a-187a4f81c498",
        "parameters": {
            "tagName": {
                "value": "Business Unit"
            },
            "tagValue": {
                "value": "Finance"
            }
        }
    },
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/464dbb85-3d5f-4a1d-bb09-95a9b5dd19cf"
    }
]
New-AzPolicySetDefinition -Name 'VMPolicySetDefinition' -Metadata '{"category":"Virtual Machine"}' -PolicyDefinition C:\VMPolicySet.json

指派計畫定義

  1. 選取 Azure 原則分頁左側 [製作] 下的 [定義]

  2. 找出您先前建立的 [保障安全] 計畫定義並加以選取。 選取分頁頂端的 [指派] 以開啟至 [保障安全:指派計畫] 分頁。

    Screenshot of the 'Assign' button on the initiative definition page.

    您也可以選取並按住 (或用滑鼠右鍵按一下) 所選的資料列,或選取資料列結尾的省略符號,以顯示快顯功能表。 然後選取 [指派]

    Screenshot of the context menu for an initiative to select the Assign functionality.

  3. 輸入下列範例資訊,以填寫 [保障安全: 指派計畫] 分頁。 您可以使用自己的資訊。

    • 範圍:儲存計劃的管理群組或訂用帳戶會成為預設值。 您可以變更範圍,將計畫指派給儲存位置內的訂用帳戶或資源群組。
    • 排除項目:設定範圍內的任何資源,以防止計畫指派套用至這些資源。
    • 計畫定義和指派名稱:保障安全 (預先填入作為所指派計畫的名稱)。
    • 描述:此計畫指派適合強制執行此原則定義群組。
    • 原則強制執行:保留為預設的 [已啟用]
    • 指派者:會自動填入登入者。 此欄位是選用的,因此可以輸入自訂值。
  4. 選取精靈頂端的 [參數] 索引標籤。 如果您已在先前的步驟中設定計畫參數,請在這裡設定一個值。

  5. 選取精靈頂端的 [補救] 索引標籤。 讓 [建立受控識別] 保持未選取狀態。 但是,當要指派的原則或計畫包含具有 deployIfNotExistsmodify效果的原則時,「必須」勾選此方塊。 因為本教學課程中所用的原則並沒有包含該效果,所以保留空白。 如需詳細資訊,請參閱受控識別補救存取控制的運作方式

  6. 選取精靈頂端的 [檢閱 + 建立] 索引標籤。

  7. 檢閱您的選取項目,然後選取頁面底部的 [建立]

檢查初始合規性

  1. 選取 Azure 原則分頁左側的 [合規性]

  2. 找出 [保障安全] 計劃。 其 [合規性狀態]可能仍然是 [未啟動]。 選取該計畫可取得指派的完整詳細資料。

    Screenshot of the Initiative compliance page showing assignment evaluations in a Not started state.

  3. 當完成計畫指派之後,合規性分頁的 [合規性狀態] 會更新為 [符合規範]

    Screenshot of the Initiative compliance page showing assignment evaluations complete and in a Compliant state.

  4. 選取計畫合規性頁面上的任何原則,即可開啟該原則的合規性詳細資料頁面。 此分頁提供資源層級上的合規性詳細資料。

使用排除來移除範圍中不符合規範或拒絕的資源

指派原則計畫來要求特定位置之後,就會拒絕在不同位置中建立的任何資源。 在本節中,您可藉由在單一資源群組上建立排除項目,以逐步解決建立資源的被拒絕要求。 排除項目會防止對該資源群組強制執行原則 (或計畫)。 在下列範例中,已排除資源群組中允許任何位置。 排除可以套用至訂用帳戶、資源群組,或個別的資源。

注意

您也可以使用原則豁免來略過資源的評估。 如需詳細資訊,請參閱 Azure 原則中的範圍

指派的原則或計劃所防止的部署可以在部署的目標資源群組上檢視:選取頁面左側的 [部署],然後選取失敗部署的 [部署名稱]。 遭拒的資源將會以 [禁止] 狀態列出。 若要確認拒絕資源的原則或計畫和指派,請在 [部署概觀] 頁面上選取 [失敗。如需詳細資訊,請按一下這裡 -> 在 [部署概觀] 頁面上。 視窗會在分頁右側開啟,並附上錯誤資訊。 [錯誤詳細資料] 之下會有相關原則物件的 GUID。

Screenshot of a failed deployment that was denied by a policy assignment.

在 Azure 原則頁面上,選取頁面左側的 [合規性],並選取 [保障安全] 原則計畫。 在此頁面上,已封鎖資源的 [拒絕] 計數會增加。 [事件] 索引標籤之下是關於嘗試建立或部署原則定義所拒絕資源的詳細資料。

Screenshot of the Events tab and policy event details on the Initiative compliance page.

在此範例中,Trent Baker 是 Contoso 的其中一個資深虛擬化專家,正在執行必要的工作。 我們需要針對例外狀況授與 Trent 一個空間。 建立新的資源群組 SQLServers_Excluded,接著會授與此群組對此原則指派的例外狀況。

使用排除項目更新指派

  1. 選取 Azure 原則分頁左側 [製作] 下的 [指派]

  2. 瀏覽所有原則指派並開啟 [保障安全] 指派。

  3. 選取省略符號並選取要排除的資源群組 (在此範例中為 LocationsExcluded),以設定 [排除]。 選取 [新增至所選範圍],然後選取 [儲存]

    Screenshot of the Exclusions option on the Initiative Assignment page to add an excluded resource group to the policy assignment.

    注意

    根據原則定義及其效果,也可將排除授與給指派範圍內資源群組中的特定資源。 由於此教學課程中使用 [拒絕] 效果,因此對已經存在的特定資源設定排除將沒有意義。

  4. 選取 [檢閱並儲存],然後選取 [儲存]

在本節中,您已在單一資源群組中建立排除項目,藉此解決了被拒絕的要求。

清除資源

如果您已處理完成本教學課程中的資源,請使用下列步驟來刪除以上建立的任何原則指派或定義:

  1. 選取 Azure 原則頁面左側 [製作] 下的 [定義] (如果您嘗試刪除指派,則選取 [指派])。

  2. 搜尋您要移除的新計畫或原則定義 (或指派)。

  3. 以滑鼠右鍵按一下資料列,或選取定義 (或指派) 結尾的省略符號,然後選取 [刪除定義] (或 [刪除指派])。

檢閱

在本教學課程中,您已成功完成下列工作:

  • 指派原則來強制執行您在未來建立的資源條件
  • 建立及指派計畫定義,以追蹤多個資源的相容性
  • 解決不相容或拒絕的資源
  • 在整個組織中實作新的原則

下一步

若要深入了解原則定義的結構,請閱讀這篇文章: