使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

摘要

除了让用户提供他们自己的 SSH 密钥对进行身份验证之外,Microsoft Azure 平台还依赖于 SSH 密钥对以启用在部署时添加到虚拟机 (VM) 的部分功能。 我们最近发现,在一些受限的场景中,来自这些 Azure 平台证书的公钥可能会意外添加到 .ssh/authorized_keys 文件。 这些场景仅限于 VM 通过使用 cloud-init 预配且用户选择依赖于证书的其他 Azure 功能(例如系统托管的服务标识)的情况。

发生此意外行为,是因为特定操作系统的预配逻辑发生了更改。 这些是使用 cloud-init 以及在创建 VM 期间将来自 VM 可用的所有证书的密钥意外安装到 ssh 授权的密钥文件的系统。 

若要了解更多信息,请转到 CVE-2019-0816

更多信息

场景详细信息

除了公共预览版 RHEL 7.4/7.5/7.6 和 CentOS 7.4 cloud-init 映像之外,“摘要”部分提及的 cloud-init 逻辑当前已知还存在于 Ubuntu 18.04 的 Azure 映像中。 它可能还存在于使用这些操作系统的自定义映像中。
 
如果在预配其中一个 Linux 映像时启用以下功能之一,你可能会在 .ssh/authorized_keys 文件中看到其他意外密钥,例如以下任意密钥:

  • 托管标识

  • 具有受保护设置的扩展

  • 在 VM 中使用密钥保管库密钥部署 VM

标识和修正现有 VM

标识

要检查是否具有其他密钥,请查看授权密钥文件(vi .ssh/authorized_keys 文件),以确定是否添加了任何你未打算包含的密钥。

手动移除可能已添加的任何其他 ssh 公钥比较安全。 这不会影响与 VM 一起部署的功能。 此外,也不会影响指定用于身份验证的 SSH 密钥对。

如果你不知道或无法区分 .ssh/authorized_keys 文件中哪个公钥指定用于身份验证,请按照以下步骤操作:

  1. 查看部署模板:

    1. ssh 公钥

    2. cloud-init 配置中的 ssh 密钥

  2. 从 VM 中检索创建时部署的 ssh 密钥(如果你有 sudo/根目录访问权限)。 为此,请按照下列步骤操作:

    1. 检查在 CustomData 中传递的 cloud-init 配置: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
      使用 CustomData 值,然后使用 base64 解码以获取部署的公钥: echo "<customData value>" | base64 -D

    2. 或者,检查实例元数据服务 (IMDS) 以查看在 VM Create 的 ssh 公钥属性中传递的 ssh 公钥: curl -H Metadata:true "http://169.254.169.254/metadata/instance/compute/publicKeys?api-version=2018-04-02&format=json"

修正

如果发现了未打算部署到 VM 的额外证书,可以通过从 authorized_keys 文件中擦除相应行来移除这些证书。

通过交互式连接到 VM 来运行修正,或跨 VM 使用自定义脚本扩展或 RunCommand。

通过使用具有受保护的设置的扩展或托管标识部署的 VM

使用以下脚本从通过扩展或托管标识部署 VM 的证书中移除公钥。 这不会移除部署 VM 时或当使用密钥保管库密钥部署 VM 时指定的密钥。

重要说明

建议在运行此脚本之前对 authorized_keys 文件进行备份。

 

#!/bin/bash
set -e

