Security
สวัสดีน้องๆ! สมัยผมทำร้านเน็ต SiamCafe ยุค 90s เนี่ย เรื่อง Security นี่สำคัญสุดๆ เพราะเครื่องลูกข่ายแต่ละเครื่องคือขุมทรัพย์ข้อมูลลูกค้า แถมยังเป็นช่องทางให้พวก Hacker เข้ามาป่วนระบบได้ง่ายๆ หนึ่งในเครื่องมือสำคัญที่เราใช้กันคือ iptables นี่แหละ
iptables เนี่ย มันคือ Firewall ที่มาพร้อมกับ Linux Kernel ซึ่งทำหน้าที่เป็นเหมือน "ยาม" คอยตรวจตรา Packet ข้อมูลที่วิ่งเข้า-ออกจากเครื่องเรา ถ้า Packet ไหนไม่ได้รับอนุญาต ก็จะถูกสกัดกั้นทันที
ทำไมต้อง iptables น่ะเหรอ? ลองนึกภาพร้านเน็ตเราไม่มี Firewall สิครับ พวก Hacker ก็จะสามารถสแกนหาช่องโหว่ของเครื่องเราได้ง่ายๆ แล้วก็อาจจะเข้ามาขโมยข้อมูล, ติดตั้ง Malware, หรือแม้กระทั่งใช้เครื่องเราเป็นฐานโจมตี Server อื่นๆ ได้เลยนะ
iptables ช่วยป้องกันเราจากภัยคุกคามเหล่านี้ได้ โดยการกำหนดกฎ (rules) ที่ระบุว่า Packet แบบไหนที่เราอนุญาตให้ผ่าน และ Packet แบบไหนที่เราจะปฏิเสธ
iptables ทำงานโดยการตรวจสอบ Packet ข้อมูลที่วิ่งผ่าน Network Interface ของเรา โดยจะเปรียบเทียบ Packet นั้นๆ กับกฎที่เราได้กำหนดไว้ ถ้า Packet ตรงตามเงื่อนไขของกฎใดกฎหนึ่ง iptables ก็จะทำตาม Action ที่กำหนดไว้ในกฎนั้นๆ
Action ที่พบบ่อยๆ ก็คือ ACCEPT (อนุญาตให้ Packet ผ่าน), DROP (ทิ้ง Packet ไปเลย), และ REJECT (ปฏิเสธ Packet พร้อมส่งข้อความแจ้งเตือนกลับไปยังต้นทาง)
iptables มีโครงสร้างที่ค่อนข้างซับซ้อน แต่หลักๆ แล้วจะประกอบไปด้วย 2 ส่วนสำคัญคือ Chain และ Table
Table ที่เราจะใช้บ่อยที่สุดก็คือ filter Table ซึ่งมี Chains หลักๆ ดังนี้:
แต่ละ Chain จะมีกฎ (rules) เรียงกันเป็นลำดับ iptables จะตรวจสอบ Packet กับกฎแต่ละข้อตามลำดับ ถ้า Packet ตรงกับเงื่อนไขของกฎใด iptables ก็จะทำตาม Action ที่กำหนดไว้ในกฎนั้นๆ และหยุดการตรวจสอบกฎข้ออื่นๆ ทันที (ยกเว้นเราจะสั่งให้มันตรวจสอบต่อไป)
การใช้งาน iptables จะต้องใช้ผ่าน Command Line Interface (CLI) หรือ Terminal ซึ่งต้องใช้สิทธิ์ Root ในการ execute คำสั่งต่างๆ
คำสั่งพื้นฐานที่ควรรู้จักมีดังนี้:
สมมติว่าเราต้องการอนุญาตให้เครื่อง Server ของเรารับ HTTP Traffic (Port 80) ได้ เราสามารถทำได้ดังนี้:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
คำสั่งนี้หมายความว่า "เพิ่มกฎเข้าไปใน INPUT Chain โดยอนุญาต (ACCEPT) Packet ที่ใช้ Protocol TCP และมี Destination Port เป็น 80"
น้องๆ สามารถลองนำไปปรับใช้กับ Port อื่นๆ ได้ตามต้องการ เช่น Port 22 (SSH), Port 443 (HTTPS), หรือ Port อื่นๆ ที่จำเป็นสำหรับ Service ที่เราต้องการเปิดใช้งาน
สมัยก่อน Brute-Force Attack นี่เจอบ่อยมาก พวก Hacker จะพยายามสุ่มรหัสผ่านเพื่อเข้าถึงเครื่อง Server ของเรา iptables สามารถช่วยป้องกันได้ โดยการจำกัดจำนวนครั้งที่อนุญาตให้มีการ Login ผิดพลาด
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP
Code นี้จะทำการบันทึก IP Address ที่พยายามเชื่อมต่อ SSH (Port 22) เข้ามา ถ้า IP Address ใดพยายาม Login ผิดพลาดเกิน 4 ครั้งภายใน 60 วินาที ก็จะถูก Block ทันที
น้องๆ สามารถปรับค่า `--seconds` และ `--hitcount` ให้เหมาะสมกับสภาพแวดล้อมของตัวเองได้เลย
อย่าลืมแวะไปอ่านบทความอื่นๆ ที่ SiamCafe Blog นะครับ มีเรื่องราว IT สนุกๆ อีกเยอะเลย!
iptables มีความยืดหยุ่นสูง แต่ก็ค่อนข้างซับซ้อนสำหรับมือใหม่ ดังนั้นจึงมีเครื่องมือ Firewall ที่ใช้งานง่ายกว่าอย่าง UFW (Uncomplicated Firewall) ออกมาให้ใช้งานกัน
| คุณสมบัติ | iptables | UFW |
|---|---|---|
| ความซับซ้อน | สูง | ต่ำ |
| ความยืดหยุ่น | สูงมาก | ปานกลาง |
| ใช้งานง่าย | ยาก | ง่าย |
| เหมาะสำหรับ | ผู้ที่มีความรู้ Linux และ Network เป็นอย่างดี | ผู้เริ่มต้น และผู้ที่ต้องการ Firewall ที่ใช้งานง่าย |
ถ้าเป็นมือใหม่ ผมแนะนำให้ลองใช้ UFW ดูก่อนครับ เพราะใช้งานง่ายกว่าเยอะ แต่ถ้าต้องการความยืดหยุ่นที่สูงกว่า iptables ก็ยังเป็นตัวเลือกที่ดีอยู่
สำหรับคนที่สนใจเรื่อง Security เพิ่มเติม ลองเข้าไปดูที่ SiamCafe Blog นะครับ มี Tips & Tricks อีกเพียบ!
ดูวิดีโอเพิ่มเติมเกี่ยวกับFirewall iptables เบื้องต้น:
ทั้ง iptables และ firewalld เป็น Firewall บน Linux แต่ firewalld จะมี Dynamic Zone Management ที่ทำให้การจัดการ Firewall ง่ายขึ้นกว่า iptables ในขณะที่ iptables จะเน้นการ Config ผ่าน Command Line โดยตรง
โดยปกติ iptables rules จะไม่ถูกบันทึกโดยอัตโนมัติหลังจาก Reboot ดังนั้นเราต้องทำการ Save rules เหล่านั้นลงในไฟล์ แล้ว Load กลับมาตอน Startup วิธีการ Save และ Load rules จะแตกต่างกันไปตาม Distribution ของ Linux ที่เราใช้
# ตัวอย่างบน Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
# และเพิ่มคำสั่ง iptables-restore < /etc/iptables/rules.v4 ใน /etc/network/interfaces
iptables สามารถ Block ประเทศได้ โดยใช้ GeoIP Module ซึ่งจะทำการตรวจสอบ IP Address ต้นทางของ Packet แล้วเปรียบเทียบกับฐานข้อมูล GeoIP เพื่อระบุประเทศที่ Packet นั้นมาจากนั้นจึงทำการ Block Packet ที่มาจากประเทศที่เราต้องการ
สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่อง Firewall สำคัญมากๆ เพราะสมัยนั้น Hacker เยอะแยะ ยิ่งร้านเรามีเกมออนไลน์ดังๆ ยิ่งต้องระวังเป็นพิเศษ ผมเลยสรุป Best Practices ที่ใช้จริงมาให้:
ข้อนี้สำคัญสุดๆ คือ เริ่มต้นด้วยการปิดทุก Traffic ก่อน แล้วค่อยเปิดเฉพาะที่จำเป็นเท่านั้น สมัยก่อน default ที่ router มักจะเป็น Accept All ซึ่งอันตรายมาก
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
โค้ดด้านบนคือการตั้งค่า default policy ให้ DROP ทุก incoming และ forward traffic ส่วน outgoing traffic อนุญาตทั้งหมด (ACCEPT) เพราะเครื่องลูกต้องออกเน็ตได้
การ Log ทุก traffic ที่ถูก DROP จะช่วยให้เราวิเคราะห์ปัญหาและหาต้นตอของการโจมตีได้ง่ายขึ้น สมัยก่อนผมใช้ Logrotate ช่วยจัดการ Log file ไม่ให้มันใหญ่เกินไป
iptables -A INPUT -j LOG --log-prefix "iptables INPUT DROP: "
iptables -A FORWARD -j LOG --log-prefix "iptables FORWARD DROP: "
DDoS Attack เป็นปัญหาใหญ่สมัยนั้น การจำกัด Rate การเชื่อมต่อจาก IP เดียวกันจะช่วยลดผลกระทบได้เยอะ สมัยก่อนผมใช้ Module `limit` ของ iptables
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
โค้ดนี้อนุญาตให้ IP address เดียวกันเชื่อมต่อ Port 80 ได้ 25 ครั้งต่อนาที ถ้าเกินกว่านั้นจะถูก DROP
ข้อนี้สำคัญมาก Kernel และ iptables เวอร์ชั่นใหม่ๆ มักจะมี Patch แก้ไขช่องโหว่ด้านความปลอดภัยอยู่เสมอ การอัพเดทเป็นประจำจะช่วยลดความเสี่ยงจากการถูกโจมตีได้
iCafeForexมีน้องๆ หลายคนถามคำถามเกี่ยวกับ iptables เข้ามาเยอะ ผมเลยรวบรวมคำถามที่พบบ่อยมาตอบให้:
iptables เป็น Command-line tool ที่ใช้จัดการ Netfilter framework ใน Kernel ส่วน firewalld เป็น Firewall management tool ที่ทำงานบน iptables (หรือ nftables) อีกทีนึง firewalld ใช้งานง่ายกว่า แต่ iptables ยืดหยุ่นกว่า
iptables rule จะหายไปหลัง Reboot เพราะมันอยู่ใน RAM วิธีแก้คือต้อง Save rule ไว้ในไฟล์ แล้ว Load rule ตอน Boot ระบบ สมัยก่อนผมใช้ `iptables-save` และ `iptables-restore`
ทำได้ แต่ไม่ง่าย เพราะ HTTPS เว็บไซต์เข้ารหัส traffic ทำให้ iptables มองไม่เห็น URL ต้องใช้ Proxy server หรือ Deep Packet Inspection (DPI) เข้ามาช่วย
iptables ทำงานโดยการสร้าง Table (filter, nat, mangle) แต่ละ Table มี Chain (INPUT, OUTPUT, FORWARD) แต่ละ Chain มี Rule เมื่อ Packet วิ่งผ่าน Rule ไหนตรงตามเงื่อนไข ก็จะทำ Action ตามที่กำหนด (ACCEPT, DROP, REJECT)
iptables เป็นเครื่องมือ Firewall ที่ทรงพลัง แต่ก็ต้องใช้ความเข้าใจพอสมควรในการใช้งาน หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ ที่กำลังศึกษาเรื่อง Firewall นะครับ อย่าลืม Best Practices ที่ผมแนะนำไป รับรองร้านเน็ตปลอดภัยขึ้นเยอะ
ถ้าอยากอ่านเรื่องราวเกี่ยวกับร้านเน็ตสมัยก่อน หรือเรื่อง IT อื่นๆ เพิ่มเติม เข้าไปอ่านได้ที่ SiamCafe Blog นะครับ