ไม่จำเป็นต้องมีไฟล์ชั่วคราวเพื่อสร้างคีย์ OpenVPN
การเก็บวัสดุของคีย์ไว้ในหน่วยความจำช่วยหลีกเลี่ยงวงจรชีวิตของไฟล์ ไม่ใช่การรั่วไหล แยกสตรีมเอาต์พุตกับสตรีมข้อผิดพลาดออกจากกัน แล้วถือว่าคีย์เป็นความลับหลังจากนั้น
การสร้างคีย์ไม่ต้องใช้ไฟล์ชั่วคราว และการข้ามมันไปช่วยแก้ได้น้อยกว่าที่คู่มือส่วนใหญ่บอกเป็นนัย สิ่งที่มันขจัดออกไปคือวงจรชีวิตของไฟล์กับช่วงชิงเชิงการล้างข้อมูลรอบๆ สิ่งที่มันปล่อยไว้ไม่แตะต้องคือทุกโอกาสที่จะทำความลับรั่วไหลในภายหลัง ปัญหาความถูกต้องในสคริปต์เหล่านี้มักอยู่ที่อื่น เพราะการวินิจฉัยกับวัสดุของคีย์เดินทางบนสตรีมคนละสาย
ไฟล์ไม่เคยเป็นจุดเสี่ยงอย่างที่คุณคิด
ไฟล์ชั่วคราวเป็นความเสี่ยงที่จับต้องได้เมื่อทุกคนอ่านได้ เมื่อมันรอดพ้นจากการล่ม หรือเมื่อขั้นตอนล้างข้อมูลถูกข้ามไปหลังเกิดข้อยกเว้น สิ่งเหล่านี้เป็นของจริงและคุ้มค่าที่จะแก้ พวกมันยังเป็นเรื่องเฉพาะที่ มองเห็นได้ และทดสอบได้ง่าย ตั้งชื่อแต่ละข้อในสคริปต์ของคุณเองก่อนจะสรุปว่าการเปลี่ยนแปลงเป็นเพียงเรื่องของภาพลักษณ์
ความเสี่ยงที่เงียบกว่าอยู่ปลายน้ำ: คีย์ที่ถูกพิมพ์ออกมาระหว่างการดีบัก ข้อยกเว้นที่ทำให้อ็อบเจ็กต์ผลลัพธ์ทั้งก้อนถูกแปลงเป็นอนุกรม ตัวจัดการการล่มที่เขียน core dump ตัวรวบรวมบันทึกที่รับพาธของไฟล์แล้วจึงรับเนื้อหา การหลีกเลี่ยงไฟล์ชั่วคราวไม่ได้ช่วยอะไรกับสิ่งเหล่านี้เลย และการเชื่อตรงกันข้ามคือวิธีที่การเขียนใหม่ด้วยความตั้งใจดีทำให้ความลับถูกเปิดเผยมากกว่าเดิม มองการเปลี่ยนแปลงนี้เป็นการปรับปรุงหนึ่งขั้นในลำดับ ไม่ใช่ทางแก้ทั้งหมด
ไคลเอนต์เขียนอะไรเมื่อไม่ได้ระบุชื่อไฟล์
ไคลเอนต์เวอร์ชันปัจจุบันส่งคีย์ที่สร้างขึ้นไปยังเอาต์พุตมาตรฐานเมื่อคำสั่งสร้างคีย์ได้รับโดยไม่มีพาธเอาต์พุต พฤติกรรมที่บันทึก ไว้นี้เองที่ทำให้แนวทางในหน่วยความจำใช้งานได้จริง และขจัดความจำเป็นของกลเม็ดเก่าที่ชี้เครื่องมือไปยังพาธของอุปกรณ์
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
ส่งคำสั่งเป็นรายการ ไม่ต้องมีการขยายเชลล์ตรงนี้ และการเปิดเชลล์จะทำให้ขอบเขตของอาร์กิวเมนต์ขึ้นอยู่กับเครื่องหมายคำพูดที่คุณไม่ได้ควบคุม ใช้ไฟล์เรียกทำงานที่ตั้งใจไว้ด้วยพาธสัมบูรณ์หากสคริปต์อาจทำงานด้วยพาธค้นหาที่ต่างจากที่คุณคาดไว้
การตรวจรหัสส่งคืนกันไม่ให้เส้นทางความสำเร็จดำเนินต่อหลังการเรียกที่ล้มเหลว หากไม่มี การตรวจนี้ สตริงไบต์ว่างอาจไหลต่อไปและล้มเหลวเพียงภายหลังมาก ในจุดที่คีย์ถูกใช้งานและข้อความข้อผิดพลาดไม่ได้กล่าวถึงการสร้างอีกเลย
สองสตรีม สองความหมาย
เอาต์พุตมาตรฐานพาคีย์ไป ข้อผิดพลาดมาตรฐานพาทุกสิ่งที่เครื่องมือต้องการบอกคุณ รวมถึงคำเตือนเกี่ยวกับการกำหนดค่า เวอร์ชัน และชนิดของคีย์ การเปลี่ยนเส้นทางทั้งสองไปยังบัฟเฟอร์เดียวคือความผิดพลาดที่ทำให้ได้คีย์ที่ดูน่าเชื่อถือโดยมีประโยคเย็บอยู่ตรงกลาง
แยกเส้นทางความล้มเหลวออกมาด้วย เมื่อการเรียกล้มเหลว ให้รายงานคำสั่งที่ล้มเหลวและสถานะออก แล้วตัดสินใจอย่างตั้งใจว่าส่วนใดของข้อผิดพลาดมาตรฐานปลอดภัยพอที่จะแสดง การเทอ็อบเจ็กต์ผลลัพธ์ทั้งก้อนลงบันทึกเป็นทางลัดที่พบบ่อย และมันอาจพาคีย์ไปด้วย
การอ่านที่ปลอดภัยสำหรับไบนารีมีความสำคัญหากคุณจะแฮชหรือเปรียบเทียบวัสดุในภายหลัง โหมดข้อความที่มีการเข้ารหัสไม่คาดคิดอาจเปลี่ยนไบต์ที่ไม่เคยถูกออกแบบให้เป็นข้อความ และคีย์ที่เปลี่ยนไปก็แยกจากคีย์ผิดไม่ออกจนกว่าการจับมือจะล้มเหลว
หากคุณยังจะเก็บไว้ ก็ทำอย่างตั้งใจ
การติดตั้งส่วนใหญ่สุดท้ายต้องมีคีย์อยู่บนดิสก์ บนเกตเวย์ หรือในที่เก็บความลับ เขียนมันหนึ่งครั้ง ด้วยสิทธิ์ที่จำกัดตั้งแต่การสร้างแทนการ chmod ทีหลัง และทำให้การเขียนเป็นอะตอม เพื่อให้ไฟล์บางส่วนไม่กลายเป็นไฟล์ที่บริการอ่านตอนเริ่มต้น การเปลี่ยนชื่อจากพาธในไดเรกทอรีเดียวกันมักเพียงพอสำหรับเรื่องนั้น ลบพาธจัดเตรียมบนสาขาความล้มเหลว เพราะการเขียนที่ล้มเหลวนั้นคือสำเนาที่คนมักลืม
ตั้งโหมดของไฟล์ตอนสร้าง และรักษาโหมดของไดเรกทอรีให้จำกัดด้วย หลีกเลี่ยงพาธใดๆ ใต้ตำแหน่งที่งานสำรองข้อมูลกวาดเก็บโดยไม่คิด เพราะความลับในสำรองข้อมูลรายคืนคือความลับในทุกสำเนาของสำรองข้อมูลนั้น เหตุผลเดียวกันใช้กับโวลุ่มที่แชร์ซึ่งบริการอื่นอ่านได้
คีย์ที่แชร์ไม่ใช่ตัวตน
การสร้างวัสดุนี้ไม่ได้ออกใบรับรอง ไม่ได้ลงทะเบียนไคลเอนต์ และไม่ได้ระบุว่าใครเป็นผู้เชื่อมต่อ คีย์ที่แชร์ปกป้องช่องทางระหว่างฝ่ายที่ไว้วางใจกันอยู่แล้ว ตัวตนยังคงมาจากใบรับรองและจากการพิสูจน์ตัวตนใดๆ ที่อยู่ข้างหน้า
ชนิดของคีย์ก็ใช้แทนกันไม่ได้ คีย์สมมาตรสำหรับคุณสมบัติหนึ่งไม่ใช่ตัวแทนโดยตรงสำหรับอีกอย่าง และรุ่นใหม่ๆ เพิ่มตัวแปรของตนเองโดยใช้ไฟล์ต่างกันที่แต่ละปลาย สร้างชนิดที่การกำหนดค่าของคุณระบุจริง แล้วใช้มันในบทบาทที่ชนิดนั้นกำหนด
ทดสอบผลลัพธ์ด้วยการเชื่อมต่อจริงแทนการดูขนาดไฟล์ หากการจับมือสำเร็จและบันทึกไม่แสดงคำเตือนเกี่ยวกับคีย์ เส้นทางการสร้างก็ถูกต้อง หากคีย์ถูกตัดขาดเพราะสตรีมถูกรวม เส้นทางการเชื่อมต่อจะล้มเหลวในลักษณะที่ชี้ไปยังฝ่ายตรงข้ามไม่ใช่สคริปต์