SSH 狀態控制可讓您使用熟悉的 Azure 原則和機器設定工作流程來:
- 確保符合產業或組織中的標準
- 減少遠端管理功能的攻擊面
- 確保整個車隊的一致設定,以確保安全性和生產力
SSH 狀態控制也提供詳細的 原因, 說明如何判斷合規性或不符合規範。 這些原因可讓您更輕鬆地採取動作或完整檔合規性。
SSH 狀態控制件會分析並強制執行大約 20 個 SSH 伺服器 (sshd) 參數。 您也可以自定義特定參數以符合您的環境。 例如,您可以自定義允許 SSH 存取的使用者和群組,以及埠號碼等等。
您可以在稽核或稽核設定模式中部署 SSH 狀態控制,以稽核裝置車隊、追蹤結果,然後自動補救車隊以適當的 sshd 標準。
私人預覽限制
這很重要
SSH 狀態控制件處於私人預覽狀態,旨在觸發您與Microsoft之間的對話框。
- 預覽適用於 與隔離的開發/測試 計算機搭配使用,其中任何問題(包括不小心將自己從 SSH 存取鎖定)都不會產生重大後果。
- 預覽牽涉到匯入原則定義,而不是從 Azure 原則內建清單中加以選擇。
- 為此,我們將同時提供稽核和稽核和設定工作流程。
- 支援的 Windows SKU 目前 只有 Windows Server 2025
開始使用 Azure 原則
此範例著重於在 Azure 原則中快速開始使用。 它會簡化假設,而且不會探索可能的所有專案。 例如,它會使用 PolicyDefinition 的預設 SSH 設定,而不是自定義參數,例如允許的使用者和群組。 SSH 狀態控制的完整資訊,包括近期預期設定和行為。 請注意,PowerShell 區段位於文章結尾的 區段中。
小提示
本文中會使用下列心理模型和術語。
-
PolicyDefinition :SSH 狀態控制定義和元數據,如 Azure 原則服務所示。
-
PolicyAssignment :將您的 SSH 狀態控制原則定義連結至應套用該原則的範圍,例如資源群組。
-
機器 :能夠由 Azure 原則和機器設定管理的端點(也稱為客體設定)。 換句話說,已啟用 Arc 的電腦或 Azure VM。
A。 必要條件
- 具有建立資源群組、VM(或 Arc 機器)、原則定義和原則指派許可權的 Azure 帳戶。
- 如需其他必要條件,請選擇您慣用的體驗:
- 已安裝下列模組的 PowerShell 環境:
- Az.ResourceGraph
- Az.Accounts
- Az.Resources
- 使用
Get-AzContext 和/或 Set-AzContext Cmdlet 來確保所需的 Azure 環境是目標。
B. 建立資源群組
- 建立資源群組。 在後續步驟中,這會用來設定原則的範圍,以及包含新的測試計算機。
$myResourceGroupName = "ssh_demo_resource_group"
$myAzureLocation = "eastus" ## Modify as needed
$myResourceGroup = New-AzResourceGroup -Name $myResourceGroupName -Location $myAzureLocation
C. 建立 PolicyDefinition
備註
在私人預覽期間需要這個額外的步驟(建立而不是只選擇 PolicyDefinition)。
僅限稽核原則:
$sshPolicyDefinitionJsonUri = "https://github.com/microsoft/osconfig/releases/download/ppe-ssh/SecureShell_Preview_AuditIfNotExists.json"
$localFilePath = "AuditSSHPolicy.json"
Invoke-WebRequest -Uri $sshPolicyDefinitionJsonUri -OutFile $localFilePath
$sshPolicyDefinitionJson = Get-Content $localFilePath -Raw
$sshPolicyDefinitionName = "[Preview] Audit SSH Posture Control policy"
$sshPolicyDefinition = New-AzPolicyDefinition -Name $sshPolicyDefinitionName -Policy $sshPolicyDefinitionJson
audit-and-configure Policy:
$sshPolicyDefinitionJsonUri = "https://github.com/microsoft/osconfig/releases/download/ppe-ssh/SetSecureShell_Preview_DeployIfNotExists.json"
$localFilePath = "ConfigureSSHPolicy.json"
Invoke-WebRequest -Uri $sshPolicyDefinitionJsonUri -OutFile $localFilePath
$sshPolicyDefinitionJson = Get-Content $localFilePath -Raw
$sshPolicyDefinitionName = "[Preview] Configure SSH Posture Control policy"
$sshPolicyDefinition = New-AzPolicyDefinition -Name $sshPolicyDefinitionName -Policy $sshPolicyDefinitionJson
D. 使用 PolicyAssignment 將 PolicyDefinition 套用至您的資源群組
謹慎
此原則會修改範圍內機器上的 sshd 設定。 這些指示可讓您將它指派給一開始空白的資源群組,稍後您將在此建立測試計算機。 如果您選擇指派給任何更廣泛的範圍,請非常小心。
- 流覽至原則 |列出 所有可用原則定義的定義頁面。
- 選取您稍早建立的 [預覽] SSH 狀態控制原則 原則定義
- 點選指派。
- 針對 [範圍 ] 選擇您稍後將建立新測試機器的資源群組。
- 繼續進行 [ 參數] 索引標籤。
- 除非您特別想要排除 Arc 連接的機器,否則請針對 [包含 Arc 連線的電腦] 選擇 [true]。
- 注意:如果您想要自定義 SSH 設定,例如允許的群組,請取消核取 [ 僅顯示參數...] 方塊,以顯示所有可用的參數。 如果您選擇指定允許或拒絕的使用者或群組,請注意您會輸入空白分隔字串,例如
userA userB。
- 繼續進行 [ 補救] 索引標籤。
- 注意:雖然此示範著重於新的計算機,但在您希望 PolicyAssignment 套用至現有機器的其他案例中,您可以核取 [ 建立補救工作] 方塊。
- 選擇 [使用系統指派的建立受控識別] 和您選擇的身分識別位置。
- 繼續 檢閱 + 建立
- 選擇 [建立] 以完成 PolicyAssignment。
僅限稽核原則:
$myResourceGroupName = "ssh_demo_resource_group"
$myAzureLocation = "eastus"
$sshPolicyDefinitionName = "[Preview] Audit SSH Posture Control policy"
$sshPolicyAssignmentName = "[Preview] Audit SSH Posture Control assignment"
$myResourceGroup = Get-AzResourceGroup -Name $myResourceGroupName
$sshPolicyDefinition = Get-AzPolicyDefinition -Name $sshPolicyDefinitionName
## Assign our new SSH policy to the resource group
$sshPolicyAssignment = New-AzPolicyAssignment -Name $sshPolicyAssignmentName -PolicyDefinition $sshPolicyDefinition -Scope $myResourceGroup.ResourceId -Location $myAzureLocation -IdentityType SystemAssigned
audit-and-configure Policy:
$myResourceGroupName = "ssh_demo_resource_group"
$myAzureLocation = "eastus"
$sshPolicyDefinitionName = "[Preview] Configure SSH Posture Control policy"
$sshPolicyAssignmentName = "[Preview] Configure SSH Posture Control assignment"
$myResourceGroup = Get-AzResourceGroup -Name $myResourceGroupName
$sshPolicyDefinition = Get-AzPolicyDefinition -Name $sshPolicyDefinitionName
## Assign our new SSH policy to the resource group
$sshPolicyAssignment = New-AzPolicyAssignment -Name $sshPolicyAssignmentName -PolicyDefinition $sshPolicyDefinition -Scope $myResourceGroup.ResourceId -Location $myAzureLocation -IdentityType SystemAssigned
E. 建立新電腦
雖然新的 PolicyAssignments 可以套用至現有的機器,但此程式最多可能需要 24 小時的時間。 在本快速入門中,我們將著重於評估新計算機。 在此範例中,我們將建立 Azure VM,但您可以視需要建立已啟用 Arc 的電腦。
- 流覽至 Azure 虛擬機 體驗。
- 建立新的 VM,確保下列屬性:
- 訂用帳戶和資源群組應符合 PolicyAssignment 的範圍。
- 映像應該是 「Windows Server 2025」。
- VM 架構應該是 x64。
- VM 名稱、大小等其他屬性可以是您偏好的任何屬性。
- 等候 VM 建立完成,然後按兩下 [移至資源] 以連線到電腦概觀頁面
- 在左側導覽中,選取 [ 身分識別 ],並確定計算機具有系統受控識別
- 在左側導覽中,選取 [ 擴充功能 + 應用程式],然後選取 [+ 新增]
- 選擇 適用於 Windows 擴充功能的 Azure Machine 組態擴充功能 ,然後選取 [ 下一步]
- 選取 [檢閱 + 建立],然後 建立
$myResourceGroupName = "ssh_demo_resource_group"
$myNameForNewVM = "sshdemovm01"
## Creates a new VM which is prepped to work with MachineConfiguration
## by having a system assigned identity and the GuestConfiguration extension
New-AzVM -Name $myNameForNewVM -ResourceGroupName $myResourceGroupName -SystemAssignedIdentity -Image "MicrosoftWindowsServer:WindowsServer:2025-datacenter:latest"
Set-AzVMExtension -ResourceGroupName $myResourceGroupName -VMName $myNameForNewVM -ExtensionType "ConfigurationforWindows" -Publisher "Microsoft.GuestConfiguration" -Name "AzurePolicyforWindows" -TypeHandlerVersion 1.0
F. 繼續前休息一下
當涉及新的 PolicyDefinitions、PolicyAssignments 和機器時,可能需要幾分鐘的時間才能達到穩定狀態。 請考慮 等待至少 30 分鐘 ,再繼續進行下一個步驟。
G. 觀察合規性結果
下列步驟可讓您在不同的高度看到合規性匯總:
- 依原則指派的合規性
- 符合規範和不相容的計算機數目
- 最高海拔高度,特別適用於大型機隊
- 依機器的合規性
- 藉由設定特定計算機的合規性
小提示
第一次遇到原則時,您的新計算機可能會判斷為不符合規範。 原則中的預設 SSH 設定比預設設定的 OS 映像更嚴格。 在另外 20 分鐘左右之後,您應該會發現您的電腦因為 SSH 狀態控制內建的補救邏輯而符合規範。
- 流覽至原則 |合規性 頁面。
- 選取 [預覽] SSH 狀態控制原則。
- 觀察報告符合規範/不符合規範的計算機數目
- 在 [資源合規性] 下,您可以看到個別計算機的狀態
- 若要向下切入至特定電腦的設定詳細資料:
- 按兩下電腦旁的 ... ,然後選擇 [ 檢視資源 ] 以連線到電腦的 [概觀] 頁面
- 在左側導覽的 [作業] 底下,按兩下 [ 組態管理 ] ([設定] 下的 [設定]
- 按兩下 [SecureShell]
- 產生的頁面會顯示組態中的每個設定,其中包含合規性的詳細數據,以及判斷合規性的方式。
若要觀察最高海拔狀態(僅機器計數),您可以使用下列專案:
$machineCountsQuery = @'
guestconfigurationresources
| where name contains "SecureShell"
| extend complianceStatus = tostring(properties.complianceStatus)
| summarize machineCount = count() by complianceStatus
'@
Search-AzGraph -Query $machineCountsQuery
<#
Sample output from an environment with two machines:
complianceStatus machineCount
---------------- ------------
Pending 1
Compliant 1
#>
若要查看機器的合規性,您可以使用下列專案:
$machinePerRowQuery = @'
guestconfigurationresources
| where name contains "SecureShell"
| project
machine = split(properties.targetResourceId,'/')[-1],
complianceStatus = properties.complianceStatus,
lastComplianceStatusChecked = properties.lastComplianceStatusChecked
'@
Search-AzGraph -Query $machinePerRowQuery
<#
Sample output:
machine complianceStatus lastComplianceStatusChecked
------- ---------------- ---------------------------
sshdemovm01 Compliant 2/15/2024 11:07:21 PM
sshdemovm02 Pending 1/1/0001 12:00:00 AM
#>
若要查看依設定的詳細數據,您可以使用下列專案:
$settingPerRowQuery = @'
guestconfigurationresources
| where name contains "SecureShell"
| extend machine = split(properties.targetResourceId,'/')[-1]
| mvexpand properties.latestAssignmentReport.resources
| mvexpand properties_latestAssignmentReport_resources.reasons
| project machine,
complianceCheck = tostring(properties_latestAssignmentReport_resources.resourceId),
complianceStatus = tostring(properties.complianceStatus),
complianceReason = tostring(properties_latestAssignmentReport_resources_reasons.phrase)
'@
Search-AzGraph $settingPerRowQuery
<#
Sample output:
machine complianceCheck complianceStatus complianceReason
------- --------------- ------ ------
sshdemovm01 Ensure that the allowed groups for SSH are configured Compliant ["administrators","openssh users"] contains the expected values: ["administrators","openssh users"]
sshdemovm01 Ensure that appropriate ciphers are used for SSH Compliant ["aes128-ctr","aes192-ctr","aes256-ctr"] contains the expected values: ["aes128-ctr","aes192-ctr","aes256-ctr"]
sshdemovm01 Ensure that the authorized key file for SSH is configured Compliant "%programdata%/ssh/administrators_authorized_keys" is equal to "%programdata%/ssh/administrators_authorized_keys"
sshdemovm01 Ensure that the SSH ClientAliveInterval is configured Compliant 3600 is equal to 3600
sshdemovm01 Ensure that the SSH PermitEmptyPasswords is configured Compliant false is equal to false
sshdemovm01 Ensure that the SSH port is configured Compliant 22 is equal to 22
sshdemovm01 Ensure that the SSH MaxAuthTries is configured Compliant 6 is equal to 6
sshdemovm01 Ensure that only approved MAC algorithms are used Compliant ["hmac-sha2-256"] contains the expected values: ["hmac-sha2-256"]
sshdemovm01 Ensure that the SSH HostKey is configured Compliant "__PROGRAMDATA__/ssh/ssh_host_ecdsa_key" is equal to "__PROGRAMDATA__/ssh/ssh_host_ecdsa_key"
sshdemovm01 Ensure that the SSH LoginGraceTime is configured Compliant 60 is equal to 60
#>
開始使用本機體驗 (PowerShell)
先決條件
若要套用基準,請確認基準已套用、移除基準,或檢視 PowerShell 中 OSConfig 的詳細合規性資訊,請使用下列索引卷標上的命令。
若要套用 SSH 案例,請執行下列命令:
Set-OSConfigDesiredConfiguration -Scenario SSH -Default
驗證
若要確認 SSH 案例已正確套用,請執行下列命令:
Get-OSConfigDesiredConfiguration -Scenario SSH
檢查合規性
若要獲取指定情境所需的設定詳細資訊,請使用以下命令。 輸出會以數據表格式顯示,其中包含組態項目的名稱、其合規性狀態,以及不符合規範的原因。
若要檢查 SSH scenairo 的合規性詳細數據,請執行下列命令:
Get-OSConfigDesiredConfiguration -Scenario SSH | ft Name, @{ Name = "Status"; Expression={$_.Compliance.Status} }, @{ Name = "Reason"; Expression={$_.Compliance.Reason} } -AutoSize -Wrap
自訂設定
若要在 SSH 案例中自訂設定,您可以使用參數 '-Name' 和 '-Value' 來設定設定:
Set-OSConfigDesiredConfiguration -Scenario SSH -Name Banner -Value "Custom Banner"
後續步驟
請連絡Microsoft小組,以提供意見反應、功能要求等。