什么是 SSH 状态控制?

通过 SSH 状态控制,可以在支持的 Linux 发行版(包括 Ubuntu、Red Hat、Azure Linux 等)上审核和配置 SSH 服务器安全状况。 SSH 状态控制与 Azure 治理服务(策略、计算机配置)无缝集成,以便可以:

  • 确保行业或组织中的 sshd 标准的合规性
  • 减少基于 sshd 的远程管理的攻击面
  • 确保在整个车队中设置一致的 sshd,以提高安全性和工作效率

显示符合 SSH 检查列表的 屏幕截图

为了帮助你证明对审核员的符合性(并帮助你根据需要采取行动),每个合规性检查都包括通过 原因 字段提供的证据,这些证据指示如何确定合规性或不符合性。

可以自定义 sshd 参数(端口号、允许的组等),或使用与 Linux 的 Azure 安全基线一致的策略默认值。

入门文档

选择仅审核与审核和配置行为

分配 SSH 状态控制策略时,可以选择 仅审核(即“审核”)行为或 审核和配置(即“配置”)行为。

策略定义 Azure Policy 效果 有关预期内容的说明
仅限审核的行为 **Audit** SSH Posture Control on Linux machines auditIfNotExists 与许多常用系统映像相比,该策略包含更严格的设置。 例如,拒绝根 ssh 访问。 因此,预计报告 不符合 状态。
审核和配置行为 **Configure** SSH Posture Control on Linux machines deployIfNotExists 如上所述,你会看到最初报告的 不符合 状态。 随后,将重新配置计算机以匹配策略,最终 合规 状态。

