09 กุมภาพันธ์ 2559

Secure Software Design 101: Fail-Safe / Fail-Secure

ในการออกแบบด้าน Security ต้องมีการคำนึงถึงสถานการณ์ที่ไม่พึงประสงค์ที่อาจเกิดขึ้นเนื่องจากความผิดพลาด อุบัติเหตุ หรือสถานการณ์ผิดปกติใดๆ ที่ทำให้ระบบไม่สามารถทำงานได้ตามที่ต้องการ โดยทั่วไปมีจุดประสงค์สองประการคือ เพื่อให้ปลอดภัย (Safe) หรือเพื่อความมั่นคง (Secure) ซึ่งสองอย่างนี้ต่างกัน

ตัวอย่างที่แสดงให้เห็นความแตกต่างของทั้งสองแบบเช่น ในการออกแบบประตูบริเวณศูนย์ข้อมูล (Data Center) ซึ่งใช้ Access Control ในการควบคุมการเข้าออกศูนย์ข้อมูล ในกรณีที่เกิดเหตุฉุกเฉินเช่นเพลิงไหม้ ในบริเวณที่พนักงานนั่งทำงานจะต้องออกแบบให้ Fail-Safe คือหากไฟดับประตูต้องเปิดทันทีเพื่ออพยพคนออก แต่ห้องเครื่องศูนย์ข้อมูลจะต้องออกแบบให้ Fail-Secure คือเมื่อตัดไฟต้องปิดประตูเสมอเพื่อป้องกันคนเข้าถึงเครื่องแม่ข่ายหรืออุปกรณ์เครือข่ายโดยไม่ได้รับอนุญาต

หรือในกรณีอุปกรณ์ Security บนเครือข่าย อุปกรณ์ Firewall จะมีโครงสร้างเป็นแบบ Fail-Secure คือเมื่อมีการขัดข้อง จะแยกเครือข่ายที่เชื่อมกันออกจากกัน ไม่ยอมให้เครือข่ายข้ามถึงกัน แต่ IPS (Intrusion Prevention System) ซึ่งวางขวางระบบเครือข่ายเช่นกันจะทำในทางตรงกันข้าม คือหากขัดข้องจะมีการ Bypass เครือข่ายอัตโนมัติ ซึ่งเป็นแนวทาง Fail-Safe

แล้วในกรณีการออกแบบซอฟต์แวร์ เราจะใช้หลักการ Fail-Safe หรือ Fail-Secure อย่างไร ขอให้หลักการไว้คร่าวๆ ดังนี้

  • หากอยู่ในเงื่อนไขที่ต้องการ Availability มากกว่า Confidentiality หรือ Integrity ให้ออกแบบส่วนนั้นเป็น Fail-Safe เช่นการออกแบบ User Interface ต่างๆ บน Web Application เมื่อเกิด Error 4xx หรือ 5xx ก็ควรจะมี Landing Page ให้คำแนะนำกับผู้ใช้ และมีลิ้งค์ไปยังหน้าแรกที่เป็น Static Page หรือหน้า Login เพื่อป้องกันไม่ให้ผู้ใช้ดำเนินการที่ทำให้ระบบมีปัญหาเพิ่มขึ้นเช่นกดปุ่ม Refresh ของ Web Page เพื่อทำงานซ้ำ
  • หากอยู่ในเงื่อนไขที่ต้องการ Confidentiality หรือ Integrity มากกว่า Availability ให้ออกแบบส่วนนั้นเป็น Fail-Secure เช่นการทำ Financial Transaction หากเกิดข้อผิดพลาดทางใดทางหนึ่งเช่นการโอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่งของอีกธนาคาร สามารถตัดบัญชีต้นทางได้แต่ไม่สามารถเอาเข้าบัญชีปลายทางได้ไม่ว่าจะเกิดจากระบบที่ใช้โอน ผู้ให้บริการโอน (Switching) การสื่อสารขัดข้อง หรือกรณีใดก็แล้วแต่ จะต้องทำการย้อนกลับ (Rollback) ทันที

สิ่งหนึ่งที่สำคัญในการออกแบบซอฟต์แวร์ที่มีลักษณะ Fail-Safe/Fail-Secure ให้ได้ดีคือการจำลองกรณีผิดพลาดให้ได้มากที่สุดว่าเกิดจากอะไรได้บ้าง แล้วหาเส้นแบ่งในการตรวจสอบข้อผิดพลาดนั้นๆ (Threshold) เพื่อตัดสินใจว่าจะเข้าสู่กระบวนการจัดการความล้มเหลวของระบบ

จำไว้เสมอว่าซอฟต์แวร์ที่ดี ต้องออกแบบให้มีการจัดการข้อผิดพลาดเมื่อระบบส่วนใดส่วนหนึ่งทำงานล่มไม่เป็นไปตามความต้องการ

ตอนที่เกี่ยวข้อง