สรุป
นอกเหนือจากการอนุญาตให้ผู้ใช้ให้ตนเอง keypairs SSH สำหรับการรับรองความถูกต้อง แพลตฟอร์ม Microsoft Azure อาศัย keypairs SSH เพื่อเปิดใช้งานคุณลักษณะบางอย่างที่ถูกเพิ่มไปยังเครื่องเสมือน (VM) ในขณะที่ปรับใช้ เราเพิ่งพบว่า ในบางสถานการณ์จำกัด คีย์สาธารณะจากใบรับรองเหล่านี้แพลตฟอร์ม Azure สามารถโดยไม่คาดคิดเพิ่มไปยังแฟ้ม.ssh/authorized_keys สถานการณ์เหล่านี้จะครอบคลุมเฉพาะในสถานการณ์ที่ VM ถูกเตรียมใช้งาน โดยใช้ cloud-เริ่มต้น และผู้ใช้เลือกคุณลักษณะ Azure เพิ่มเติมที่อาศัยใบรับรอง เช่นข้อมูลเฉพาะตัวของบริการจัดการระบบ
ลักษณะการทำงานที่ไม่คาดคิดนี้เกิดขึ้นเนื่องจาก มีการเปลี่ยนแปลงในตรรกะการเตรียมใช้งานระบบปฏิบัติการที่เฉพาะเจาะจง เหล่านี้คือระบบที่ใช้ cloud init และที่ไม่ได้ตั้งใจติดตั้งคีย์สาธารณะได้จากใบรับรองทั้งหมดที่พร้อมใช้งานใน VM ลงในแฟ้ม ssh ได้รับอนุญาตคีย์ระหว่างการสร้าง VM.
เมื่อต้องการเรียนรู้เพิ่มเติม ไปที่2019-CVE-0816
ข้อมูลเพิ่มเติม
รายละเอียดของสถานการณ์จำลอง
เป็นที่รู้จักตรรกะ init เมฆที่กล่าวถึงในส่วน "สรุป" อยู่ในขณะนี้มีอยู่ในรูปของ Azure สำหรับ Ubuntu 18.04 นอกเหนือจาก 7.4/7.5/7.6 RHEL อย่างสาธารณะและรูปเมฆ init CentOS 7.4 นั้นอาจมีอยู่ในรูปแบบกำหนดเองที่ใช้ระบบปฏิบัติการเหล่านี้ ถ้าคุณเปิดใช้งานลักษณะการทำงานต่อไปนี้อย่างใดอย่างหนึ่งในขณะที่คุณเตรียมใช้รูป Linux คุณอาจเห็นคีย์เพิ่มเติม ที่ไม่คาดคิดในแฟ้ม.ssh/authorized_keys เช่นต่อไปนี้:
-
ข้อมูลเฉพาะตัวที่มีการจัดการ
-
ส่วนขยายที่ มีการตั้งค่าที่ได้รับการป้องกัน
-
ปรับใช้กับชุดเก็บคีย์คีย์ใน VM VM
ระบุ และ remediate VMs ที่มีอยู่
ระบุ
เมื่อต้องการตรวจสอบว่า คุณมีแป้นเพิ่มเติม ตรวจทานแฟ้มคีย์ที่ได้รับอนุญาต (แฟ้ม.ssh/authorized_keys vi) เพื่อตรวจสอบว่า มีการเพิ่มคีย์เพิ่มเติมใด ๆ ที่คุณไม่ได้ตั้งใจที่จะรวมไว้
ไซต์มีความปลอดภัยไปด้วยตนเองเอาใด ๆ เติม ssh สาธารณะแป้นขึ้นไปซึ่งอาจมีการเพิ่ม จะไม่มีผลต่อลักษณะการทำงานที่มีการติดตั้งพร้อมกับการ VM ดังกล่าวจะไม่ส่งผลต่อการระบุ SSH คู่ของคีย์สำหรับการรับรองความถูกต้อง
ถ้าคุณไม่ทราบ หรือไม่สามารถแยกความแตกต่างที่คีย์สาธารณะในแฟ้ม.ssh/authorized_keys คุณระบุสำหรับการรับรองความถูกต้อง ให้ทำตามขั้นตอนเหล่านี้:
-
ตรวจทานการปรับใช้แม่แบบ:
-
ssh คีย์สาธารณะ
-
ssh คีย์ในการตั้งค่าคอนฟิก cloud init
-
-
เรียกการใช้งาน ssh คีย์ในเวลาที่สร้างจากภายใน VM ถ้าคุณสามารถเข้าถึง sudo/ราก เมื่อต้องการทำเช่นนี้ ให้ทำตามขั้นตอนเหล่านี้
-
ตรวจสอบการตั้งค่าคอนฟิก init เมฆที่ถูกส่งผ่านใน CustomData: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"ใช้ค่า CustomData และจากนั้น ใช้ base64 ถอดรหัสเพื่อรับคีย์สาธารณะที่คุณปรับใช้: echo "<customData value>" | base64 -D
-
อีกวิธีหนึ่งคือ ตรวจสอบการอินสแตนซ์ Meta ข้อมูลการบริการ (IMDS) เมื่อต้องการดู ssh คีย์สาธารณะที่ผ่านเข้ามาใน ssh คุณสมบัติของคีย์สาธารณะของสร้าง VM: curl -H Metadata:true "http://169.254.169.254/metadata/instance/compute/publicKeys?api-version=2018-04-02&format=json"
-
Remediate
ถ้าคุณได้ระบุใบรับรองที่คุณไม่ต้องการปรับใช้ VM จะไม่ เพิ่มเติม คุณสามารถลบสิ่งเหล่านี้ โดยการลบบรรทัดสอดคล้องจากแฟ้ม authorized_keys
เรียกใช้ด้านที่ ด้วยการเชื่อมต่อแบบ VM มีการโต้ตอบ หรือใช้นามสกุลของสคริปต์กำหนดเองหรือ RunCommand ที่ข้ามหลาย VMs
VMs ปรับใช้ โดยใช้ส่วนขยายที่มีป้องกันการตั้งค่าหรือข้อมูลเฉพาะตัวที่มีการจัดการ
ใช้สคริปต์ต่อไปนี้เพื่อลบคีย์สาธารณะจากใบรับรองที่ถูกปรับใช้กับส่วนขยาย 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 เพื่อให้แน่ใจว่า มีเฉพาะคีย์สาธารณะทราบ
VMs ที่ปรับใช้กับความลับกชุดเก็บคีย์
เมื่อต้องการระบุว่าคีย์ถูกเพิ่มเมื่อปรับใช้กับแป้นกชุดเก็บคีย์ ให้ทำตามขั้นตอนเหล่านี้:
-
ดูชื่อของใบรับรองกชุดเก็บคีย์ที่คุณปรับใช้ โดยใช้ VM ทบทวนรหัสของการปรับใช้ไม่ Az หรือแม่แบบ ARM หรือรันไม่ Az นี้: 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 ที่ระบุ:
-
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
รูปแบบกำหนดเอง
ถ้าคุณกำลังใช้รูปภาพกำหนดเองที่ถูกเตรียมใช้งาน โดยเมฆเริ่มต้นสำหรับระบบปฏิบัติการที่รู้จัก คุณจะต้องปรับปรุงรูปแบบกำหนดเองของต้นฉบับของคุณ
รูป 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 โดยใช้ขั้นตอนเหล่านี้(หรือวิธีการคล้ายกัน), คุณต้องปรับปรุงรูปต้นฉบับที่คุณสร้างขึ้นมาแบบ VMs ต่อไปนี้คือ ขั้นตอนเพิ่มเติมที่จำเป็นเพื่อเพิ่มโครงรูป 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
แพคเกจ init เมฆทั้งหมดที่มีการแก้ไขกำลังอยู่ในระหว่างการปรับปรุง Microsoft กำลังทำการวิจัยปัญหานี้ และจะโพสต์ข้อมูลเพิ่มเติมในบทความนี้เมื่อข้อมูลที่พร้อมใช้งาน
คำถามที่ถามบ่อย
Q1: มี Microsoft กำไรเข้าถึง VM ของฉันได้อย่างไร
A1: ใช้คีย์การเข้ารหัสลับในการจัดการรหัสประจำตัว และนามสกุลไม่ออกแบบมาสำหรับการเข้าถึง โดยพนักงานของ Microsoft เรามีกระบวนการในการตรวจสอบ บันทึก และป้องกันการเข้าถึงชนิดนี้ เป็นการระวังรักษาความปลอดภัย เราจะตรวจทานแฟ้มบันทึกทั้งหมดเพื่อให้แน่ใจว่า ไม่มีคีย์ลูกค้ามีการเข้าถึงโดยไม่เหมาะสม สำหรับใบรับรองที่เก็บอยู่ในชุดเก็บคีย์ที่ถูกอ้างอิงในการปรับใช้ VM หรือ VMSS พนักงานของ Microsoft ไม่ได้เข้าถึงเคล็ดลับ
Q2: มี OSs init เมฆที่ปรับใช้และรุ่นที่ได้รับผลกระทบทั้งหมดหรือไม่
A2: ไม่ เราได้เห็นประเด็นหลักนี้ไม่เกี่ยวข้องที่เกิดขึ้นในระบบปฏิบัติการที่ระบุเท่านั้น เราไม่เห็นจะเกิดขึ้นใน Ubuntu รุ่นที่เก่ากว่า เป็นเช่นนี้ เพราะระบบเหล่านั้นใช้กลไกต่าง ๆ เพื่อตั้งค่าคีย์สาธารณะ
Q3: ทำแพ็คเกจ init เมฆที่ได้รับผลกระทบสำหรับการกระจายการ Linux รวมการแก้ไขหรือไม่
A3: เรากำลังดำเนินการในการเพิ่มการแก้ไขไปที่แพคเกจสำหรับรุ่นได้รับผลกระทบ และเราจะปรับปรุงบทความนี้เมื่องานนั้นเสร็จสมบูรณ์แล้ว
Q4: จะ Microsoft อัพเด VMs ที่ได้รับผลกระทบใด ๆ หรือไม่
A4: ไม่ Microsoft จะไม่เปลี่ยนแปลงเนื้อหาของ VMs ที่คุณได้เตรียมใช้งานแล้ว
Q5: นโยบายความปลอดภัยของเราป้องกันไม่ให้ฉันทำ VM Linux กับเนื้อหาที่เกี่ยวข้องใน authorized_keys ฉันสามารถทำอะไรเกี่ยวกับเรื่องนี้ในวันนี้หรือไม่
A5: คุณสามารถลบบรรทัดมีได้อย่างปลอดภัยจากแฟ้ม authorized_keys สิ่งนี้จะกระทบ keypair SSH ที่คุณสร้างขึ้น และควบคุม หรือข้อมูลประจำตัวที่มีการจัดการ คุณสามารถทำเช่นนี้ด้วยตนเอง หรือ โดยการเรียกใช้สคริปต์แบบกำหนดเองหรือคำสั่งที่กำหนดเองระหว่างกลุ่มที่ได้รับผลกระทบใด ๆ