通过 SSH 状态控制,可以使用熟悉的 Azure Policy 和计算机配置的工作流来:
- 确保符合行业或组织中的标准
- 减少远程管理功能的攻击面
- 确保整个车队的一致设置,以提高安全性和工作效率
SSH 状态控制还提供详细 原因 ,描述如何确定符合性或不符合性。 通过这些原因,可以更轻松地采取措施或完全记录合规性。
SSH 状态控制分析并强制实施大约 20 个 SSH 服务器 (sshd) 参数。 还可以自定义某些参数以满足你的环境。 例如,可以自定义允许 SSH 访问的用户和组,以及端口号等。
可以在审核或审核和配置模式下部署 SSH 状态控制,以审核设备群、跟踪结果,然后自动修正车队以正确的 sshd 标准。
个人预览版限制
重要
SSH 状态控制以个人预览版提供-旨在触发你和Microsoft之间的对话。
- 预览版旨在与 独立开发/测试 计算机一起使用,其中任何问题(包括无意中将自己从 SSH 访问中锁定)都不会产生重要后果。
- 预览版涉及导入策略定义,而不是从 Azure Policy 内置列表中选择它。
- 为此,我们将同时提供审核和审核和配置工作流。
- 支持的 Windows SKU 目前 仅 是 Windows Server 2025
Azure Policy 入门
此示例侧重于在 Azure Policy 中快速开始。 它简化了假设,并且不探索可能的所有内容。 例如,它使用 PolicyDefinition 中的默认 SSH 设置,而不是自定义允许的用户和组等参数。 有关 SSH 状态控制(包括设置和行为)的更全面的信息有望在近期内完成。 请注意,PowerShell 部分位于本文末尾部分。
小提示
本文中使用以下心理模型和术语。
-
PolicyDefinition :SSH 状态控制定义和元数据,如 Azure Policy 服务中所示。
-
PolicyAssignment :将 SSH 状态控制 PolicyDefinition 链接到应应用该策略的范围,例如资源组。
-
计算机 :能够由 Azure Policy 和计算机配置(即来宾配置)管理的终结点。 换句话说,已启用 Arc 的计算机或 Azure VM。
答: 先决条件
- 有权创建资源组、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 状态控制策略 PolicyDefinition
- 单击分配。
- 对于 “范围” ,请选择资源组,稍后将在其中创建新的测试计算机。
- 转到“ 参数 ”选项卡。
- 为 包括 Arc 连接的计算机选择“true”,除非专门想要排除 Arc 连接的计算机。
- 注意:如果要自定义 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 计算机配置扩展,然后选择“下一步”
- 选择 “审阅 + 创建”,然后选择 “创建”
$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. 观察符合性结果
以下步骤使你能够在不同高度查看符合性汇总:
- PolicyAssignment 的符合性
- 符合计算机和不符合的计算机数
- 最高海拔高度,特别适用于大型机队
- 按计算机符合性
- 通过设置特定计算机的符合性
小提示
首次遇到策略时,新计算机可能会被视为不合规。 策略中的默认 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团队提供反馈、功能请求等。