共用方式為


教學課程:建立自訂原則定義

自訂原則定義可讓客戶定義自己的規則,以使用 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 屬性。

Azure 入口網站中現有資源的匯出範本頁面的螢幕擷取畫面。

對儲存體帳戶執行此操作,就會顯示類似此範例的範本:

"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 參數,並將它限制為 僅限 denydisabled。 這兩個選項符合我們的商務需求。 已完成的參數區塊如下列範例所示:

"parameters": {
  "effectType": {
    "type": "string",
    "defaultValue": "Deny",
    "allowedValues": [
      "Deny",
      "Disabled"
    ],
    "metadata": {
      "displayName": "Effect",
      "description": "Enable or disable the execution of the policy"
    }
  }
},

原則規則

撰寫原則規則是建置自訂原則定義時的最後一個步驟。 我們識別出兩個要測試的語句:

  • 儲存器帳戶 typeMicrosoft.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) 會以不同的方式接受定義,因此請檢閱其各自的命令,以驗證正確的使用方式。 然後使用參數化的效果將其指派至適當的資源,以管理儲存體帳戶的安全性。

清除資源

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

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

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

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

檢閱

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

  • 識別您的商務需求
  • 將每項需求與 Azure 資源屬性進行對應
  • 將屬性與別名進行對應
  • 決定要使用的效果
  • 撰寫原則定義

下一步

接下來,請使用自訂原則定義來建立及指派原則: