使用 SSH 状态控制可以在 Windows Server 2025 上审核和配置 SSH 服务器安全状况。 SSH 状态控制与 Azure 治理服务(策略、计算机配置)无缝集成,以便可以:
- 确保符合 行业或组织中的 sshd 标准
- 减少基于 sshd 的远程管理的攻击面
- 确保整个车队中的 sshd 设置一致,以提高安全性和工作效率
为了帮助你演示对审核员的合规性(并帮助你根据需要采取措施),每个合规性检查都包括通过 “原因 ”字段提供的证据,这些证据指示如何确定合规性或不符合性。
可以自定义 sshd 参数(端口号、允许的组等),也可以使用策略默认值。
入门文档
- 快速入门:有关即点即用的实践体验,请参阅 快速入门:SSH 状态控制 应用于测试计算机。
- 概述和参考:有关概念信息、参考和常见问题解答,请继续 阅读本文 。
选择仅审核与审核和配置行为
分配 SSH 状态控制策略时,可以选择 仅审核 (即“审核”)行为或 审核和配置 (即“配置”)行为。
策略定义 | Azure Policy 效果 | 有关预期内容的说明 | |
---|---|---|---|
仅审核行为 | **Audit** SSH Posture Control on Windows machines |
auditIfNotExists | 与许多常用系统映像相比,该策略包含更严格的设置。 例如,拒绝根 ssh 访问。 因此,预计报告 不符合 状态。 |
审核和配置行为 | **Configure** SSH Posture Control on Windows machines |
deployIfNotExists | 如上所述,你预计最初会报告 不符合 状态。 随后,将重新配置计算机以匹配策略,从而导致最终 符合 性状态。 |
对于现有计算机,管理员通常从仅审核行为开始,以确定现有状态,并发现系统自动化允许的帐户等依赖项。 将现有机群与 SSH 状态控制默认设置进行比较后,将决定要自定义的 SSH 状态控制参数。 在此分析和规划之后,你将过渡到审核和配置行为(包括安全部署做法(如圈)。
对于绿地方案或可释放的测试计算机,可以选择跳过该分析并直接移动到审核和配置行为,从强 SSH 状态控制默认值开始全新。
谨慎
在配置任何计算机之前,请非常小心地验证新配置。 你可能会意外失去对计算机的访问权限。
意外锁定自己的示例包括:
- 应用的净授权设置(组合
allowUsers
,denyGroups
等)不允许所需的登录名 -
port
为 sshd 配置的受环境中其他控制(主机防火墙规则、网络防火墙规则等)阻止。- 为了避免超越企业团队边界,SSH 状态控制仅配置 sshd。 它当前不会尝试修改计算机防火墙规则等以适应配置的 sshd 端口。 若要与我们讨论这些方案,请与我们联系(请参阅下面的 其他资源 )。
SSH 状态控制范围:规则、默认值和自定义
下表列出了可以使用 SSH 状态控制审核或配置的项。 其中每个规则称为 规则。
大多数规则都可以通过策略分配 参数 来审核或配置和审核自定义值。 例如,如果组织中的标准是使用端口 1111(而不是 22)进行 sshd,则可以在策略分配中设置相应的参数。 这些参数具有下表中包含的标识符。 通常,短参数名称以编程方式使用(例如使用 az policy assignment create --params ...
),而较长的参数显示名称在 Azure 门户工作流中使用。
自定义值时,请注意提供与 sshd 兼容的值。 例如, allowGroups
采用以空格分隔的组名称模式列表。 有关参考信息,请参阅 sshd_config手册页。 sshd_config参考还可用于了解其他 sshd 行为,例如 允许 和 拒绝 列表相交的方式。
注释
为了保留表格布局,某些单元格值已移动到表格下方的脚注。
规则名称 | 默认值 | 参数名称 | 参数显示名称 |
---|---|---|---|
确保配置了允许的 SSH 组 | <脚注 1> | AllowGroups |
允许的组 |
确保已配置允许的 SSH 访问用户 | "" | AllowUsers |
允许的用户 |
确保配置 SSH 的身份验证方法 | 任何 | AuthenticationMethods |
身份验证方法 |
确保配置了 SSH 的拒绝组 | "" | DenyGroups |
被拒绝的组 |
确保配置了 SSH 的被拒绝用户 | "" | DenyUsers |
被拒绝的用户 |
确保配置 SSH 的日志记录消息时使用的设施代码 | LOCAL0 | SyslogFacility |
系统日志记录设施 |
确保配置 SSH MaxAuthTries | 6 | MaxAuthTries |
最大身份验证尝试次数 |
确保配置了 SSH HostKey | <脚注 2> | HostKey |
主机密钥 |
确保配置了 SSH 的授权密钥文件 | <脚注 3> | AuthorizedKeysFile |
授权密钥文件 |
确保为 SSH 配置 GSSApiAuthentication | 假 | GSSAPIAuthentication |
GSSAPI 身份验证 |
确保配置 SSH 警告横幅 | <脚注 4> | Banner |
旗帜 |
确保将适当的密码用于 SSH | aes128-ctr,aes192-ctr,aes256-ctr | Ciphers |
允许的加密 |
确保仅使用已批准的 MAC 算法 | hmac-sha2-256 | MACs |
MAC 算法 |
确保配置 SSH ClientAliveCountMax | 0 | ClientAliveCountMax |
客户端活动消息数 |
确保配置了 SSH 端口 | 22 | Port |
港口 |
确保配置 SSH LoginGraceTime | 六十 | LoginGraceTime |
登录宽限时间 |
确保配置 SSH ClientAliveInterval | 3600 | ClientAliveInterval |
客户端活动间隔 |
确保配置 SSH PermitEmptyPasswords | 假 | PermitEmptyPasswords |
空密码权限 |
表格脚注:
administrators "openssh users"
__PROGRAMDATA__/ssh/ssh_host_ecdsa_key
%programdata%/ssh/administrators_authorized_keys
#######################################################################/r/n/r/nAuthorized access only!/r/n/r/nIf you are not authorized to access or use this system, disconnect now!/r/n/r/n#######################################################################/r/n
- 注意:这会显示给最终用户, 如下所示:
####################################################################### Authorized access only! If you are not authorized to access or use this system, disconnect now! #######################################################################
其他(非 sshd)策略参数
这些额外的策略参数可在策略分配期间使用。 这些影响 Azure Policy 分配行为,而不是计算机上的 sshd 设置。
名称 | DESCRIPTION | 违约 |
---|---|---|
包括 Arc 连接的服务器 | 通过选择此选项,你同意按 Arc 连接的计算机按月收费。 | 假 |
影响 | 启用或禁用此策略的执行 | <取决于 选择仅限审核的行为与审核和配置行为> |
策略定义? 策略分配? 来宾分配? 计算机配置? 这一切如何组合在一起?
若要开始使用 SSH 状态控制,核心作是创建 策略分配。 策略分配将 策略定义 (例如,“审核 Windows 计算机的 SSH 状况控制”)链接到 范围 (例如“my_factory_3_resource_group”)。
使用系统时,你将遇到其他资源类型和术语,如下所述。
DESCRIPTION | |
---|---|
策略定义 | 在策略服务中,描述可用审核和/或配置行为的群集的抽象数据。 例如,“审核 Windows 计算机上的 SSH 状态控制”。 |
策略分配 | 将抽象策略定义链接到具体范围,例如资源组。 策略分配可以包括特定于该分配的参数和其他属性。 |
计算机配置 | 用于在 OS 级别处理审核和设置配置的 Azure 服务和代理。 |
来宾分配 | 充当策略分配、计算机和计算机配置服务之间的三向链接的资源。 策略根据需要创建和监视来宾分配资源。 有关“guest”与“machine”术语的详细信息,请参阅为什么 在位置看到术语“来宾配置”和“Automanage”? |
机器 | 已启用 Arc 的计算机或 Azure VM。 |
关于兼容性(SSH 服务器实现等)
SSH 状态控制专为 单个长时间运行的 SSH Server 实例的主流常规用途 Windows Server 方案而设计:
- 其生命周期由 init 系统(如服务控制管理器)管理
- 其行为受 sshd_config文件控制,与 OpenSSH sshd 行为一致
- 其有效配置/状态由
sshd -T
输出显示,与 OpenSSH sshd 行为一致
对于所有受支持的 OS(请参阅下文),这是默认的 SSH 服务器用例。
原则上,计算机可以具有任意数量的 SSH 服务器实例,这些实例的生存期各不相同,具体取决于任意数量的代码库,并从任意数量的位置(配置文件、命令行参数、编译时间参数等)获取其配置。 这种情况目前没有 SSH 状态控制的范围。 如果将来对此类情况感兴趣,请联系 我们 讨论。
SSH 状态控制适用于 Azure Policy 和计算机配置支持的 Windows Server 2025 计算机 -
无法保证在运行时与任何特定计算机的兼容性,因为 sysadmins 和映像生成器可以自由地从 OS 中删除组件,使文件系统是只读的,等等。
与 sshd_config Include 指令的兼容性
SSH 状态控制尝试适应和使用 Include
sshd_config中的指令,如下所示:
- 对于审核/读取作:依靠 sshd -T 反映 sshd 透视的 net 配置-考虑到任何包括。
- 对于配置/写入作:
- 将新的 SSH 状态控制特定文件链接到sshd_config(作为 Include)。 随后,将所有写入放入链接的 SSH 状态控制文件中。 这增强了系统更改的系统卫生性和可追溯性。
与 sshd_config Match 指令的兼容性
SSH 状态控制旨在审核和配置核心 sshd 行为。 它不会尝试与条件 Match
块(如果有)进行交互,这些块可以将不同的 sshd 配置应用于特定总体。
与多个sshd_config值的兼容性
SSH 状态控制不支持对规则“端口”使用多个值,即将规则“端口”设置为 22 和 33。 应将此规则配置为单个值,以确保审核和配置方案的适当功能和符合性。 允许/拒绝用户和密码等其他规则可以具有多个值,只要在单个行中添加它们。
示例:
- 现有sshd_config文件包括一行“port:22”和另一行“port:33”。
- “审核 SSH”策略用于审核预期端口值 33。
- 结果:审核可能会通过或失败不可预知。
- 建议: 不要 将此功能用于此类方案。
如何以编程方式查询结果?
使用 Azure Resource Graph(ARG)查询,可以将分配和状态数据集成到自己的工作流中。 这些示例在 PowerShell 中使用 Search-AzGraph
来执行 ARG 查询,但不需要 PowerShell。 可以从多个入口点使用 ARG,包括 Azure 门户、Azure CLI、REST 调用等。
在汇总的最高高度,可以为每个符合性状态存储桶获取计算机计数。 例如:
$machineCountsQuery = @' // SSH machine counts by compliance status 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 = @' // SSH machine level compliance 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 = @' // SSH rule level detail GuestConfigurationResources | where name contains "SecureShell" | project report = properties.latestAssignmentReport, machine = split(properties.targetResourceId,'/')[-1], lastComplianceStatusChecked=properties.lastComplianceStatusChecked | mv-expand report.resources | project machine, rule = report_resources.resourceId, ruleComplianceStatus = report_resources.complianceStatus, ruleComplianceReason = report_resources.reasons[0].phrase, lastComplianceStatusChecked '@ Search-AzGraph $settingPerRowQuery <# Sample output: machine rule ruleComplianceStatus ruleComplianceReason ------- --------------- ------ ------ sshdemovm01 Ensure that the allowed groups for SSH are configured true ["administrators","openssh users"] contains the expected values: ["administrators","openssh users"] sshdemovm01 Ensure that appropriate ciphers are used for SSH true ["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 true "%programdata%/ssh/administrators_authorized_keys" is equal to "%programdata%/ssh/administrators_authorized_keys" sshdemovm01 Ensure that the SSH ClientAliveInterval is configured true 3600 is equal to 3600 sshdemovm01 Ensure that the SSH PermitEmptyPasswords is configured true false is equal to false sshdemovm01 Ensure that the SSH port is configured true 22 is equal to 22 sshdemovm01 Ensure that the SSH MaxAuthTries is configured true 6 is equal to 6 sshdemovm01 Ensure that only approved MAC algorithms are used true ["hmac-sha2-256"] contains the expected values: ["hmac-sha2-256"] sshdemovm01 Ensure that the SSH HostKey is configured true "__PROGRAMDATA__/ssh/ssh_host_ecdsa_key" is equal to "__PROGRAMDATA__/ssh/ssh_host_ecdsa_key" sshdemovm01 Ensure that the SSH LoginGraceTime is configured true 60 is equal to 60 #>
为什么在位置看到术语“来宾配置”和“Automanage”?
计算机配置服务也称为 来宾配置 和 Automanage 计算机配置。 与服务和文档交互时,可能会遇到这些名称。 例如:
- 在本文中的 Azure Resource Graph 查询示例中,将调用
guestconfigurationresources
数据表。 - 在 Azure 门户中,用于观察结果的有用视图称为“来宾分配”。
- 在 Azure 门户中,应用相关的 VM 扩展以启用计算机配置时,扩展标题为“Automanage 计算机配置”。
出于 SSH 状态控制的目的,“来宾”和“计算机”之间没有有意义的区别。 已启用 Arc 的计算机和 Azure VM 符合条件。
内置策略定义的标识符是什么?
在某些情况下,例如使用 Azure CLI 创建策略分配,可能很有用或有必要按 ID 而不是显示名称引用策略定义。
displayName | id |
---|
|审核 Windows 计算机上的 SSH 状态控制 | ...
| | |在 Windows 计算机上配置 SSH 状态控制 | ...
|
相关资源
- 有关问题支持等,请联系Microsoft支持部门
- 若要提供反馈,请讨论功能请求等联系人:linux_sec_config_mgmt@service.microsoft.com