与 Azure Linux 虚拟机的 SSH 连接因 SELinux 配置错误而失败

适用于:✔️ Linux VM

注意

本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南

本文提供了一个解决方案,用于解决以下问题:由于 SELinux 配置错误,与 Azure 虚拟机(VM)的安全外壳(SSH)连接失败。

背景

Unix 安全模型基于自由访问控制(DAC)。 安全性增强型 Linux(SELinux)使用内核模块和用户空间工具实现 Linux 的强制访问控制(MAC)。 MAC 为资源访问提供了更受控的环境,并消除了根用户在没有限制的情况下访问操作系统(OS)上所有资源的能力。 它还利用传统的 Unix 安全模型来缓解多种安全风险。

不同的分发版包括现装的 SELinux,或提供激活内核支持和安装用户空间工具的简单方法。 有关详细信息,请参阅某些主要 Linux 提供程序的以下 SELinux 文章:

Azure 上的基于 Red Hat 的映像已启用 SELinux;其他分发版不。 在 Ubuntu 中使用 SELinux 时,此分发版上存在有关其未维护状态的警告。 Ubuntu 为 MAC 实现了一个不同的解决方案,称为 AppArmor

先决条件

确保在 Linux VM 中启用串行控制台 并正常运行。

现象

SELinux 配置错误可能会导致 OS 无法加载 SELinux 策略,这会阻止 OS 完成启动。

从 Azure 门户 或通过 Azure CLI 检查串行控制台。 以下消息显示在输出末尾附近:

显示串行控制台日志中“无法加载 SELinux 策略”错误的屏幕截图。

SELinux 配置由系统管理员管理。 系统管理员可以使用以下方法之一来解决此问题。

解决方案 1:使用串行控制台关闭 SELinux 启动 VM

  1. Azure 串行控制台触发重启 VM(硬)。

  2. 使用 ESC 键中断 GRUB 菜单中的 VM。

  3. 选择 E 以修改 GRUB 菜单中的第一个内核条目。

  4. 转到该 linux16 行并添加 selinux=0 以暂时禁用 SELinux。

    动态 GIF,显示在 GRUB 菜单级别中断启动以暂时禁用 SELinux 的过程。

  5. 在 . 中 /etc/selinux/config验证并更正 SELinux 配置。

    例如,一个常见的错误是将 SELINUXTYPE 密钥设置为用于 SELINUX 键的值之一。 请参阅以下示例屏幕截图:

    显示 SELINUXTYPE 密钥未正确设置为禁用的屏幕截图。

    请注意最后一行。 SELINUXTYPE=disabledSELINUXTYPE 应设置为 targetedminimummls 不应 disabled设置为。 以下屏幕截图显示了正确的配置:

    显示 /etc/selinux/config 的正确配置的屏幕截图。

解决方案 2:使用救援 VM 修复 SELinux 配置错误

提示

如果 VM 有最近的备份, 请从备份 还原 VM 以修复配置问题。

  1. 如果 Azure 串行控制台 在特定 VM 中不起作用,或者不是订阅中的选项,请使用救援/修复 VM 排查此问题。 使用 VM 修复命令 创建已附加受影响 VM OS 磁盘副本的修复 VM。 使用 chroot 在修复 VM 中装载 OS 文件系统的副本。

    注意

    或者,可以使用 Azure 门户手动创建救援 VM。 有关详细信息,请参阅通过使用 Azure 门户将 OS 磁盘附加到恢复 VM 来对 Linux VM 进行故障排除

  2. 在 . 中 /etc/selinux/config验证并更正 SELinux 配置。 为此,请遵循解决方案 1 中的 步骤 5:从串行控制台关闭 SELinux 启动 VM。

  3. 更正 SELinux 配置后,执行以下操作:

    1. 退出 chroot。
    2. 从救援/修复 VM 中卸载文件系统的副本。
    3. az vm repair restore运行以下命令,将修复的 OS 磁盘与 VM 的原始 OS 磁盘交换。 有关详细信息,请参阅使用 Azure 虚拟机修复命令修复 Linux VM 中的步骤 5。
    4. 通过查看 Azure 串行控制台或尝试连接到 VM 来验证 VM 是否能够启动。

后续步骤

如果问题不是由于 SELinux 配置错误,请参阅排查 Azure Linux 虚拟机启动错误,以获取进一步的故障排除选项。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区