概要
Microsoft Azure プラットフォームでは、ユーザーによる認証用 SSH キー ペアの提供に加え、デプロイ時に仮想マシン (VM) に追加される一部の機能を有効にするために SSH キー ペアを利用しています。 最近、一部の限られたシナリオで、このような Azure プラットフォーム証明書の公開キーが予期せず .ssh/authorized_keys ファイルに追加される可能性があることが判明しました。 このようなシナリオは、cloud-init を使用して VM がプロビジョニングされ、システム マネージド サービス ID などの証明書に依存する追加の Azure 機能をユーザーが選択する状況に限定されます。
この予期しない動作は、特定のオペレーティング システムのプロビジョニング ロジックの変更が原因で発生します。 対象となるのは、cloud-init を使用し、VM で使用できるすべての証明書の公開キーを VM の作成時に誤って ssh 承認キー ファイルにインストールするシステムです。
詳細については、CVE-2019-0816 を参照してください。
詳細情報
シナリオの詳細
現在のところ、「概要」セクションに記載されている cloud-init ロジックは、パブリック プレビュー版の RHEL 7.4/7.5/7.6 および CentOS 7.4 cloud-init イメージに加え、Ubuntu 18.04 用の Azure イメージにも存在することがわかっています。 また、これらのオペレーティング システムを使用するカスタム イメージにも存在する可能性があります。
Linux イメージのいずれかをプロビジョニングするときに、次のいずれかの機能を有効にすると、.ssh/authorized_keys ファイルに次のような追加の予期しないキーが表示されることがあります。
-
マネージド ID
-
保護された設定がある拡張機能
-
VM 内の Key Vault キーを使用した VM のデプロイ
既存の VM の特定と修復
特定
追加のキーがあるかどうかを調べるには、承認キーファイル (vi .ssh/authorized_keys ファイル) を確認し、意図しないキーが追加されたかどうかを判断します。
追加された可能性のある ssh 公開キーは、手動で削除しても構いません。 削除しても、VM と共にデプロイされている機能に影響はありません。 また、認証用に指定した SSH キーペアには影響しません。
認証用に指定した .ssh/authorized_keys ファイル内の公開キーがわからない場合、または区別できない場合は、次の手順を実行します。
-
次のデプロイ テンプレートを確認します。
-
ssh 公開キー
-
cloud-init 構成の ssh キー
-
-
sudo/root アクセス権がある場合は、作成時にデプロイされた ssh キーを VM 内から取得します。 これを行うには、次の手順を実行します。
-
CustomData に渡された cloud-init 構成を調べます。 sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
CustomData 値を使用し、次に base64 デコードを使用してデプロイした公開キーを取得します。 echo "<customData value>" | base64 -D -
または、Instance Meta Data Service (IMDS) を調べ、VM 作成の 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 を使用します。
保護された設定がある拡張機能またはマネージド ID を使用してデプロイされた VM
次のスクリプトを使用して、拡張機能またはマネージド ID を使用して VM がデプロイされた証明書の公開キーを削除します。 VM をデプロイしたとき、または VM が Key Vault キーを使用してデプロイされた場合に指定されたキーは、この操作では削除されません。
重要
このスクリプトを実行する前に、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 ファイルを調べ、既知の公開キーのみが存在することを確認します。
Key Vault のシークレットを使用してデプロイされた VM
Key Vault キーを使用してデプロイしたときにキーが追加されたかどうかを特定するには、次の手順を実行します。
-
VM を使用してデプロイした Key Vault 証明書の名前を取得するか、デプロイ コード Az CLI または ARM テンプレートを確認するか、次の Az CLI を実行します。
az vm show --resource-group <resourceGroupName> --name <vmName> | grep certificateUrl
応答に証明書名が表示されます。
"certificateUrl": "https://<keyVaultname>.vault.azure.net/secrets/<certName>/xxxxxxxxxxxxx" -
証明書をダウンロードします。
az keyvault certificate download --vault-name <keyVaultName> --name <certName> --encoding PEM --file public.pem -
公開キーを抽出します。
openssl x509 -in public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8 -
前の手順の出力と ssh/authorized_keys ファイル内のその他の証明書を比較します。
vi .ssh/authorized_keys file
解決方法
Azure MarketPlace イメージ
特定された 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 パッケージは更新段階です。 マイクロソフトでは、この問題について現在調査中です。詳細については、わかり次第この資料に掲載する予定です。
よく寄せられる質問
Q1: マイクロソフトは私の VM に対するアクセス権を取得しましたか。
A1: ID の管理には暗号化キーが使用されています。また、拡張機能はマイクロソフト従業員がアクセスできる設計ではありません。 マイクロソフトはこの種のアクセスを監視、記録、および防止するためのプロセスを用意しています。 安全上の予防措置として、マイクロソフトはすべてのログを調べ、不適切にアクセスされたお客様のキーがないことを確認しています。 Key Vault に格納され、VM または VMSS のデプロイで参照される証明書の場合、マイクロソフト従業員はそのシークレットにアクセスできません。
Q2: すべての cloud-init でデプロイされた OS とバージョンが影響を受けますか。
A2: いいえ。この無関係なキーの問題は、特定されたオペレーティング システムでのみ発生します。 この問題が Ubuntu の旧バージョンで発生する状況は確認されていません。 そのようなシステムでは公開キーの設定に使用するメカニズムが異なるためです。
Q3: 影響を受ける Linux ディストリビューション用 cloud-init パッケージに修正プログラムは含まれていますか。
A3: 現在、影響を受けるバージョン用パッケージに修正プログラムを追加する作業に取り組んでいます。それが完了次第、この資料を更新します。
Q4: マイクロソフトは影響を受けるすべての VM を自動的に更新しますか。
A4: いいえ。マイクロソフトは、既にプロビジョニングされている VM のコンテンツを変更しません。
Q5: セキュリティ ポリシーにより、authorized_keys に無関係なコンテンツがある Linux VM を操作できません。 現時点の対処方法を教えてください。
A5: authorized_keys ファイルから問題の行を削除しても問題ありません。 この操作は、作成および管理している SSH キーペアと、マネージド ID のどちらにも影響しません。 この操作は手動で実行するか、影響を受けるすべてのシステムに対してカスタム スクリプトまたはカスタム コマンドを実行します。