OpenVPN tls-crypt-v2: บทบาทของคีย์ไคลเอนต์และ blob ที่ห่อไว้
โปรไฟล์ tls-crypt-v2 มีคีย์ควบคุมของไคลเอนต์และสำเนาที่ห่อไว้ซึ่งมีเพียงเซิร์ฟเวอร์เท่านั้นที่เปิดได้ เก็บแต่ละออบเจ็กต์และแต่ละขั้นตอนการเลิกใช้แยกจากกัน
การวางโปรไฟล์ tls-crypt-v2 ลงในตั๋วดูไม่เป็นอันตรายจนกว่าจะนับว่ามีอะไรอยู่ในไฟล์ คีย์ช่องควบคุมของไคลเอนต์อยู่ข้างสำเนาที่เข้ารหัสของคีย์เดียวกัน และออบเจ็กต์ที่สามคือคีย์ห่อ ซึ่งไม่เคยออกจากเซิร์ฟเวอร์ที่รับ ทั้งสามตอบคำถามต่างกันเกี่ยวกับการเก็บรักษา การแบ่งปัน และการเลิกใช้ การแยกพวกมันออกจากกันช่วยยุติข้อถกเถียงเชิงนโยบายส่วนใหญ่ก่อนจะเริ่ม
โปรไฟล์มีอะไรอยู่จริง
ครึ่งไคลเอนต์ของ tls-crypt-v2 คือคีย์บวกสำเนาที่ห่อไว้ ไคลเอนต์ใช้คีย์ธรรมดาเพื่อป้องกันช่องควบคุมและมอบสำเนาที่ห่อให้เซิร์ฟเวอร์ระหว่างการตั้งค่า เซิร์ฟเวอร์จึงกู้คีย์เดียวกันได้โดยไม่เก็บสำเนาข้อความธรรมดาต่อไคลเอนต์ คีย์ห่อทำให้การกู้นั้นเป็นไปได้และเป็นของฝั่งที่รับเท่านั้น ทุกอย่างด้านล่างมาจากตำแหน่งที่ออบเจ็กต์ทั้งสามอาศัยอยู่
| Object | Where it lives | What can open it | What a leak costs |
|---|---|---|---|
| Server wrapping key | accepting servers only | the unwrap step inside the server | every wrapped copy issued to that group becomes readable |
| Wrapped client key | inside the client profile | the server wrapping key | it names a client and exposes its metadata, but not the key inside |
| Client control key | inside the client profile, usable as-is | the client that owns it | someone can open handshakes as that client until the server refuses the key |
อ่านตารางตามการเก็บรักษา ไม่ใช่ตามชื่อ แล้วผลที่ตามมาจะชัดเอง การสูญเสียคีย์ห่อเป็นเหตุการณ์ที่แพง เพราะไม่มีอะไรในโปรไฟล์สร้างมันขึ้นใหม่ได้ และการกู้คืนอย่างซื่อตรงคือการออกกลุ่มใหม่ โปรไฟล์ที่รั่วไหลถูกกว่าแต่พบได้บ่อยกว่ามาก เพราะผู้คนวางโปรไฟล์ลงในตั๋วโดยเชื่อว่าสำเนาที่ห่อทำให้ไฟล์ปลอดภัยพอจะแบ่งปัน ความล้มเหลวสองแบบต้องการการตอบสนองต่างกัน จึงเก็บออบเจ็กต์แยกจากกัน
ทำไมสำเนาที่ห่อจึงไม่ใช่เรื่องทั้งหมด
โปรไฟล์บรรจุวัสดุไคลเอนต์ที่ใช้ได้พร้อมคู่ที่ห่อไว้ ดังนั้นการปกป้องสำเนาสำหรับเซิร์ฟเวอร์ไม่ได้บอกอะไรเกี่ยวกับการปกป้องไฟล์ blob ปลอดภัยที่จะส่งและไม่ปลอดภัยที่จะเผยแพร่ เมตาดาต้าข้างในมองเห็นได้โดยใครก็ตามที่ได้รับ blob รวมถึงใครก็ตามที่อ่านตั๋วที่มันถูกวางไว้ในภายหลัง
มองโปรไฟล์เป็นข้อมูลรับรอง ไม่ใช่ตัวอย่างการกำหนดค่า ไฟล์ที่รั่วไหลให้ตัวตนไคลเอนต์ที่ใช้งานได้แก่ผู้ถือ จนกว่าเซิร์ฟเวอร์จะเลิกยอมรับตัวตนนั้น และการห่อไม่ได้ทำอะไรเกี่ยวกับช่วงเวลานั้น ออกโปรไฟล์หนึ่งรายการต่อไคลเอนต์เพื่อให้การถอนยังเป็นการตัดสินใจเรื่องไฟล์เดียว และสำรองคีย์ห่อแยกจากการกำหนดค่าเซิร์ฟเวอร์ที่มันเปิดใช้งาน ทั้งสองนิสัยไม่ซ่อมโปรไฟล์ที่ถูกบุกรุก แต่ทั้งคู่กำหนดว่าตัวถัดไปจะถูกควบคุมได้เร็วเพียงใด
ฮุกตรวจสอบอยู่ตรงไหนในการจับมือ
ฮุกตรวจสอบทำงานก่อนที่สแต็ก TLS จะถูกเปิดเผย และหน้าที่ของมันคือตรวจสอบเมตาดาต้าที่บรรจุอยู่ใน blob ที่ห่อ มันได้รับเมตาดาต้าเหล่านั้นพร้อมสภาพแวดล้อมเล็กๆ ที่มีเอกสารกำกับ และมีวัสดุให้ทำงานน้อยกว่าฮุกพิสูจน์ตัวตน การสันนิษฐานว่ามันเห็นชื่อผู้ใช้ สถานะเซสชัน หรือตัวแปรปลั๊กอินเป็นวิธีปกติที่ฮุกนี้ถูกเขียนอย่างแย่ อ่านส่วนคู่มือของฮุกเองแทนการยืมความคาดหวังจากฮุกอื่น
สถานะออกของมันคือการตัดสินใจ ผลที่ไม่เป็นศูนย์ปฏิเสธไคลเอนต์และผลที่เป็นศูนย์ให้การจับมือดำเนินต่อ ดังนั้นนโยบายต้องบอกว่าเกิดอะไรขึ้นเมื่อเมตาดาต้าขาด หาไม่ได้ หรือไม่คาดคิด เขียนเส้นทางปฏิเสธก่อน แล้วจึงตัดสินว่าค่าใดยอมรับได้
tls-crypt-v2 /etc/openvpn/server/tcv2-server.key
tls-crypt-v2-verify /etc/openvpn/server/verify-client-metadata.shสองบรรทัดนั้นคือพื้นผิวนโยบายบนเซิร์ฟเวอร์ บรรทัดหนึ่งระบุคีย์ห่อ อีกบรรทัดระบุโปรแกรมที่ตัดสินไคลเอนต์แต่ละราย ทุกสิ่งที่น่าสนใจอยู่ในสคริปต์ ซึ่งสมควรได้รับการควบคุมเวอร์ชันและการทบทวนเช่นเดียวกับกฎการเข้าถึงอื่นๆ
บัญชี ใบรับรอง และคีย์ควบคุมเลิกใช้แยกจากกัน
การยอมรับช่องควบคุมแต่เนิ่นๆ ไม่ใช่การพิสูจน์ตัวตน เพราะมันเกิดขึ้นก่อนการตรวจสอบตัวตน TLS และก่อนการอนุญาตบัญชีใดๆ การปิดใช้งานบัญชี การเพิกถอนใบรับรอง และการปฏิเสธคีย์ควบคุมของไคลเอนต์เป็นสามการกระทำที่มีสามกลไก การติดตั้งที่ทำเพียงอย่างเดียวมีช่องโหว่ ไม่ใช่นโยบาย ปรับสามอย่างให้สอดคล้องกันโดยเจตนา และบันทึกว่าขั้นตอนใดใช้อำนาจใด
เวลาเป็นความแตกต่างที่สอง รายการยอมรับที่เปลี่ยนไปใช้กับการจับมือใหม่ ขณะที่เซสชันที่สร้างไว้แล้วยังทำงานต่อจนกว่าอะไรบางอย่างจะสิ้นสุดมัน การนับรายการในรายการใหม่เป็นหลักฐานว่าครั้งเก่าจบแล้วคือวิธีที่ไคลเอนต์ที่ถูกถอดยังเชื่อมต่ออยู่หลายชั่วโมง
อำนาจที่ไม่ปรับให้สอดคล้องทิ้งรูสองรูที่หาได้ง่ายในทางปฏิบัติ บัญชีอาจถูกปิดใช้งานขณะที่คีย์ควบคุมยังเปิดการจับมือ และใบรับรองอาจถูกเพิกถอนขณะที่นโยบายเมตาดาต้ายังรับไคลเอนต์คนเดิม ทั้งคู่เป็นความผิดเดียวกันในที่ต่างกัน เพราะผู้ปฏิบัติถือรายการเดียวเป็นอำนาจทั้งหมด วางรายการทั้งสามข้างกันตอนถอดออก แล้วความผิดจะมองเห็นได้
การออกและการถอนโปรไฟล์
การออกเป็นครึ่งที่ง่าย สร้างคีย์ไคลเอนต์ฝั่งที่รับ ส่งมอบโปรไฟล์ให้เจ้าของหนึ่งรายเท่านั้น เก็บวัสดุห่อไว้อย่างจำกัด และรันโปรแกรมตรวจสอบเดียวกันบนเซิร์ฟเวอร์ที่รับทุกเครื่อง การรับเข้าแบบถูกเป็นคุณสมบัติของทั้งกลุ่ม ไม่ใช่ของโฮสต์ใหม่สุด เซิร์ฟเวอร์ที่สองที่มีสคริปต์เก่าหรือหลวมกว่าจะกลายเป็นเส้นทางที่อ่อนแอที่สุดในการติดตั้งอย่างเงียบๆ
การถอนต้องทำสามขั้นตอนตามลำดับที่ตั้งใจ ปฏิเสธไคลเอนต์ในฮุกตรวจสอบเพื่อให้การจับมือใหม่ล้มเหลว เพิกถอนใบรับรองหากใช้ PKI และปิดใช้งานบัญชีเพื่อให้การอนุญาตภายหลังไม่มีอะไรให้อนุญาต จากนั้นสิ้นสุดเซสชันที่การยอมรับเดิมอนุญาตไว้ เพราะมันจะไม่สังเกตเห็นทั้งสามอย่าง ฝึกซ้ำลำดับบนไคลเอนต์ที่คุณยอมเสียได้
เมตาดาต้าในโปรไฟล์เป็นอินพุตสำหรับนโยบายนั้น ไม่ใช่หลักฐานว่าการควบคุมการเข้าถึงมีอยู่แล้ว เอกสารการออกแบบของ OpenVPN 2.6 อธิบายออบเจ็กต์และขอบเขตที่มันลากไว้ ขณะที่การบังคับใช้ยังอยู่กับผู้ปฏิบัติ