对于现有计算机,管理员通常从仅审核行为开始,以确定现有状态,并发现系统自动化允许的帐户等依赖项。 将现有机群与 SSH 状态控制默认设置进行比较后,将决定要自定义的 SSH 状态控制参数。 在此分析和规划之后,你将过渡到审核和配置行为(包括安全部署做法(如圈)。

对于绿地方案或可释放的测试计算机,可以选择跳过该分析并直接移动到审核和配置行为,从强 SSH 状态控制默认值开始全新。

谨慎

在配置任何计算机之前,请非常小心地验证新配置。 你可能会意外失去对计算机的访问权限。

意外锁定自己的示例包括:

  • 应用的净授权设置(allowUsersdenyGroupspermitRootLogin等的组合)不允许所需的登录名
  • 为 sshd 配置的 port 受环境中其他控制(SELinux 策略、主机防火墙规则、网络防火墙规则等)阻止。
    • 请注意,默认情况下,许多 Red Hat 系列发行版都有 SELinux 策略,阻止 sshd 使用除 22 以外的端口。
    • 为了避免超越企业团队边界,SSH 状态控制仅配置 sshd。 它当前不会尝试修改计算机 SELinux 策略、防火墙规则等以适应配置的 sshd 端口。 若要与我们讨论这些方案,请与我们联系(请参阅下面的 其他资源)。

SSH 状态控制范围:规则、默认值和自定义

下表列出了可以使用 SSH 状态控制审核或配置的项。 其中每个规则称为 规则

每个规则都有一个默认配置值,与适用于 Linux 的 Azure 安全基线保持一致。

大多数规则都可以通过策略分配 参数 来审核或配置和审核的自定义值。 例如,如果组织中的标准是使用端口 1111(而不是 22)进行 sshd,则可以在策略分配中设置相应的参数。 这些参数具有下表中包含的标识符。 通常,短参数名称以编程方式使用(例如使用 az policy assignment create --params ...),而较长的参数显示名称在 Azure 门户工作流中使用。

自定义值时,请注意提供与 sshd 兼容的值。 例如,allowGroups 采用以空格分隔的组名称模式列表。 有关参考信息,请参阅 sshd_config 手册页。 sshd_config参考还可用于了解其他 sshd 行为,例如 如何允许拒绝 列表相交。

注意

为了保留表格布局,某些单元格值已移动到表格下方的脚注。

规则名称 默认值 参数名称 参数显示名称
确保配置了对 /etc/ssh/sshd_config 的权限 600 <脚注 1> sshd_config的访问权限
确保设置了 IgnoreRhosts 是的 ignoreHosts 忽略罗得和铲子
确保设置了 LogLevel 信息 logLevel 日志详细级别
确保已设置 MaxAuthTries 6 maxAuthTries 身份验证尝试的最大次数
确保已配置允许的用户进行 SSH 访问 @ <请参阅脚注 5> allowUsers 允许的 SSH 用户
确保配置了拒绝的 SSH 访问用户 denyUsers SSH 的拒绝用户
确保配置允许的 SSH 访问组 * allowGroups SSH 允许的组
确保配置了 SSH 访问被拒绝的组 denyGroups SSH 的拒绝组
确保设置了 HostbasedAuthentication hostBasedAuthentication 基于主机的身份验证
确保已设置 PermitRootLogin permitRootLogin 根是否可以使用 ssh 登录
确保已设置 PermitEmptyPasswords permitEmptyPasswords 服务器是否允许使用空密码字符串登录帐户
确保设置了 ClientAliveCountMax 0 clientAliveCountMax 客户端活动消息数,这些消息可能在未通过 sshd 的情况下从客户端接收回的任何消息
确保设置了 ClientAliveInterval 3600 clientAliveInterval 超时间隔(以秒为单位),如果客户端未收到任何数据,sshd 将发送消息以请求响应
确保配置了 MAC <脚注 2> <脚注 3> 可用消息身份验证代码 (MAC) 算法的列表
确保已配置横幅 <脚注 4> banner 允许身份验证之前发送给远程用户的横幅文件的内容
确保已设置 PermitUserEnvironment permitUserEnvironment ~/.ssh/environment and environment= ~/.ssh/authorized_keys 中的选项是否由 sshd 处理
确保配置了密码 aes128-ctr,aes192-ctr,aes256-ctr ciphers 允许的加密列表
确保配置了 SSH 端口 22 port SSH 端口
确保使用最佳做法协议 2 <无参数> <无参数>

表脚注:

  1. accessPermissionsForSshdConfig

  2. messageAuthenticationCodeAlgorithms

  3. hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-512-etm@openssh.com

  4. #######################################################################\n\nAuthorized access only!\n\nIf you are not authorized to access or use this system, disconnect now!\n\n#######################################################################\n

    1. 注意:这会显示给最终用户, 如下所示:
    #######################################################################
    
    Authorized access only!
    
    If you are not authorized to access or use this system, disconnect now!
    
    #######################################################################
    
  5. allowUsers 默认值“@”表示计算机上的所有帐户

其他(非 sshd)策略参数

这些额外的策略参数可在策略分配期间使用。 这些影响 Azure Policy 分配行为,而不是计算机上的 sshd 设置。

名字 描述 违约
包括 Arc 连接的服务器 通过选择此选项,你同意按 Arc 连接的计算机按月收费。
影响 启用或禁用此策略的执行 <取决于 选择仅限审核的行为与审核和配置行为>

策略定义? 策略分配? 来宾分配? 计算机配置? 这一切如何组合在一起?

若要开始使用 SSH 状态控制,核心操作是创建 策略分配。 策略分配将 策略定义(例如“审核 Linux 计算机的 SSH 状况控制”)链接到 范围(例如“my_factory_3_resource_group”)。

使用系统时,你将遇到其他资源类型和术语,如下所述。

关系图,显示策略分配如何通过来宾分配将计算机链接到计算机配置服务

描述
策略定义 在策略服务中,描述可用审核和/或配置行为的群集的抽象数据。 例如,“审核 Linux 计算机上的 SSH 状况控制”。
策略分配 将抽象策略定义链接到具体范围,例如资源组。 策略分配可以包括特定于该分配的参数和其他属性。
计算机配置 用于在 OS 级别处理审核和设置配置的 Azure 服务和代理。
来宾分配 充当策略分配、计算机和计算机配置服务之间的三向链接的资源。 策略根据需要创建和监视来宾分配资源。
有关“guest”与“machine”术语的详细信息,请参阅 为什么在位置看到术语“来宾配置”和“Automanage”?
计算机 已启用 Arc 的计算机或 Azure VM。

关于兼容性(发行版、SSH 服务器实现等)

SSH 状态控制专为 单一长时间运行的 SSH 服务器实例的主流常规用途 Linux 方案而设计:

  • 其生命周期由 init 系统作为 systemd 进行管理
  • 其行为由 sshd_config 文件进行管理,与 OpenSSH sshd 行为一致
  • 其有效配置/状态由 sshd -T 输出显示,与 OpenSSH sshd 行为一致

对于所有受支持的发行版(请参阅下文),这是默认的 SSH 服务器用例。

原则上,计算机可以具有任意数量的 SSH 服务器实例,这些实例的生存期各不相同,具体取决于任意数量的代码库,并从任意数量的位置(配置文件、命令行参数、编译时间参数等)获取其配置。 这种情况目前没有 SSH 状态控制的范围。 如果对此类情况感兴趣,请 联系我们 讨论。

SSH 状态控制适用于 Azure Policy 和计算机配置支持的那些 Linux 发行版,不包括在开发时处于扩展支持状态的发行版。 具体来说,以下内容在 2024-06-05 范围内:

  • AlmaLinux 9
  • Amazon Linux 2
  • Ubuntu Server 20.04
  • Ubuntu Server 22.04
  • Debian 10
  • Debian 11
  • Debian 12
  • Azure Linux (CBL Mariner) 2
  • Oracle Linux 7
  • Oracle Linux 8
  • CentOS 7.3
  • CentOS 8
  • RHEL 7.4
  • RHEL 8
  • RHEL 9
  • Rocky Linux 9
  • SLES 15

在可行的情况下,SSH 状态控制通过上述发行版的特定广泛使用的系统组合进行测试。 例如,分发版维护人员在 Azure 库中发布的 OS 映像组合。 无法保证在运行时与任何特定计算机的兼容性,因为 sysadmins 和映像生成器可以自由地从 OS 中删除组件,使文件系统是只读的、使用 SELinux 阻止代理操作等。

与 sshd_config Include 指令的兼容性

SSH 状态控制尝试适应和使用sshd_config中的 Include 指令,如下所示:

  • 对于审核/读取操作:依靠 sshd -T 反映 sshd 透视的 net 配置-考虑到任何包括。
  • 对于配置/写入操作:
    • 如果计算机上的 sshd 实现支持 Include,请将新的 SSH 状态控制特定文件链接到sshd_config(作为 Include)。 随后,将所有写入放入链接的 SSH 状态控制文件中。 这增强了系统更改的系统卫生性和可追溯性。
    • 如果计算机上的 sshd 实现不支持 Include 指令,请直接将任何配置更改写入sshd_config。

与 sshd_config Match 指令的兼容性

SSH 状态控制旨在审核和配置核心 sshd 行为。 它不会尝试与条件 Match 块(如果有)进行交互,这些块可以将不同的 sshd 配置应用于特定填充。

如何以编程方式查询结果?

使用 Azure Resource Graph(ARG)查询,可以将分配和状态数据集成到自己的工作流中。 这些示例使用 PowerShell 中的 Search-AzGraph 来执行 ARG 查询,但不需要 PowerShell。 可以从多个入口点使用 ARG,包括 Azure 门户、Azure CLI、REST 调用等。

  1. 在汇总的最高高度,可以为每个符合性状态存储桶获取计算机计数。 例如:

    $machineCountsQuery = @'
    // SSH machine counts by compliance status
    guestconfigurationresources
    | where name contains "LinuxSshServerSecurityBaseline"
    | 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
    #>
    
  2. 若要深入钻取,以便按计算机查看总体符合性状态,可以使用以下内容:

    $machinePerRowQuery = @'
    // SSH machine level compliance
    guestconfigurationresources
    | where name contains "LinuxSshServerSecurityBaseline"
    | 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
    #>
    
  3. 若要向下钻取到按设置的详细信息,可以使用以下内容:

    $settingPerRowQuery = @'
    // SSH rule level detail
    GuestConfigurationResources
    | where name contains "LinuxSshServerSecurityBaseline"
    | 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 permissions on /etc/ssh/sshd_config are configured        true            Access to '/etc/ssh/sshd_config' matches required ...
    sshdemovm01 Ensure SSH is configured to meet best practices (protocol 2)     true            'Protocol 2' is found uncommented in /etc/ssh/sshd_config
    sshdemovm01 Ensure SSH is configured to ignore rhosts                        true            The sshd service reports that 'ignorerhosts' is set to 'yes'
    sshdemovm01 Ensure SSH LogLevel is set to INFO                               true            The sshd service reports that 'loglevel' is set to 'INFO'
    sshdemovm01 Ensure SSH MaxAuthTries is configured                            true            The sshd service reports that 'maxauthtries' is set to '6'
    sshdemovm01 Ensure allowed users for SSH access are configured               true            The sshd service reports that 'allowusers' is set to '*@*'
    sshdemovm01 Ensure denied users for SSH are configured                       true            The sshd service reports that 'denyusers' is set to 'root'
    sshdemovm01 Ensure allowed groups for SSH are configured                     true            The sshd service reports that 'allowgroups' is set to '*'
    sshdemovm01 Ensure denied groups for SSH are configured                      true            The sshd service reports that 'denygroups' is set to 'root'
    sshdemovm01 Ensure SSH host-based authenticationis disabled                  true            The sshd service reports that 'hostbasedauthentication' is ...
    #>
    

为什么在位置看到术语“来宾配置”和“Automanage”?

计算机配置服务也称为 来宾配置Automanage Machine Configuration。 与服务和文档交互时,可能会遇到这些名称。 例如:

  • 在本文中的 Azure Resource Graph 查询示例中,数据表称为 guestconfigurationresources
  • 在 Azure 门户中,用于观察结果的有用视图称为“来宾分配”。
  • 在 Azure 门户中,应用相关的 VM 扩展以启用计算机配置时,扩展标题为“Automanage 计算机配置”。

出于 SSH 状态控制的目的,“来宾”和“计算机”之间没有有意义的区别。 已启用 Arc 的计算机和 Azure VM 符合条件。

内置策略定义的标识符是什么?

在某些情况下,例如使用 Azure CLI 创建策略分配,可能很有用或有必要按 ID 而不是显示名称引用策略定义。

displayName id
审核 Linux 计算机上的 SSH 状况控制 /providers/Microsoft.Authorization/policyDefinitions/a8f3e6a6-dcd2-434c-b0f7-6f309ce913b4
在 Linux 计算机上配置 SSH 状态控制 /providers/Microsoft.Authorization/policyDefinitions/e22a2f03-0534-4d10-8ea0-aa25a6113233