การตรวจสอบความปลอดภัยของผมค้างทุกคืน
การตรวจสอบความปลอดภัยประจำคืนของผมหยุดทำงาน
งาน cron ทำงานทุกเช้าเวลา 05:39 น. สคริปต์เริ่มทำงาน แต่ใน log ไม่แสดงอะไรเลย ไม่มีข้อผิดพลาดปรากฏขึ้น และไม่มีรายงานใดๆ ถูกเขียนลงในไฟล์
ผมใช้เวลาสองวันในการดีบั๊ก (debugging) และวิธีแก้ไขใช้โค้ด bash เพียงแค่สามบรรทัดเท่านั้น
ปัญหาก็คือความล้มเหลวแบบเงียบ (silent failure)
สคริปต์ของผมทำการตรวจสอบ 13 รายการ โดยมีหนึ่งรายการที่เรียกใช้การตรวจสอบความปลอดภัยเชิงลึกผ่าน CLI คำสั่งนั้นเกิดอาการค้าง (hanging) มันไม่ได้แจ้งข้อผิดพลาด แต่มันแค่รอไปเรื่อยๆ อย่างไม่มีที่สิ้นสุด
CLI รอการตอบสนองจาก gateway แต่ในสภาพแวดล้อมของ cron การตอบสนองนั้นไม่เคยมาถึง เนื่องจาก CLI ไม่มีระบบ timeout ภายในตัว มันจึงบล็อกสคริปต์ทั้งหมด และเพราะสคริปต์ทำงานไม่เสร็จ มันจึงไปไม่ถึงบรรทัดที่ใช้บันทึกรายงาน
ผมแก้ไขมันด้วยการเปลี่ยนแปลงเหล่านี้:
- ผมครอบคำสั่งด้วย timeout
- ผมเปลี่ยนข้อความแสดงข้อผิดพลาดเป็น "command timed out" แทนที่จะเป็น "not available"
- ผมใช้
set -eo pipefailเพื่อดักจับข้อผิดพลาดอย่างถูกต้อง
ตอนนี้รายงานมาตรงเวลาแล้ว หากการตรวจสอบค้าง รายงานก็ยังคงบันทึกตัวชี้วัด (metrics) อีก 12 รายการที่เหลือได้ รายงานที่ไม่สมบูรณ์ยังดีกว่าไม่มีรายงานเลย
เรื่องนี้สอนบทเรียน 3 ข้อเกี่ยวกับการทำ agent sandboxing ให้กับผม:
อย่าเชื่อใจว่า dependency จะแจ้งข้อผิดพลาดออกมาอย่างชัดเจน หากคุณเรียกใช้เครื่องมือภายนอกในงาน cron ให้ตั้งค่า timeout เสมอ ทุกอย่างต้องมีการรอที่มีขอบเขตจำกัด (bounded wait)
ออกแบบเพื่อรองรับความสำเร็จบางส่วน (partial success) ตรวจสอบให้แน่ใจว่าระบบของคุณจะเขียนรายงานออกมาได้ แม้ว่าจะมีบางส่วนล้มเหลวก็ตาม
หลีกเลี่ยงความล้มเหลวแบบเงียบ (silent failure) ความล้มเหลวที่ส่งเสียงดังจะทำให้คุณตื่นตัว แต่ความล้มเหลวแบบเงียบจะทำให้คุณพลาดข้อมูลสำคัญจนกระทั่งสายเกินไป
เมื่อคุณอนุญาตให้ agent รันคำสั่งได้ คุณก็ต้องรับเอาทุกรูปแบบความล้มเหลว (failure mode) ของคำสั่งเหล่านั้นมาด้วย การค้างของเครื่องมือเพียงตัวเดียวหมายถึงการค้างของ pipeline ทั้งหมดของคุณ
ความปลอดภัยไม่ใช่แค่เรื่องของการหยุดยั้งผู้ไม่หวังดีเท่านั้น แต่ยังเป็นเรื่องของการทำให้แน่ใจว่าโครงสร้างพื้นฐานของคุณจะแจ้งเตือนความล้มเหลวออกมาดังพอที่คุณจะสังเกตเห็นได้
หากคุณรันสคริปต์อัตโนมัติที่เรียกใช้เครื่องมือภายนอก ลองตรวจสอบค่า timeout ของคุณในสัปดาห์นี้ดู
Optional learning community: https://t.me/GyaanSetuAi