Security
น้องๆ เคยสงสัยไหมว่าเวลาเครื่องเรามีปัญหา จะรู้ได้ยังไงว่ามันเกิดอะไรขึ้น? หรือถ้ามีคนแอบเข้ามาในระบบ เราจะจับได้ไหม? สมัยผมทำร้านเน็ตเมื่อก่อนนะ ปัญหาพวกนี้ปวดหัวมาก ต้องงมหา log กันให้วุ่นวาย แต่เดี๋ยวนี้มี eBPF นี่แหละ ที่เข้ามาช่วยให้ชีวิตเราง่ายขึ้นเยอะเลย
eBPF (Extended Berkeley Packet Filter) มันคือเทคโนโลยีที่ทำให้เราสามารถรันโปรแกรมเล็กๆ ใน kernel ของ Linux ได้โดยไม่ต้องแก้ kernel เอง ฟังดูยากใช่ไหม? ลองนึกภาพว่า kernel คือบ้านของเรา แล้ว eBPF คือแขกที่เราอนุญาตให้เข้ามาดูลาดเลาในบ้านได้ แต่แขกคนนี้ทำอะไรนอกเหนือจากที่บอกไม่ได้นะ เพราะเราควบคุมเขาอยู่
ทีนี้พอเรามี eBPF เราก็สามารถใช้มันเพื่อ Observability (การสังเกตการณ์) และ Security (ความปลอดภัย) ได้อย่างมีประสิทธิภาพ เพราะมันทำงานใน kernel เลย ทำให้เราเห็นข้อมูลที่ละเอียดมากๆ และตอบสนองต่อเหตุการณ์ต่างๆ ได้อย่างรวดเร็ว
ก่อนจะไปถึงการใช้งานจริง เรามาดูกันก่อนว่ามีอะไรที่เราต้องรู้บ้างเกี่ยวกับ eBPF
kernel คือหัวใจของระบบปฏิบัติการ Linux มันเป็นตัวกลางที่คอยจัดการทรัพยากรต่างๆ ของเครื่อง เช่น CPU, memory, disk และ network สมัยก่อนถ้าเราอยากจะแก้ kernel เราต้อง compile ใหม่หมด ซึ่งมันยุ่งยากและเสี่ยงมาก แต่ eBPF ทำให้เราสามารถเพิ่ม functionality เข้าไปใน kernel ได้โดยไม่ต้อง compile ใหม่
BPF Map คือ data structure ที่ใช้เก็บข้อมูลระหว่าง eBPF program กับ user space program (โปรแกรมที่เราเขียนขึ้นมาเอง) ลองนึกภาพว่ามันคือกระดานที่เราใช้เขียนข้อความให้ eBPF program กับ user space program อ่านกันได้
// Example of a BPF map
BPF_HASH(my_map, u32, u64);
eBPF program มีหลายประเภท แต่ละประเภทก็มีหน้าที่แตกต่างกันไป เช่น:
เอาล่ะ มาถึงส่วนที่สนุกที่สุดแล้ว นั่นก็คือการใช้งาน eBPF จริงๆ สมัยผมเริ่มเล่น eBPF ใหม่ๆ ก็งงเหมือนกัน แต่พอเข้าใจ concept แล้ว มันก็ไม่ยากอย่างที่คิด
BCC คือ toolset ที่ช่วยให้เราเขียน eBPF program ได้ง่ายขึ้น มันมี library และ compiler ที่จำเป็นสำหรับการพัฒนา eBPF program
sudo apt-get update
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
เราจะเขียน eBPF program ด้วยภาษา C แล้ว compile ด้วย BCC ตัวอย่างนี้เราจะเขียนโปรแกรมที่ print ข้อความ "Hello, eBPF!" ทุกครั้งที่มีการเรียก function sys_enter_open ใน kernel
#include <uapi/linux/ptrace.h>
int kprobe__sys_enter_open(struct pt_regs *ctx) {
bpf_trace_printk("Hello, eBPF!\\n");
return 0;
}
save เป็นไฟล์ hello.c
ใช้ BCC compile และ run eBPF program ของเรา
sudo /usr/share/bcc/tools/kp robe -r p:sys_enter_open hello.c
ถ้าทุกอย่างเรียบร้อย เราจะเห็นข้อความ "Hello, eBPF!" ปรากฏใน terminal ทุกครั้งที่เราเปิดไฟล์
แน่นอนว่า eBPF ไม่ใช่ทางเลือกเดียวสำหรับการทำ Observability และ Security แต่เมื่อเทียบกับทางเลือกอื่นๆ แล้ว eBPF มีข้อดีหลายอย่าง
| Technology | Pros | Cons |
|---|---|---|
| Syscall Auditing | ง่ายต่อการใช้งาน, built-in | overhead สูง, ข้อมูลจำกัด |
| Kernel Modules | flexible มาก, เข้าถึงข้อมูลได้เยอะ | เสี่ยงต่อ kernel crash, ต้อง compile ใหม่ |
| eBPF | performance ดี, secure, ไม่ต้อง compile kernel | learning curve สูง, ต้องเขียน code เอง |
จากตารางจะเห็นว่า eBPF มีข้อดีในเรื่องของ performance และ security แต่ก็ต้องแลกมาด้วย learning curve ที่สูงกว่า ซึ่งก็เป็นเรื่องธรรมดาของเทคโนโลยีใหม่ๆ
ถ้าใครอยากศึกษาเพิ่มเติม ลองเข้าไปดูที่ SiamCafe Blog ได้เลยครับ ผมเขียนบทความเกี่ยวกับ eBPF ไว้เยอะเหมือนกัน
สมัยผมทำร้านเน็ต ผมเคยเจอเคสที่เครื่องลูกข่ายโดนแฮก แล้วเอาไปขุด Bitcoin ซึ่งกว่าจะรู้ตัวก็เสียเงินค่าไฟไปเยอะมาก ถ้าตอนนั้นมี eBPF ผมคงจับได้เร็วกว่านี้เยอะ
eBPF เป็นเทคโนโลยีที่มีศักยภาพสูงมาก และผมเชื่อว่ามันจะเข้ามามีบทบาทสำคัญในโลกของ IT มากขึ้นเรื่อยๆ ในอนาคต ถ้าใครสนใจก็ลองศึกษาดูนะครับ รับรองว่าไม่ผิดหวัง
สำหรับใครที่อยากลองทำตาม tutorial นี้ แต่ขี้เกียจ setup environment เอง ลองใช้ SiamCafe Blog Docker container ก็ได้นะ ผมทำไว้ให้เรียบร้อยแล้ว
เอาล่ะน้องๆ มาถึงส่วนสำคัญแล้ว หลังจากที่เราเข้าใจ eBPF ในแง่มุมของ Security กันไปแล้ว คราวนี้มาดูเคล็ดลับที่พี่ใช้จริงตอนทำร้านเน็ต SiamCafe กันบ้างดีกว่า บอกเลยว่ายุคนั้นอะไรใหม่ๆ นี่พี่ลองหมด!
eBPF มันทรงพลังจริง แต่ถ้าใช้ไม่ถูกวิธี แทนที่จะป้องกัน กลับกลายเป็นเปิดช่องโหว่ให้ Hacker ซะงั้น
สมัยก่อนตอนทำร้านเน็ตนี่ พี่แทบจะลงโปรแกรมอะไรก็ได้ในเครื่องลูกข่าย เพราะเด็กมันอยากเล่นเกมใหม่ๆ ตลอด แต่พอมาถึงเรื่อง eBPF นี่ต้องคิดหนัก เพราะถ้าใครสักคน (หรือโปรแกรม malware) เข้าถึง Kernel ได้โดยตรง นี่จบเห่เลย
หลักการง่ายๆ คือ Least Privilege ใครไม่จำเป็นต้องใช้ อย่าให้สิทธิ์! eBPF Programs ควรถูกจำกัดให้รันได้เฉพาะ User ที่ได้รับอนุญาตเท่านั้น
# ตัวอย่างการใช้ Capability เพื่อจำกัดสิทธิ์
setcap cap_bpf=ep your_ebpf_program
โค้ดด้านบนเป็นการใช้ `setcap` เพื่อให้ Program ของเรามีความสามารถ `cap_bpf` ซึ่งจำเป็นต่อการรัน eBPF Program โดยไม่ต้องใช้สิทธิ์ root
eBPF Programs เนี่ย มันเหมือนโค้ดที่เราเขียนขึ้นมาเองนั่นแหละ มีโอกาสที่จะมี Bug หรือช่องโหว่ได้ทั้งนั้น ดังนั้น ก่อนเอาขึ้น Production (หรือก่อนปล่อยให้ลูกค้าร้านเน็ตใช้) ต้อง Code Review อย่างละเอียด
สมัยก่อนพี่จะเรียกเพื่อนๆ ที่เก่งๆ มาช่วยกันดูโค้ด ช่วยกันหาจุดผิดพลาด หรือช่องโหว่ที่อาจเกิดขึ้นได้ ยิ่งมีคนช่วยกันดูเยอะ โอกาสที่จะเจอช่องโหว่ก็ยิ่งมากขึ้น
มองหาจุดที่อาจเกิด Buffer Overflow, Integer Overflow, หรือ Race Condition พวกนี้อันตรายทั้งนั้น
eBPF มันช่วยให้เรา Observability ระบบได้ดีขึ้นก็จริง แต่ถ้าเราไม่เฝ้าดูมันอย่างใกล้ชิด ก็เหมือนมีกล้องวงจรปิด แต่ไม่มีคนดู
พี่แนะนำให้ติดตั้งระบบ Monitoring ที่สามารถตรวจจับพฤติกรรมผิดปกติของ eBPF Programs ได้ เช่น CPU Usage สูงผิดปกติ, Memory Leak, หรือ Network Traffic ที่เปลี่ยนแปลงไปอย่างรวดเร็ว แล้วก็ตั้ง Alerting ไว้ ถ้าเจออะไรแปลกๆ จะได้รีบเข้าไปดูทันที
ลองใช้ Tools อย่าง Prometheus, Grafana, หรือ Elastic Stack มาช่วยก็ได้ พวกนี้มี Dashboard สำเร็จรูปให้ใช้เยอะแยะ
ตอบ: ได้ครับ eBPF สามารถใช้ตรวจจับพฤติกรรมที่น่าสงสัยของ Ransomware ได้ เช่น การเข้าถึงไฟล์จำนวนมากในเวลาอันรวดเร็ว, การเข้ารหัสไฟล์, หรือการสร้างไฟล์แปลกๆ ขึ้นมา แต่ต้อง Config ให้ดีๆ นะ ไม่งั้นอาจ False Positive ได้
ตอบ: มีโอกาสครับ ถ้า eBPF Program มี Bug หรือเขียนมาไม่ดี มันอาจทำให้ Kernel Crash ได้ ดังนั้น ต้อง Test ให้ละเอียดก่อนเอาไปใช้จริง แล้วก็อย่าลืม Backup ข้อมูลไว้ด้วย
ตอบ: eBPF มี Learning Curve ที่ค่อนข้างสูงครับ แต่ไม่ต้องถึงกับเป็นเทพ Programmer ก็ใช้ได้ เดี๋ยวนี้มี Tools และ Library ต่างๆ ที่ช่วยให้การเขียน eBPF Programs ง่ายขึ้นเยอะ ลองศึกษาดูครับ ไม่ยากอย่างที่คิด
ตอบ: เริ่มจาก Document ของ Cilium, BCC, หรือ bpftrace ก็ได้ครับ แล้วก็ลองหา Tutorial หรือ Workshop ที่สอนเรื่อง eBPF ดู สมัยนี้มี Content ฟรีๆ ให้เรียนเยอะแยะ
eBPF เป็นเครื่องมือที่ทรงพลังมากในด้าน Security แต่ต้องใช้อย่างระมัดระวัง จำไว้เสมอว่า Security is a Process, not a Product มันไม่ใช่แค่การติดตั้งโปรแกรม แล้วจบ เราต้อง Monitor, Review, และปรับปรุงระบบของเราอยู่เสมอ
ถ้าใครอยากลงทุน Forex ลองดู iCafeForex นะครับ เผื่อจะได้เงินมาอัพเกรด Server ร้านเน็ต!
สุดท้ายนี้ ถ้าอยากอ่านเรื่อง IT สนุกๆ ก็แวะไปดูที่ SiamCafe Blog ได้นะ พี่เขียนไว้เยอะเลย