요약

Microsoft Azure 플랫폼에서는 사용자가 인증용 SSH 키 쌍을 직접 제공하도록 허용하는 동시에, SSH 키 쌍을 사용하여 배포 시 VM(가상 머신)에 추가되는 몇 가지 기능을 사용할 수 있도록 설정합니다. 이와 관련하여 일부 시나리오에서 이러한 Azure 플랫폼 인증서의 공개 키가 .ssh/authorized_keys 파일에 예기치 않게 추가될 수 있음이 최근 확인되었습니다. Cloud-Init를 사용하여 VM을 프로비전한 상태에서 사용자가 시스템에서 관리하는 서비스 ID 등 인증서를 사용하는 추가 Azure 기능을 선택하는 상황만 이러한 시나리오에 해당됩니다.

특정 운영 체제의 프로비저닝 논리가 변경되면 이와 같은 예기치 않은 동작이 발생합니다. Cloud-init를 사용하며 VM을 만들 때 VM이 사용할 수 있는 모든 인증서의 공개 키를 ssh-authorized 키 파일에 잘못 설치하는 운영 체제가 여기에 해당됩니다.  

자세히 알아보려면 CVE-2019-0816을 참조하세요.

추가 정보

시나리오 세부 정보

"요약" 섹션에 나와 있는 Cloud-init 논리는 현재 Ubuntu 18.04용 Azure 이미지와 공개 미리 보기 RHEL 7.4/7.5/7.6 및 CentOS 7.4 Cloud-init 이미지에 포함되어 있는 것으로 확인되었습니다. 이러한 운영 체제를 사용하는 사용자 지정 이미지에도 해당 논리가 포함되어 있을 수 있습니다.    Linux 이미지 중 하나를 프로비전하는 과정에서 해당 기능 중 하나를 사용하도록 설정하면 .ssh/authorized_keys 파일에서 다음과 같은 예기치 않은 추가 키가 표시될 수 있습니다. 

  • 관리 ID

  • 설정이 보호된 확장

  • VM에서 키 자격 증명 모음 키를 사용하여 VM 배포

기존 VM 식별 및 수정

식별

추가 키가 있는지 확인하려면 권한이 부여된 키 파일(vi .ssh/authorized_keys 파일)을 검토하여 포함하지 않으려 했던 추가 키 파일이 추가되었는지 확인합니다.

더 추가되었을 수 있는 ssh 공개 키는 수동으로 제거해도 됩니다. 이러한 키를 제거해도 VM과 함께 배포되는 기능에는 영향을 주지 않습니다. 그리고 인증용으로 지정한 SSH 키 쌍에도 아무런 영향이 없습니다.

.ssh/authorized_keys 파일에서 인증용으로 지정한 공개 키 파일을 모르거나 구분할 수 없는 경우에는 다음 단계를 수행하세요. 

  1. 배포 템플릿을 검토합니다.

    1. ssh 공개 키

    2. Cloud-init 구성의 ssh 키

  2. sudo/root 액세스 권한이 있는 경우 VM 내부에서 생성 시에 배포한 ssh 키를 검색합니다. 이렇게 하려면 다음 단계를 수행하세요.

    1. CustomData에서 전달된 Cloud-init 구성을 확인합니다. sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>" CustomData 값과 base64 디코드를 차례로 사용하여 배포한 공개 키를 가져옵니다. echo "<customData value>" | base64 -D

    2. IMDS(Instance Metadata Service)를 검사해 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를 사용합니다.

보호된 설정 또는 관리 ID가 포함된 확장을 사용하여 배포된 VM

확장 또는 관리 ID를 사용하여 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 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 패키지의 업데이트가 진행되고 있습니다. Microsoft는 현재 이 문제를 조사 중이며, 추가 정보가 입수되면 이 문서에 게시할 예정입니다. 

질문과 대답

질문 1: Microsoft에서 내 VM에 액세스할 수 있나요?

대답 1: 암호화 키는 Microsoft 직원들이 액세스할 수 없는 ID와 확장을 관리하는 데 사용됩니다. Microsoft에는 이러한 종류의 액세스를 모니터링/기록/방지하기 위한 프로세스가 마련되어 있습니다. 그리고 안전을 위한 예방 조치로 모든 로그를 검토해 고객 키에 부적절하게 액세스하지 않았는지를 확인합니다. Microsoft 직원은 키 자격 증명에 저장되어 있으며 VM 또는 VMSS 배포에서 참조되는 인증서의 비밀에 액세스할 수 없습니다.

질문 2: 이 문제는 Cloud-init를 통해 배포된 모든 OS 및 버전에 적용되나요?

대답 2: 아니요. 잘못된 키가 추가되는 문제는 식별된 운영 체제에서만 나타나는 것으로 확인되었습니다. Ubuntu의 이전 버전에서는 해당 문제 발생이 확인되지 않았습니다. 해당 시스템은 다른 메커니즘을 사용해 공개 키를 설정하기 때문입니다.

질문 3: 영향받는 Linux 배포용 Cloud-init 패키지에는 픽스가 포함되어 있나요?

대답 3: Microsoft는 현재 영향받는 버전용 패키지에 픽스를 추가하는 작업을 진행하고 있으며, 해당 작업이 완료되면 이 문서를 업데이트할 예정입니다.

질문 4: Microsoft는 영향받는 VM을 자동으로 업데이트하나요? 

대답 4: 아니요. Microsoft는 이미 프로비전된 VM의 콘텐츠는 변경하지 않습니다.

질문 5: 보안 정책으로 인해 authorized_keys에 잘못된 콘텐츠가 포함되어 있는 Linux VM을 작동할 수 없습니다. 이와 관련하여 즉시 사용할 수 있는 해결 방법은 무엇인가요?

대답 5: authorized_keys 파일에서 잘못된 줄을 제거하면 됩니다. 이렇게 해도 생성한 SSH 키 쌍과 컨트롤 또는 관리 ID에는 아무런 영향이 없습니다. 제거는 수동으로 수행해도 되고, 영향받는 시스템에서 사용자 지정 스크립트 또는 사용자 지정 명령을 실행해도 됩니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.