# /var/lib/waagent has *.crt files that include the crt files corresponding to 
# the user provided public keys and one additional .crt file from MSI.
# This script converts the content of the .crt file into the ssh public key and
# remove it from the authorized_keys file
readarray -t CRT_FILES < <(grep -l -E "(Microsoft.ManagedIdentity|Windows Azure)" /var/lib/waagent/*.crt)
for ((i=0; i < ${#CRT_FILES[@]}; i++))
do
    PUBKEY=$(openssl x509 -in "${CRT_FILES[$i]}" -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8)
    sed -i -e "\@$PUBKEY@d" $HOME/.ssh/authorized_keys
Done 

运行脚本之后,检查 ssh/authorized_keys 文件以确保仅存在已知公钥。

使用密钥保管库密钥部署的 VM

若要确定使用密钥保管库密钥部署时是否添加了密钥,请按照以下步骤操作:

  1. 获取使用 VM 部署的密钥保管库证书的名称,查看部署代码 Az CLI 或 ARM 模板,或运行此 Az CLI:
      az vm show --resource-group <resourceGroupName> --name <vmName> | grep certificateUrl

    响应将显示证书名称:
      "certificateUrl": "https://<keyVaultname>.vault.azure.net/secrets/<certName>/xxxxxxxxxxxxx"

  2. 下载证书:
      az keyvault certificate download --vault-name <keyVaultName> --name <certName> --encoding PEM --file public.pem

  3. 提取公钥:
      openssl x509 -in public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

  4. 将前面步骤的输出与 ssh/authorized_keys 文件中的剩余证书进行比较。
      vi .ssh/authorized_keys file

解决方案

Azure 市场映像

已经对标识的 Azure 映像中的 cloud-init 应用了修补程序:

  • Canonical:UbuntuServer:18.04-LTS:18.04.201902190

注意

稍后将向以下映像中添加更新。

  • Canonical:UbuntuServer:18.10:x

  • RedHat:RHEL:7-RAW-CI(公共预览版映像)

  • OpenLogic:CentOS:7-CI(公共预览版映像)

当映像变得可用时,本文将会更新。

自定义映像

如果使用的是 cloud-init 为已知操作系统预配的自定义映像,你必须更新源自定义映像。

Ubuntu 18.04 映像

若要更新源自定义映像,必须进行以下修改:

  • 编辑以下文件:

    /etc/cloud/cloud.cfg.d/90-azure.cfg

  • 在文件结尾处添加以下代码:

重要说明

必须准确添加所示的代码,包括空格。

datasource:
   Azure:
     agent_command: [service, walinuxagent, start]

RHEL 7.4/7.5/7.6 和 CentOS 7.6 映像

如果你之前通过使用这些步骤(或类似方法)创建了 RHEL/CentOS 映像,则必须更新用于创建 VM 的源映像。 以下是添加到现有源 VM 映像配置所需的额外步骤:

步骤 1

编辑以下文件:

/etc/cloud/cloud.cfg.d/91-azure_datasource.cfg 

重要说明

必须准确添加所示的代码,包括空格。

在文件结尾处添加以下行:

datasource:
   Azure:
     agent_command: [systemctl, start, waagent, --no-block]

步骤 2

更新代理配置,如下所示:

cp /lib/systemd/system/waagent.service /etc/systemd/system/waagent.service
sed -i 's/After=network-online.target/WantedBy=cloud-init.service\\nAfter=network.service systemd-networkd-wait-online.service/g' /etc/systemd/system/waagent.service
systemctl daemon-reload

cloud-init 程序包

包含修补程序的所有 cloud-init 程序包都在更新。 Microsoft 正在研究此问题,并且将在获得更多信息之后在本文中添加这些信息。

常见问题

问题 1: Microsoft 是否有权访问我的 VM?

回答 1: 加密密钥用于管理标识,扩展未设计为供 Microsoft 员工访问。 我们拥有用于监控、记录和组织此类访问的进程。 作为一种安全措施,我们会查看所有日志,以确保不会不当访问任何客户密钥。 对于 VM 或 VMSS 部署中引用的存储在密钥保管库中的证书,Microsoft 员工无权访问这些密钥。

问题 2: 所有 cloud-init 部署的操作系统和版本都受影响吗?

回答 2: 否。我们发现仅标识的操作系统中发生此外来密钥问题。 我们未发现较低版本的 Ubuntu 中发生此问题。 这是因为这些系统使用其他机制来设置公钥。

问题 3: 受影响的适用于 Linux 分发的 cloud-init 程序包是否包含修补程序?

回答 3: 我们正致力于向受影响的版本的程序包中添加修补程序,此工作完成后我们将更新本文。

问题 4: Microsoft 是否会自动更新任何受影响的 VM? 

回答 4: 否。Microsoft 不会更改已预配的 VM 的内容。

问题 5: 我们的安全策略阻止我操作在 authorized_keys 中包含外来内容的 Linux VM。 我现在可以做什么?

回答 5: 你可以从 authorized_keys 文件中安全移除违规的行。 这不会影响你创建和控制的 SSH 密钥对或托管标识。 你可以手动执行此操作,或者通过跨任何受影响的队列运行自定义脚本或自定义命令来执行此操作。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×