สรุป
นอกจากจะให้ผู้ใช้มี Keypair ของ SSH ของตนเองสําหรับการรับรองความถูกต้องแล้ว แพลตฟอร์ม Microsoft Azure ใช้ Keypairs SSH เพื่อเปิดใช้งานฟีเจอร์บางอย่างที่เพิ่มลงในเครื่องเสมือน (VM) ในขณะปรับใช้ เราเพิ่งค้นพบว่า ในบางสถานการณ์ที่จํากัด คีย์สาธารณะจากใบรับรองแพลตฟอร์ม Azure เหล่านี้อาจถูกเพิ่มลงในไฟล์ .ssh/authorized_keys โดยไม่คาดคิด สถานการณ์เหล่านี้จะถูกกําหนดขอบเขตไว้เฉพาะกับสถานการณ์ที่ VM ถูกเตรียมใช้งานโดยใช้ cloud-init และผู้ใช้เลือกคุณลักษณะ Azure เพิ่มเติมที่ใช้ใบรับรอง เช่น ข้อมูลประจําตัวของบริการที่จัดการโดยระบบ
ลักษณะการทํางานที่ไม่คาดคิดนี้เกิดขึ้นเนื่องจากการเปลี่ยนแปลงตรรกะการเตรียมใช้งานของระบบปฏิบัติการเฉพาะ ระบบเหล่านี้เป็นระบบที่ใช้ cloud-init และติดตั้งคีย์สาธารณะโดยไม่ได้ตั้งใจจากใบรับรอง ทั้งหมด ที่พร้อมใช้งานสําหรับ VM ในไฟล์คีย์ ssh ที่ได้รับอนุญาตในระหว่างการสร้าง VM
หากต้องการเรียนรู้เพิ่มเติม ไปที่ CVE-2019-0816
ข้อมูลเพิ่มเติม
รายละเอียดสถานการณ์สมมติ
ตรรกะในระบบคลาวด์ที่ระบุไว้ในส่วน "สรุป" เป็นที่รู้จักกันในปัจจุบันในรูป Azure สําหรับ Ubuntu 18.04 นอกเหนือจากรูปภาพสําหรับตัวอย่างสาธารณะ RHEL 7.4/7.5/7.6 และ CentOS 7.4 บนระบบคลาวด์ และอาจมีอยู่ในรูปแบบกําหนดเองที่ใช้ระบบปฏิบัติการเหล่านี้
ถ้าคุณเปิดใช้งานหนึ่งในฟีเจอร์ต่อไปนี้ในขณะที่คุณเตรียมใช้งานหนึ่งในรูป Linux คุณอาจเห็นคีย์เพิ่มเติมที่ไม่คาดคิดในไฟล์ .ssh/authorized_keys เช่น รายการใดๆ ต่อไปนี้:
- ข้อมูลประจําตัวที่มีการจัดการ
- ส่วนขยายที่มีการตั้งค่าที่ได้รับการป้องกัน
- ปรับใช้ VM กับ Key Vault Keys ใน VM
ระบุและแก้ไข VM ที่มีอยู่
ระบุ
เมื่อต้องการตรวจสอบว่าคุณมีคีย์เพิ่มเติมหรือไม่ ให้ตรวจสอบไฟล์คีย์ที่ได้รับอนุญาต (ไฟล์ vi .ssh/authorized_keys) เพื่อตรวจสอบว่ามีการเพิ่มคีย์เพิ่มเติมที่คุณไม่ได้ตั้งใจใส่เข้าไปหรือไม่
คุณสามารถเอาคีย์สาธารณะ ssh เพิ่มเติมที่อาจถูกเพิ่มเข้าไปออกด้วยตนเองได้อย่างปลอดภัย ซึ่ง จะไม่ ส่งผลกระทบต่อฟีเจอร์ที่ปรับใช้ร่วมกับ VM นอกจากนี้ จะไม่ส่งผลกระทบต่อการจับคู่คีย์ SSH ที่ระบุของคุณสําหรับการรับรองความถูกต้อง
ถ้าคุณไม่ทราบหรือไม่สามารถแยกความแตกต่างของคีย์สาธารณะในไฟล์ .ssh/authorized_keys ที่คุณระบุสําหรับการรับรองความถูกต้อง ให้ทําตามขั้นตอนเหล่านี้:
รีวิวเทมเพลตการปรับใช้ของคุณ:
- คีย์สาธารณะ ssh
- แป้น ssh ในการกําหนดค่า cloud-init
เรียกใช้แป้น ssh ที่ปรับใช้ในเวลาการสร้างจากภายใน VM ถ้าคุณมีการเข้าถึง sudo/root เมื่อต้องการทำสิ่งนี้ ให้ทำตามขั้นตอนเหล่านี้:
- ตรวจสอบการกําหนดค่า cloud-init ที่ส่งผ่านใน CustomData: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
ใช้ค่า CustomData แล้วใช้การถอดรหัส base64 เพื่อรับคีย์สาธารณะที่คุณปรับใช้:
- ตรวจสอบการกําหนดค่า cloud-init ที่ส่งผ่านใน CustomData: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
echo "<customData value>" | base64 -D 2 อีกวิธีหนึ่งคือ ตรวจสอบอินสแตนซ์ Meta Data Service (IMDS) เพื่อดูคีย์สาธารณะ ssh ที่ส่งผ่านในคุณสมบัติคีย์สาธารณะ ssh ของ VM Create: curl -H Metadata:true "http://169.254.169.254/metadata/instance/compute/publicKeys?api-version=2018-04-02&format=json"
การแก้ไข
ถ้าคุณได้ระบุใบรับรองเพิ่มเติมที่คุณไม่ได้ตั้งใจปรับใช้กับ VM คุณสามารถเอาใบรับรองเหล่านี้ออกได้โดยการลบบรรทัดที่สอดคล้องกันออกจากไฟล์ authorized_keys
เรียกใช้การแก้ไขโดยการเชื่อมต่อกับ VM แบบโต้ตอบ หรือใช้ Custom Script Extension หรือ RunCommand ข้าม VM หลายเครื่อง
VM ที่ปรับใช้โดยใช้ส่วนขยายที่มีการตั้งค่าที่ได้รับการป้องกันหรือข้อมูลประจําตัวที่มีการจัดการ
ใช้สคริปต์ต่อไปนี้เพื่อนําคีย์สาธารณะออกจากใบรับรองที่ 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 เพื่อให้แน่ใจว่ามีเฉพาะคีย์สาธารณะที่รู้จักเท่านั้น
VM ที่ปรับใช้ด้วย Key Vault Secrets
เมื่อต้องการระบุว่าคีย์ถูกเพิ่มหรือไม่เมื่อปรับใช้ด้วยแป้น Key Vault ให้ทําตามขั้นตอนต่อไปนี้:
ดูชื่อของใบรับรอง Key Vault ที่คุณปรับใช้โดยใช้ VM ตรวจสอบรหัสการปรับใช้ Az CLI หรือเทมเพลต ARM หรือเรียกใช้เทมเพลต Az CLI นี้:
az vm show --resource-group <resourceGroupName> --name <vmName> | grep certificateUrlการตอบกลับจะแสดงชื่อใบรับรอง:
"CertificateUrl": "https://< keyVaultname.vault.azure.net/secrets/><certName>/xxxxxxxxxxxx"ดาวน์โหลดใบรับรอง:
ดาวน์โหลดใบรับรอง az keyvault --vault-name <keyVaultName> --name <certName> --encoding PEM --file public.pemแยกคีย์สาธารณะ:
opensl x509 -in public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8เปรียบเทียบผลลัพธ์จากขั้นตอนก่อนหน้ากับใบรับรองที่เหลือในไฟล์ ssh/authorized_keys
vi .ssh/authorized_keys file
การแก้ปัญหา
Azure MarketPlace รูปภาพ
การแก้ไขถูกนําไปใช้กับ cloud-init ในรูปภาพ Azure ที่ระบุ:
- Canonical:UbuntuServer:18.04-LTS:18.04.201902190
- Canonical:UbuntuServer:18.10-DAILY:18.10.201903200
- RedHat:RHEL:7-RAW-CI:7.6.2019030421
- OpenLogic:CentOS-CI:7-CI:7.6.20190306
รูปแบบกําหนดเอง
ถ้าคุณกําลังใช้อิมเมจแบบกําหนดเองที่เตรียมใช้งานโดย 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 ของฉันหรือไม่
A1: คีย์การเข้ารหัสลับใช้ในการจัดการข้อมูลประจําตัวและส่วนขยายไม่ได้ออกแบบมาเพื่อการเข้าถึงโดยพนักงานของ Microsoft เรามีกระบวนการตรวจสอบ บันทึก และป้องกันการเข้าถึงประเภทนี้ เพื่อเป็นการป้องกันความปลอดภัย เรากําลังตรวจสอบบันทึกทั้งหมดเพื่อให้แน่ใจว่าไม่มีการเข้าถึงคีย์ลูกค้าอย่างไม่เหมาะสม สําหรับใบรับรองที่เก็บอยู่ใน Key Vault ที่อ้างอิงในการปรับใช้ VM หรือ VMSS พนักงาน Microsoft จะไม่มีสิทธิ์เข้าถึงความลับใดๆ
คําถามที่ 2: OS และเวอร์ชันที่ปรับใช้บนระบบคลาวด์ทั้งหมดได้รับผลกระทบหรือไม่
A2: ไม่ใช่ เราได้เห็นปัญหาคีย์ที่ไม่เกี่ยวข้องนี้เกิดขึ้นเฉพาะในระบบปฏิบัติการที่ระบุเท่านั้น เราไม่เห็นมันเกิดขึ้นใน Ubuntu เวอร์ชันที่เก่ากว่า ทั้งนี้เนื่องจากระบบเหล่านั้นใช้กลไกที่แตกต่างกันในการตั้งค่าคีย์สาธารณะ
คําถามที่ 3: แพคเกจ Cloud-init ที่ได้รับผลกระทบสําหรับการแจกจ่าย Linux มีการแก้ไขหรือไม่
A3: เรากําลังดําเนินการเพิ่มการแก้ไขลงในแพคเกจสําหรับเวอร์ชันที่ได้รับผลกระทบ และเราจะอัปเดตบทความนี้เมื่องานเสร็จสมบูรณ์
คําถามที่ 4: Microsoft จะอัปเดต VM ที่ได้รับผลกระทบโดยอัตโนมัติหรือไม่
A4: ไม่ใช่ Microsoft จะไม่เปลี่ยนแปลงเนื้อหาของ VM ที่คุณได้เตรียมใช้งานไว้แล้ว
คําถามที่ 5: นโยบายความปลอดภัยของเราป้องกันไม่ให้ฉันใช้งาน VM Linux ที่มีเนื้อหาที่ไม่เกี่ยวข้องใน authorized_keys วันนี้ฉันสามารถทําอะไรได้บ้าง
A5: คุณสามารถเอาบรรทัดที่ผิดออกจากไฟล์ authorized_keys ได้อย่างปลอดภัย ซึ่งจะไม่มีผลกับ Keypair ของ SSH ที่คุณสร้างและควบคุมหรือข้อมูลประจําตัวที่มีการจัดการ คุณสามารถทําได้ด้วยตนเองหรือโดยการเรียกใช้สคริปต์แบบกําหนดเองหรือคําสั่งแบบกําหนดเองข้ามกองเรือที่ได้รับผลกระทบ