与 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 配置由系统管理员管理。 系统管理员可以使用以下方法之一来解决此问题。
解决方案 1:使用串行控制台关闭 SELinux 启动 VM
从 Azure 串行控制台触发重启 VM(硬)。
使用 ESC 键中断 GRUB 菜单中的 VM。
选择 E 以修改 GRUB 菜单中的第一个内核条目。
转到该
linux16
行并添加selinux=0
以暂时禁用 SELinux。在 . 中
/etc/selinux/config
验证并更正 SELinux 配置。例如,一个常见的错误是将
SELINUXTYPE
密钥设置为用于SELINUX
键的值之一。 请参阅以下示例屏幕截图:请注意最后一行。
SELINUXTYPE=disabled
键SELINUXTYPE
应设置为targeted
,minimum
或mls
不应disabled
设置为。 以下屏幕截图显示了正确的配置:
解决方案 2:使用救援 VM 修复 SELinux 配置错误
提示
如果 VM 有最近的备份, 请从备份 还原 VM 以修复配置问题。
如果 Azure 串行控制台 在特定 VM 中不起作用,或者不是订阅中的选项,请使用救援/修复 VM 排查此问题。 使用 VM 修复命令 创建已附加受影响 VM OS 磁盘副本的修复 VM。 使用 chroot 在修复 VM 中装载 OS 文件系统的副本。
注意
或者,可以使用 Azure 门户手动创建救援 VM。 有关详细信息,请参阅通过使用 Azure 门户将 OS 磁盘附加到恢复 VM 来对 Linux VM 进行故障排除。
在 . 中
/etc/selinux/config
验证并更正 SELinux 配置。 为此,请遵循解决方案 1 中的 步骤 5:从串行控制台关闭 SELinux 启动 VM。更正 SELinux 配置后,执行以下操作:
- 退出 chroot。
- 从救援/修复 VM 中卸载文件系统的副本。
az vm repair restore
运行以下命令,将修复的 OS 磁盘与 VM 的原始 OS 磁盘交换。 有关详细信息,请参阅使用 Azure 虚拟机修复命令修复 Linux VM 中的步骤 5。- 通过查看 Azure 串行控制台或尝试连接到 VM 来验证 VM 是否能够启动。
后续步骤
如果问题不是由于 SELinux 配置错误,请参阅排查 Azure Linux 虚拟机启动错误,以获取进一步的故障排除选项。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。