คีย์ WireGuard บน ESP32: แยกต่ออุปกรณ์หรือคีย์เดียวที่ฝังมา
คีย์ที่คอมไพล์ลงเฟิร์มแวร์ ESP32 คือตัวตนของ peer ไม่ใช่รหัสผ่าน ตัดสินด้วยสามเงื่อนไข: การครอบครอง การป้องกันแฟลช และการใช้ซ้ำทั่วทั้งฝูง
สเก็ตช์วางคีย์ส่วนตัวของ WireGuard ไว้ในอาร์เรย์อักขระ และอุโมงค์ก็ทำงานได้ นี่คือเหตุผลที่คำถามนี้กลับมาอีกครั้ง การตัดสินใจที่คุณต้องทำจริง ๆ ไม่ใช่ «ปลอดภัยหรือไม่» แต่เป็น «เงื่อนไขข้อใดในสามข้อใช้กับ deployment นี้» ได้แก่ ใครสามารถถืออุปกรณ์ได้จริง การอ่านแฟลชบนชิ้นส่วนของคุณให้ผลอะไร และฝูงแชร์คีย์เดียวหรือแต่ละเครื่องมีของตัวเอง ตอบคำถามเหล่านี้แล้วการออกแบบจะตามมา เพราะแต่ละเงื่อนไขเปลี่ยนต้นทุนของคีย์ที่รั่ว ไม่ใช่ข้อเท็จจริงที่มันอาจรั่ว
คีย์อนุญาตอะไร
WireGuard รับรอง peer ด้วยคีย์สาธารณะ เซิร์ฟเวอร์แมปคีย์สาธารณะของแต่ละ peer เข้ากับที่อยู่และ AllowedIPs รายการ ดังนั้นคีย์ส่วนตัวคือสิ่งที่ทำให้ไคลเอนต์ส่งทราฟฟิกจากที่อยู่นั้นได้
รายการเดียวกันกำหนดว่าเซิร์ฟเวอร์ปลายทางใดที่อุปกรณ์เข้าถึงได้ คีย์ที่รั่วจึงเปิดเผยทั้งเครือข่ายหลังอุโมงค์และที่อยู่ของอุโมงค์
เงื่อนไขข้อหนึ่ง: ใครถืออุปกรณ์ได้
ถ้าหน่วยอยู่ในตู้ที่ล็อกและไม่มีใครนอกทีมแตะต้อง การเปิดเผยจะเป็นเรื่องการกระจายเฟิร์มแวร์เป็นหลัก ถ้าส่งถึงลูกค้า อยู่ในรถ หรือถูกส่งคืนตามการรับประกัน การครอบครองทางกายภาพคือข้อมูลรับรอง และความลับของไบนารีเป็นเรื่องรอง ผู้ที่ถืออุปกรณ์ไม่จำเป็นต้องอ่านคีย์ เพราะเฟิร์มแวร์ที่รันอยู่จะเปิดอุโมงค์ให้เขา นี่คือเหตุผลที่คำตอบฝั่งเซิร์ฟเวอร์ต้องมีการเพิกถอนและอายุการใช้งานที่จำกัด ไม่ใช่แค่ภาพที่ป้องกันไว้
ตัดสินเงื่อนไขนี้ก่อนอีกสองข้อ เพราะมันกำหนดงบประมาณของทั้งสอง
เงื่อนไขข้อสอง: การอ่านแฟลชให้ผลอะไร
ใครก็ตามที่อ่านอิมเมจแฟลชได้จะกู้คีย์ที่เก็บเป็น literal กลับมา ไม่ว่าจะผ่านการเชื่อมต่อดีบัก ไฟล์อัปเดต สำรองข้อมูล หรือเครื่องที่ถูกส่งคืน การเข้ารหัสแฟลช เพิ่มต้นทุนของการดัมป์โดยตรง และเอกสาร ESP-IDF อธิบายว่าฟีเจอร์นี้ครอบคลุมอะไรสำหรับชิ้นส่วนและการกำหนดค่าหนึ่ง ๆ มันไม่ได้ทำให้คีย์ถูกสกัดออกไม่ได้ภายใต้ทุกรูปแบบการโจมตี และไม่ได้ช่วยอะไรในกรณีที่อุปกรณ์อยู่ในมือ มองมันเป็นชั้นหนึ่งที่เปลี่ยนต้นทุน ไม่ใช่คำตอบ
อ่านเอกสารแพลตฟอร์มสำหรับชิปและการกำหนดค่าที่แน่นอนของคุณก่อนจะอ้างคุณสมบัติในการรีวิวการออกแบบ
เงื่อนไขข้อสาม: การใช้ซ้ำทั่วทั้งฝูง
คีย์เดียวสำหรับล็อตการผลิตหมายความว่าทุกหน่วยแชร์ตัวตนเดียว เซิร์ฟเวอร์แยกพวกมันในบันทึกไม่ได้ เพิกถอนอันเดียวโดยไม่เพิกถอนทั้งหมดไม่ได้ และแยกโคลนจากของแท้ไม่ได้ คีย์ต่ออุปกรณ์แก้ทั้งสามข้อ ด้วยต้นทุนของขั้นตอนลงทะเบียนและการแมปหมายเลขซีเรียลกับคีย์สาธารณะ การแมปนั้นคือสินทรัพย์ที่เปลี่ยนการเพิกถอนให้เป็นการแก้ไขบรรทัดเดียวแทนการแฟลชทั้งฝูงใหม่
ถ้าฝูงคือห้าหน่วยบนม้านั่ง การแชร์คีย์อาจเป็นการแลกเปลี่ยนที่สมเหตุสมผล ถ้าเป็นห้าร้อยในสนาม นั่นไม่ใช่การแลกเปลี่ยนเลย
รูปแบบการลงทะเบียนที่ทำให้คีย์ต่ออุปกรณ์ใช้งานได้จริง
สร้างคู่คีย์บนอุปกรณ์เมื่อบูตครั้งแรก เก็บครึ่งส่วนตัวไว้ในที่จัดเก็บไม่ลบเลือนที่ได้รับการป้องกัน และส่งเฉพาะคีย์สาธารณะไปยังบริการลงทะเบียนที่จัดสรรที่อยู่และเขียนรายการ peer ตรวจสอบสิทธิ์การตอบกลับการลงทะเบียน มิฉะนั้นผู้โจมตีในเครือข่ายท้องถิ่นอาจลงทะเบียนคีย์ของตนกับบัญชีของคุณ ห้ามพิมพ์คีย์ส่วนตัวไปยังคอนโซลอนุกรมระหว่างการจัดเตรียม บันทึกหมายเลขซีเรียลของอุปกรณ์ข้างคีย์สาธารณะ เพื่อให้หน่วยที่หายไปตรงกับรายการ peer เพียงรายการเดียว
นั่นคือบริการเล็ก ๆ และนั่นคือความแตกต่างระหว่างฝูงที่คุณตรวจสอบได้กับฝูงที่คุณแค่แฟลชใหม่ได้
เวลา ปลายทาง และการตัดสินใจ
ตัวอย่างซิงโครไนซ์เวลาก่อนเริ่มอุโมงค์ และนั่นสำคัญเกินกว่า TLS: แฮนด์เชกของ WireGuard มีตราประทับเวลาเพื่อป้องกันการเล่นซ้ำ อุปกรณ์ที่บูตด้วยนาฬิกาผิดจึงอาจถูกปฏิเสธแฮนด์เชก ปลายทางเป็นชื่อโฮสต์ ซึ่งทำให้ DNS อยู่ในเส้นทางความเชื่อถือแม้คีย์สาธารณะของเซิร์ฟเวอร์ยังรับรอง peer ที่อยู่ผิดทำให้เสียความพยายามและเผยว่าอุปกรณ์ออนไลน์เมื่อใด จัดการทั้งสองอย่างก่อนจะเถียงเรื่องคีย์
แล้วตัดสิน: คีย์ที่แชร์กันเฉพาะขณะการครอบครองถูกควบคุมและฝูงยังเล็ก คีย์ต่ออุปกรณ์ทันทีที่ข้อใดข้อหนึ่งไม่จริงอีกต่อไป