如何建立自訂電腦設定原則定義
開始之前,建議您先閱讀機器設定的概觀頁面,以及機器設定補救選項的詳細資料。
重要
Azure 虛擬機器需要機器設定延伸模組。 如果要在所有機器間大規模部署擴充功能,請指派下列原則方案:Deploy prerequisites to enable machine configuration policies on virtual machines
若要使用套用設定的機器設定套件,則 Azure VM 客體設定延伸模組 1.26.24 版或更新版本,或 Arc 代理程式 1.10.0 或更新版本,為必要項。
使用 AuditIfNotExists
或 DeployIfNotExists
的自訂機器設定原則定義處於正式發行 (GA) 支援狀態。
使用下列步驟來建立您自己的原則,以稽核合規性或管理已啟用 Azure 或 Arc 的機器狀態。
安裝 PowerShell 7 和必要的 PowerShell 模組
首先,設定機器設定製作環境,為您的作業系統和 GuestConfiguration 模組安裝必要的 PowerShell 版本。
建立並發佈機器設定套件成品
如果您尚未這麼做,請遵循如何建立自訂機器設定套件成品中的步驟,建立和發佈自訂機器設定套件。 然後遵循如何測試機器設定套件成品中的步驟,在開發環境中驗證套件。
注意
本文中的範例程式碼會參考 $contentUri
變數。 如果您使用與先前教學課程相同的 PowerShell 工作階段來建立及測試套件成品,該變數可能已經有套件的 URI。
如果您的 PowerShell 工作階段中未將 $contentUri
變數設定為套件的 URI,則必須加以設定。 此範例會使用儲存體帳戶的連接字串和 New-AzStorageContext
Cmdlet 來建立儲存體內容。 然後,這會取得已發行套件的儲存體 Blob,並使用該物件的屬性來取得內容 URI。
$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
Context = $context
Container = '<container-name>'
Blob = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri
機器設定的原則需求
原則定義 metadata 區段必須包含來賓設定服務的兩個屬性,才能自動佈建和報告機器設定指派。
category 屬性必須設定為 Guest Configuration
,且命名為 guestConfiguration 的區段必須包含機器設定指派的相關資訊。 該New-GuestConfigurationPolicy
Cmdlet 會自動建立此文字。
下列範例示範由 New-GuestConfigurationPolicy
自動建立的 metadata 區段。
"metadata": {
"category": "Guest Configuration",
"guestConfiguration": {
"name": "test",
"version": "1.0.0",
"contentType": "Custom",
"contentUri": "CUSTOM-URI-HERE",
"contentHash": "CUSTOM-HASH-VALUE-HERE",
"configurationParameter": {}
}
}
如果定義效果設定為 DeployIfNotExists
,則 then 區段必須包含機器設定指派的相關部署詳細資料。 該New-GuestConfigurationPolicy
Cmdlet 會自動建立此文字。
建立 Azure 原則定義
在完成建立並上傳機器設定自訂原則套件後,請建立機器設定原則定義。 New-GuestConfigurationPolicy
Cmdlet 會採納自訂原則套件,並建立原則定義。
該 PolicyId 參數的New-GuestConfigurationPolicy
需要唯一字串。 必須使用全域唯一識別碼 (GUID)。 針對新定義,請使用 New-GUID
Cmdlet 來產生新的 GUID。 對定義進行更新時,請針對 PolicyId 使用相同的唯一字串,以確保正確定義已更新。
New-GuestConfigurationPolicy
Cmdlet 的參數:
- PolicyId:GUID。
- ContentUri:機器設定內容套件的公用 HTTP(s) URI。
- DisplayName:原則顯示名稱。
- Description:原則描述。
- Parameter:雜湊表中提供的原則參數。
- PolicyVersion:原則版本。
- Path:建立原則定義的目的地路徑。 請勿將此參數指定為封裝本機複本的路徑。
- 平台:機器設定原則和內容套件的目標平台 (Windows/Linux)。
- Mode:(區分大小寫:
ApplyAndMonitor
、ApplyAndAutoCorrect
、Audit
) 選擇原則是否應該稽核或部署設定。 預設值為Audit
。 - 標籤:將一或多個標籤篩選新增至原則定義。
- 類別:設定原則定義中的類別元數據欄位。
- LocalContentPath:計算機組態套件檔案之
.zip
本機複本的路徑。 如果您使用使用者指派的受控識別來提供 Azure Storge Blob 的存取權,則需要此參數。 - ManagedIdentityResourceId:
resourceId
具有包含計算機組態套件檔案之 Azure 儲存體 Blob.zip
讀取許可權的使用者指派受控識別。 如果您使用使用者指派的受控識別來提供 Azure Storge Blob 的存取權,則需要此參數。 - ExcludeArcMachines:指定原則定義應該排除 Arc 機器。 如果您使用使用者指派的受控識別來提供 Azure Storge Blob 的存取權,則需要此參數。
重要
不同於 Azure VM,Arc 連線的電腦目前不支援使用者指派的受控識別。 因此,必須有 -ExcludeArcMachines
旗標,以確保從原則定義中排除這些機器。 若要讓 Azure VM 下載指派的套件並套用原則,客體設定代理程式必須是 1.29.82.0
Windows 版本或更新版本,或 Linux 版本或更新版本 1.26.76.0
。
如需有關 Mode 參數的詳細資訊,請參閱如何設定機器設定的補救選項頁面。
在指定的路徑中,建立使用自定義元件稽核的原則定義:
$PolicyConfig = @{
PolicyId = '_My GUID_'
ContentUri = $contentUri
DisplayName = 'My audit policy'
Description = 'My audit policy'
Path = './policies/auditIfNotExists.json'
Platform = 'Windows'
PolicyVersion = 1.0.0
}
New-GuestConfigurationPolicy @PolicyConfig
在指定的路徑中建立強制執行自訂元件的原則定義:
$PolicyConfig2 = @{
PolicyId = '_My GUID_'
ContentUri = $contentUri
DisplayName = 'My deployment policy'
Description = 'My deployment policy'
Path = './policies/deployIfNotExists.json'
Platform = 'Windows'
PolicyVersion = 1.0.0
Mode = 'ApplyAndAutoCorrect'
}
New-GuestConfigurationPolicy @PolicyConfig2
建立原則定義, 以使用使用者指派的受控識別來強制執行 自定義組態套件:
$PolicyConfig3 = @{
PolicyId = '_My GUID_'
ContentUri = $contentUri
DisplayName = 'My deployment policy'
Description = 'My deployment policy'
Path = './policies/deployIfNotExists.json'
Platform = 'Windows'
PolicyVersion = 1.0.0
Mode = 'ApplyAndAutoCorrect'
LocalContentPath = "C:\Local\Path\To\Package" # Required parameter for managed identity
ManagedIdentityResourceId = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}" # Required parameter for managed identity
}
New-GuestConfigurationPolicy @PolicyConfig3 -ExcludeArcMachines
注意
您可以使用 PowerShell Cmdlet 擷取受控識別 Get-AzUserAssignedIdentity
的 resorceId。
該 Cmdlet 輸出會傳回物件,其中包含原則檔案的方案顯示名稱和路徑。 建立稽核原則定義的定義 JSON 檔案名稱為 auditIfNotExists.json
,以及建立原則定義來套用設定的檔案名稱為 deployIfNotExists.json
。
使用標籤來篩選機器設定原則
在 GuestConfiguration 模組中,由 Cmdlet 所建立的原則定義可選擇性地包含標籤篩選。 New-GuestConfigurationPolicy
的 Tag 參數支援包含個別標籤項目的雜湊表陣列。 標籤會新增至原則定義的if 區段,且無法由原則指派加以修改。
以下提供篩選標籤的原則定義範例程式碼片段。
"if": {
"allOf" : [
{
"allOf": [
{
"field": "tags.Owner",
"equals": "BusinessUnit"
},
{
"field": "tags.Role",
"equals": "Web"
}
]
},
{
// Original machine configuration content
}
]
}
在自訂機器設定原則定義中使用參數
機器設定支援在執行階段覆寫 DSC 設定的屬性。 這項功能表示套件中 MOF 檔案的值不一定要被視為靜態。 覆寫值透過 Azure 原則來提供,且不會影響撰寫或編譯 DSC 設定的方式。
機器設定支援參數的下列實值型別:
- String
- 布林值
- Double
- Float
CmdletNew-GuestConfigurationPolicy
與Get-GuestConfigurationPackageComplianceStatus
包含名為 Parameters 的參數。 此參數會採納雜湊表定義,包括每個參數的所有詳細資料,並為每個檔案建立必要區段,以用於 Azure 原則定義。
下列範例會建立原則定義來稽核服務,使用者可在原則指派時從清單中進行選取。
# This DSC resource definition...
Service 'UserSelectedNameExample' {
Name = 'ParameterValue'
Ensure = 'Present'
State = 'Running'
}
# ...can be converted to a hash table:
$PolicyParameterInfo = @(
@{
# Policy parameter name (mandatory)
Name = 'ServiceName'
# Policy parameter display name (mandatory)
DisplayName = 'windows service name.'
# Policy parameter description (optional)
Description = 'Name of the windows service to be audited.'
# DSC configuration resource type (mandatory)
ResourceType = 'Service'
# DSC configuration resource id (mandatory)
ResourceId = 'UserSelectedNameExample'
# DSC configuration resource property name (mandatory)
ResourcePropertyName = 'Name'
# Policy parameter default value (optional)
DefaultValue = 'winrm'
# Policy parameter allowed values (optional)
AllowedValues = @('BDESVC','TermService','wuauserv','winrm')
})
# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
PolicyId = 'My GUID'
ContentUri = $contentUri
DisplayName = 'Audit Windows Service.'
Description = "Audit if a Windows Service isn't enabled on Windows machine."
Path = '.\policies\auditIfNotExists.json'
Parameter = $PolicyParameterInfo
PolicyVersion = 1.0.0
}
New-GuestConfigurationPolicy @PolicyParam
發佈 Azure 原則定義
最後,您可以使用 New-AzPolicyDefinition
Cmdlet 來發佈原則定義。 下列命令會將機器設定原則發佈至原則中心。
如果要執行 New-AzPolicyDefinition
命令,則需要在 Azure 中建立原則定義的存取權。
如需特定的授權需求,請參閱 Azure 原則概觀頁面。 建議的內建角色為 Resource Policy Contributor
。
New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'
或者,如果原則是「在不存在時部署」原則 (DINE),則使用此命令:
New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'
在 Azure 中建立原則之後,即可指派定義作為最後一步驟。 請參閱使用入口網站、Azure CLI 以及 Azure PowerShell 來指派定義的方法。
原則生命週期
如果您想要釋放原則定義的更新,請針對來賓設定套件和Azure 原則定義詳細資料來進行變更。
注意
機器設定所指派的version
屬性只會影響 Microsoft 所裝載的套件。 版本設定自訂內容的最佳做法是在檔案名稱中包含該版本。
首先,在執行 New-GuestConfigurationPackage
時,請指定套件名稱,使其不同於舊版。 您可以在名稱中包含版本號碼,例如PackageName_1.0.0
。 此範例中的數位只用來讓套件成為唯一,而非指定套件應該視為較新或較舊套件。
其次,請依照下列每項說明來更新 CmdletNew-GuestConfigurationPolicy
所使用的參數。
- Version:執行
New-GuestConfigurationPolicy
Cmdlet 時,您必須指定大於目前發佈的版本號碼。 - contentUri:當您執行
New-GuestConfigurationPolicy
Cmdlet 時,您必須指定封裝位置的 URI。 在檔案名稱中包含套件版本,可確保每個版本中此屬性的值都會變更。 - contentHash:
New-GuestConfigurationPolicy
Cmdlet 會自動更新此屬性。 此為New-GuestConfigurationPackage
所建立套件的雜湊值。 針對您發佈的.zip
檔案而言,此屬性必須是正確的。 如果只更新 contentUri 屬性,則延伸模組會拒絕內容套件。
發行更新套件的最簡單方式就是重複本文中所述程序,並指定更新的版本號碼。 此程序可確保所有屬性都已正確更新。
下一步
- 使用 Azure 入口網站指派您的自訂原則定義。
- 了解如何檢視機器設定的合規性詳細資料原則指派。