教學課程:建立自訂原則定義
自訂原則定義可讓客戶定義自己的規則,以使用 Azure。 這些規則通常會強制執行:
- 安全性做法。
- 成本管理。
- 組織特定的規則(例如命名或位置)。
無論導致客戶建立自訂原則的商務誘因是什麼,用來定義新自訂原則的步驟都一樣。
在建立自訂原則之前,請先查看原則範例中是否已有符合您需求的原則。
用來建立自訂原則的方法會遵循下列步驟:
- 識別您的商務需求
- 將每項需求與 Azure 資源屬性進行對應
- 將屬性與別名進行對應
- 決定要使用的效果
- 撰寫原則定義
必要條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
識別需求
在建立原則定義之前,請務必先了解原則的用途。 在本教學課程中,使用常見的企業安全性需求作為說明相關步驟的目標:
- 每個記憶體帳戶都必須針對 HTTPS 啟用。
- 每個記憶體帳戶都必須針對 HTTP 停用。
您的需求應該清楚地識別「要」和「不要」的資源狀態。
雖然我們定義了資源的預期狀態,但我們尚未定義我們想要使用不符合規範的資源完成的工作。 Azure 原則支援許多效果。 在本教學課程中,我們會將商務需求定義為在不符合商務規則規範時,防止資源建立。 為了達到此目標,我們會使用 拒絕 效果。 我們也想要可以暫停特定指派原則的選項。 使用停用的效果,使效果成為原則定義中的參數。
決定資源屬性
根據商務需求,Azure 原則所要稽核的 Azure 資源是儲存體帳戶。 不過,我們不知道要在原則定義中使用的屬性。 Azure 原則 會根據資源的 JSON 表示法進行評估,因此我們必須瞭解該資源上可用的屬性。
用來決定 Azure 資源屬性的方式很多。 我們在此教學課程中查看每個:
- VS Code 的 Azure 原則 延伸模組。
- Azure Resource Manager 範本 (ARM 範本)。
- 導出現有的資源。
- 建立體驗。
- 快速入門範本 (GitHub)。
- 範本參考檔。
- Azure 資源總管。
檢視 VS Code 擴充功能中的資源
VS Code 擴充功能可以用來瀏覽環境中的資源,以及檢視每個資源上的 Resource Manager 屬性。
ARM 範本
您可以透過多種方式查看包含您所要管理屬性的 ARM 範本。
入口網站中的現有資源
若要尋找屬性,最簡單的方式是查看相同類型的現有資源。 已使用所要強制執行的設定進行設定的資源,也會提供可用來比較的值。 查看 [匯出範本] 頁面,在 [設定] 中,查看該特定資源的 Azure 入口網站。
警告
Azure 入口網站所匯出的 ARM 範本無法直接插入至 deployIfNotExists 原則定義中 ARM 範本的 deployment
屬性。
對儲存體帳戶執行此操作,就會顯示類似此範例的範本:
"resources": [
{
"comments": "Generalized from resource: '/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/mystorageaccount'.",
"type": "Microsoft.Storage/storageAccounts",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"kind": "Storage",
"name": "[parameters('storageAccounts_mystorageaccount_name')]",
"apiVersion": "2018-07-01",
"location": "westus",
"tags": {
"ms-resource-usage": "azure-cloud-shell"
},
"scale": null,
"properties": {
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [],
"ipRules": [],
"defaultAction": "Allow"
},
"supportsHttpsTrafficOnly": false,
"encryption": {
"services": {
"file": {
"enabled": true
},
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
}
},
"dependsOn": []
}
]
下方 properties
是名為 supportsHttpsTrafficOnly
的值,設定為 false
。 這個屬性看起來可能是我們要尋找的屬性。 此外, type
資源的 是 Microsoft.Storage/storageAccounts
。 該類型可讓我們將原則限制為僅限此類型的資源。
在入口網站建立資源
另一種透過入口網站的方式是資源建立體驗。 當您透過入口網站建立記憶體帳戶時,[進階] 索引卷標底下的選項是 [需要安全性傳輸]。 此屬性具有 [停用] 和 [啟用] 選項。 信息圖示有更多文字可確認此選項可能是我們想要的屬性。 但入口網站不會告訴我們此畫面上的屬性名稱。
在 [檢閱 + 建立] 索引標籤上,頁面底部會有用來下載自動化的範本的連結。 選取連結就會開啟範本,以建立我們所設定的資源。 在此案例中,我們會看到兩項關鍵資訊:
...
"supportsHttpsTrafficOnly": {
"type": "bool"
}
...
"properties": {
"accessTier": "[parameters('accessTier')]",
"supportsHttpsTrafficOnly": "[parameters('supportsHttpsTrafficOnly')]"
}
...
此資訊會告訴我們屬性類型,也確認 supportsHttpsTrafficOnly
是我們正在尋找的屬性。
GitHub 上的快速入門範本
GitHub 上的 Azure 快速入門範本有數百個針對不同資源建置的 ARM 範本。 這些範本非常適合用來找出您要尋找的資源屬性。 某些屬性可能似乎是您要尋找的屬性,但控制其他屬性。
資源參考文件
若要驗證supportsHttpsTrafficOnly
是正確的屬性,請檢查記憶體提供者上記憶體帳戶資源的 ARM 範本參考。 屬性物件有一份有效參數清單。 StorageAccountPropertiesCreateParameters
選取物件連結會顯示可接受的屬性數據表。 supportsHttpsTrafficOnly
存在,且描述符合我們針對商務需求所尋找的內容。
Azure 資源總管
另一種瀏覽 Azure 資源的方式是透過 Azure 資源總管 (預覽)。 此工具會使用您訂用帳戶的內容,因此您必須使用 Azure 認證向該網站進行驗證。 通過驗證後,即可依提供者、訂用帳戶、資源群組和資源來進行瀏覽。
找出儲存體帳戶資源,並查看其屬性。 我們也在這裡看到 supportsHttpsTrafficOnly
屬性。 選取 [文件] 索引標籤,我們會看到屬性描述符合我們稍早在參考文件中找到的資訊。
尋找屬性別名
我們已識別資源屬性,但我們需要將該屬性對應至 別名。
有幾種方式可決定 Azure 資源的別名。 我們在此教學課程中查看每個:
- VS Code 的 Azure 原則 擴充功能。
- Azure CLI。
- Azure PowerShell。
取得 VS Code 擴充功能中的別名
VS Code 擴充功能的 Azure 原則擴充功能,可讓您輕鬆地瀏覽資源及探索別名。
注意
VS Code 擴充功能只會公開 Resource Manager 模式屬性,而不會顯示任何資源提供者模式屬性。
Azure CLI
在 Azure CLI 中,az provider
命令群組可用來搜尋資源別名。 我們會根據我們稍早取得的 Azure 資源詳細數據來篩選 Microsoft.Storage
命名空間。
# Login first with az login if not using Cloud Shell
# Get Azure Policy aliases for type Microsoft.Storage
az provider show --namespace Microsoft.Storage --expand "resourceTypes/aliases" --query "resourceTypes[].aliases[].name"
在結果中,我們看到名為 supportsHttpsTrafficOnly
的記憶體帳戶所支援的別名。 存在此別名表示我們可以撰寫原則來強制執行商務需求!
Azure PowerShell
在 Azure PowerShell 中,Get-AzPolicyAlias
Cmdlet 可用來搜尋資源別名。 Microsoft.Storage
根據我們稍早取得的 Azure 資源詳細數據篩選命名空間。
# Login first with Connect-AzAccount if not using Cloud Shell
# Use Get-AzPolicyAlias to list aliases for Microsoft.Storage
(Get-AzPolicyAlias -NamespaceMatch 'Microsoft.Storage').Aliases
如同 Azure CLI,結果會顯示名為 supportsHttpsTrafficOnly
的記憶體帳戶所支援的別名。
決定要使用的效果
決定要如何處理不符合規範的資源,與決定要先評估什麼資源有著幾乎一樣的重要性。 針對不符合規範的資源,其每個可能的回應稱為效果。 效果會控制不符合規範的資源是否要加以記錄、封鎖、是否有附加的資料,或是否有與其相關聯的部署,而可讓資源恢復符合規範的狀態。
在我們的範例中,是我們想要的效果, deny
因為我們不希望在 Azure 環境中建立不符合規範的資源。 稽核是原則效果的良好第一選擇,可判斷原則的效果在將它 deny
設定為 之前的效果。 若要讓變更每一指派的效果變得更容易,有一種方法是將效果參數化。 如需詳細數據,請參閱 參數 。
撰寫定義
針對我們打算管理的資源,我們現在已有其屬性詳細資料和別名。 接下來,我們會撰寫原則規則本身。 如果您不熟悉原則語言,請參閱 如何建構原則定義的原則定義結構 。 以下是原則定義外觀的空白範本:
{
"properties": {
"displayName": "<displayName>",
"description": "<description>",
"mode": "<mode>",
"parameters": {
<parameters>
},
"policyRule": {
"if": {
<rule>
},
"then": {
"effect": "<effect>"
}
}
}
}
中繼資料
前三個元件是原則的中繼資料。 由於我們知道為何要建立規則,所以為這些元件提供值並不難。 模式主要是和標記與資源位置有關。 因為我們不需要將評估限制為支援標籤的資源,請使用 的所有 值 mode
。
"displayName": "Deny storage accounts not using only HTTPS",
"description": "Deny storage accounts not using only HTTPS. Checks the supportsHttpsTrafficOnly property on StorageAccounts.",
"mode": "all",
參數
雖然我們沒有使用 參數來變更評估,但我們確實想要使用 參數來允許變更 effect
以進行疑難解答。 您可以定義 effectType
參數,並將它限制為 僅限 deny
和 disabled
。 這兩個選項符合我們的商務需求。 已完成的參數區塊如下列範例所示:
"parameters": {
"effectType": {
"type": "string",
"defaultValue": "Deny",
"allowedValues": [
"Deny",
"Disabled"
],
"metadata": {
"displayName": "Effect",
"description": "Enable or disable the execution of the policy"
}
}
},
原則規則
撰寫原則規則是建置自訂原則定義時的最後一個步驟。 我們識別出兩個要測試的語句:
- 儲存器帳戶
type
為Microsoft.Storage/storageAccounts
。 - 儲存器帳戶
supportsHttpsTrafficOnly
不是true
。
由於我們需要這兩個語句都成立,請使用allOf
邏輯運算符。 將 effectType
參數傳遞至效果,而不是建立靜態宣告。 已完成的規則如下列範例所示:
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Storage/storageAccounts"
},
{
"field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
"notEquals": "true"
}
]
},
"then": {
"effect": "[parameters('effectType')]"
}
完成的定義
原則的三個組件全都定義好之後,完成的定義如下:
{
"properties": {
"displayName": "Deny storage accounts not using only HTTPS",
"description": "Deny storage accounts not using only HTTPS. Checks the supportsHttpsTrafficOnly property on StorageAccounts.",
"mode": "all",
"parameters": {
"effectType": {
"type": "string",
"defaultValue": "Deny",
"allowedValues": [
"Deny",
"Disabled"
],
"metadata": {
"displayName": "Effect",
"description": "Enable or disable the execution of the policy"
}
}
},
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Storage/storageAccounts"
},
{
"field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
"notEquals": "true"
}
]
},
"then": {
"effect": "[parameters('effectType')]"
}
}
}
}
完成的定義可用來建立新的原則。 入口網站和每個 SDK (Azure CLI、Azure PowerShell 和 REST API) 會以不同的方式接受定義,因此請檢閱其各自的命令,以驗證正確的使用方式。 然後使用參數化的效果將其指派至適當的資源,以管理儲存體帳戶的安全性。
清除資源
如果您已完成本教學課程中的資源使用,請使用下列步驟來刪除您所建立的任何指派或定義:
選取 Azure 原則頁面左側 [製作] 下的 [定義] (如果您嘗試刪除指派,則選取 [指派])。
搜尋您要移除的新計畫或原則定義 (或指派)。
以滑鼠右鍵按一下資料列,或選取定義 (或指派) 結尾的省略符號,然後選取 [刪除定義] (或 [刪除指派])。
檢閱
在本教學課程中,您已成功完成下列工作:
- 識別您的商務需求
- 將每項需求與 Azure 資源屬性進行對應
- 將屬性與別名進行對應
- 決定要使用的效果
- 撰寫原則定義
下一步
接下來,請使用自訂原則定義來建立及指派原則: