ตั้งค่า UFW บน VPS ให้ปลอดภัยโดยไม่ล็อก SSH
เรียนรู้การตั้งค่า UFW บน VPS ด้วยนโยบาย default-deny อนุญาตเฉพาะพอร์ตที่จำเป็น และเปิดใช้งานโดยไม่ทำให้ SSH หลุดหรือเข้าเซิร์ฟเวอร์ไม่ได้
UFW คืออะไรและเหตุใดจึงควรใช้
UFW ย่อมาจาก Uncomplicated Firewall และชื่อนี้สื่อความหมายตรงตัว UFW เป็นส่วนติดต่อด้านหน้าที่ใช้งานง่ายสำหรับไฟร์วอลล์ที่มีอยู่ใน Linux kernel อยู่แล้ว ดังนั้นแทนที่จะเขียนกฎแบบดิบ คุณสามารถป้อนคำสั่งสั้น ๆ เช่น ufw allow 22/tcp ได้ โดยค่าเริ่มต้น บริการทุกอย่างที่กำลัง listening บน VPS ที่ติดตั้งใหม่จะเข้าถึงได้จากอินเทอร์เน็ต ไฟร์วอลล์จะเปลี่ยนแนวทางนี้เป็นตรงกันข้าม โดยปฏิเสธการเชื่อมต่อทั้งหมดก่อน แล้วจึงอนุญาตเฉพาะพอร์ตที่คุณใช้งานจริง การเปลี่ยนแปลงเพียงอย่างเดียวนี้จะลดช่องทางที่ระบบเปิดให้โจมตีได้เกือบทั้งหมดภายในคำสั่งประมาณ 4 คำสั่ง
ก่อนเริ่มใช้งาน ให้ตรวจสอบว่ามีสิ่งใดกำลัง listening อยู่ เพราะสิ่งเหล่านั้นคือบริการที่ไฟร์วอลล์จะกำหนดว่าจะอนุญาตหรือปฏิเสธ การตรวจสอบสิ่งที่กำลัง listening ด้วย ss -tlnp เป็นขั้นตอนแรกที่เหมาะสม
กฎข้อเดียวที่ช่วยป้องกันไม่ให้คุณล็อกตัวเองออกจากระบบ
ข้อผิดพลาดนี้ทำให้หลายคนไม่กล้าใช้ไฟร์วอลล์ คุณเปิดใช้งาน UFW พร้อมนโยบาย default-deny แต่ไม่ได้อนุญาต SSH ไว้ ดังนั้นทันทีที่ไฟร์วอลล์เริ่มทำงาน การเชื่อมต่อของคุณจะถูกตัด และคุณจะเข้าสู่ระบบกลับมาไม่ได้ ให้ป้องกันปัญหานี้โดยอนุญาต SSH ก่อนเปิดใช้งาน UFW เสมอ นี่คือหลักการทั้งหมด และขั้นตอนด้านล่างจะดำเนินการตามลำดับที่ปลอดภัย
หากเกิดปัญหานี้ขึ้น คุณยังแก้ไขได้ คอนโซลเว็บของผู้ให้บริการที่เชื่อมต่อผ่าน VNC หรือ serial ไม่ได้เชื่อมต่อผ่าน SSH ดังนั้นคุณจึงเข้าสู่ระบบผ่านคอนโซลดังกล่าว แล้วเรียกใช้ ufw disable หรือเพิ่มกฎที่ขาดหายไปได้
ขั้นตอนที่ 1: ตั้งค่านโยบายเริ่มต้น
เริ่มต้นด้วยการกำหนดให้ UFW ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมด และอนุญาตการเชื่อมต่อขาออกทั้งหมด:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming คือส่วนสำคัญ ซึ่งหมายความว่าพอร์ตใดก็ตามที่ไม่มี rule อนุญาตโดยชัดแจ้ง จะถูกปิดจากภายนอก แม้ว่าจะมี service กำลัง listening อยู่ก็ตาม allow outgoing อนุญาตให้ server ของคุณเชื่อมต่ออินเทอร์เน็ตได้ตามปกติ เพื่อรับการอัปเดตและดำเนินการอื่นที่เกี่ยวข้อง คำสั่งทั้งสองนี้เปลี่ยนเฉพาะ policy เท่านั้น ระบบจะยังไม่บังคับใช้นโยบายจนกว่าคุณจะ enable UFW ในขั้นตอนที่ 3
ขั้นตอนที่ 2: อนุญาตพอร์ตที่จำเป็นต้องใช้จริง
ก่อนเปิดใช้กฎ ให้เปิด SSH เพื่อไม่ให้การเชื่อมต่อของคุณหลุด:
sudo ufw allow 22/tcpUFW ยังจำกัดอัตราการเชื่อมต่อ SSH ให้คุณได้ด้วย: sudo ufw limit 22/tcp จะอนุญาตพอร์ต แต่บล็อกที่อยู่ใดก็ตามที่สร้างการเชื่อมต่อตั้งแต่หกครั้งขึ้นไปภายในสามสิบวินาที ซึ่งช่วยลดผลกระทบจากสคริปต์โจมตีแบบ brute-force โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม
หากคุณใช้เว็บเซิร์ฟเวอร์ ให้อนุญาต HTTP และ HTTPS ด้วย:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpอนุญาตเฉพาะบริการที่คุณเปิดให้สาธารณะเข้าถึงเท่านั้น ฐานข้อมูลอย่าง Postgres ที่พอร์ต 5432 แทบไม่ควรมี rule แบบ allow ให้ผูกบริการไว้กับ 127.0.0.1 แทน เพื่อให้เข้าถึงได้เฉพาะบนเครื่องนั้น ทุกพอร์ตที่คุณเปิดจะต้องได้รับการป้องกัน ดังนั้นควรรักษารายการให้สั้น
คุณยังสามารถสร้างชุดคำสั่ง ufw ทั้งหมดสำหรับเซิร์ฟเวอร์ของคุณที่นี่ แล้วเรียกใช้ตามลำดับ:
ขั้นตอนที่ 3: เปิดใช้งานและยืนยันว่าเปิดอยู่
sudo ufw enableระบบจะแจ้งเตือนว่าคำสั่งนี้อาจรบกวนการเชื่อมต่อ SSH ที่มีอยู่ เนื่องจากคุณอนุญาต 22/tcp ในขั้นตอนที่ 2 เซสชันของคุณจึงยังใช้งานต่อได้ ยืนยันผลลัพธ์:
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhereให้ตรวจสอบ 2 รายการที่นี่ Status: active หมายความว่าไฟร์วอลล์กำลังทำงาน และกฎทุกข้อจะแสดง 2 ครั้ง ครั้งหนึ่งเป็นรูปแบบปกติ และอีกครั้งมี (v6) ซึ่งแสดงว่า UFW ครอบคลุมทั้ง IPv6 และ IPv4 หากไม่มีบรรทัด (v6) แสดงว่าส่วน IPv6 ของคุณไม่ได้รับการจัดการ ซึ่งเป็นปัญหาอีกประการหนึ่งที่อธิบายไว้ใน บทความเกี่ยวกับไฟร์วอลล์ IPv6
การจัดการกฎในภายหลัง
ดูหมายเลขของกฎเพื่อให้สามารถลบกฎได้:
sudo ufw status numbered
sudo ufw delete 3อนุญาตพอร์ตจากที่อยู่เดียวเท่านั้น วิธีนี้เหมาะสำหรับเปิดบริการผู้ดูแลระบบให้เข้าถึงได้จาก IP ของคุณเองเท่านั้น:
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpแนวทางนี้ใช้ไม่ได้เมื่อ address ของคุณเองเปลี่ยน หรือเมื่อมีหลายเครื่องที่ต้องเชื่อมต่อ โดยวิธีแก้ที่ใช้ทั่วไปคือไม่เปิดพอร์ตสู่สาธารณะเลย แล้วเข้าถึงบริการผ่าน private network แทน ซึ่งเป็นจุดประสงค์ของ การประกาศ private subnet ของเซิร์ฟเวอร์ไปยัง tailnet
ไฟร์วอลล์เป็นการป้องกันชั้นหนึ่ง ไฟร์วอลล์ควบคุมสิ่งที่สามารถเข้าถึงพอร์ตได้ แต่ไม่ได้ลดความเร็วของผู้ที่พยายามเชื่อมต่อพอร์ตที่คุณเปิดทิ้งไว้ เช่น SSH สำหรับกรณีนี้ ให้เพิ่ม Fail2ban ด้านหน้า SSH เพื่อแบนผู้ที่กระทำซ้ำ การป้องกันหลายชั้นหมายความว่าแต่ละชั้นจะครอบคลุมสิ่งที่ชั้นอื่นไม่สามารถป้องกันได้
ไฟร์วอลล์จะมีประโยชน์ก็ต่อเมื่อคุณเข้าใจ พอร์ตคืออะไรและบริการรับการเชื่อมต่ออย่างไร และการกำหนดค่าไฟร์วอลล์เป็นขั้นตอนหนึ่งใน 10 นาทีแรกบน VPS ใหม่
FAQ
การเปิดใช้งาน UFW จะตัดการเชื่อมต่อ SSH ของฉันหรือไม่
ไม่ตัด หากคุณอนุญาต SSH ก่อน ให้เรียกใช้ sudo ufw allow 22/tcp ก่อน sudo ufw enable การเชื่อมต่อจะยังคงอยู่ เพราะไฟร์วอลล์อนุญาต port 22 แล้ว อันตรายเกิดจากการเปิดใช้งานไฟร์วอลล์ที่ปฏิเสธการเชื่อมต่อทั้งหมดเป็นค่าเริ่มต้นโดยไม่มี allow rule สำหรับ SSH ซึ่งจะทำให้คุณถูกตัดการเชื่อมต่อ หากเกิดกรณีนี้ ให้เข้าสู่ระบบผ่าน VNC หรือ serial console ของผู้ให้บริการ แล้วเรียกใช้ ufw disable
ควรเปิด port ใดบน VPS
เปิดเฉพาะ port ที่ให้บริการแก่สาธารณะเท่านั้น เปิด SSH (22/tcp) เพื่อจัดการเครื่อง และเปิด HTTP กับ HTTPS (80/tcp, 443/tcp) หากคุณให้บริการเว็บไซต์ ให้ port อื่นทั้งหมดถูกปฏิเสธ บริการภายใน เช่น ฐานข้อมูล ควร bind กับ 127.0.0.1 และไม่ต้องกำหนด firewall rule ใดๆ เพื่อไม่ให้เข้าถึงได้จาก network
UFW รองรับ IPv6 หรือไม่
รองรับบน Ubuntu รุ่นปัจจุบัน โดย IPV6=yes ถูกตั้งค่าไว้ใน /etc/default/ufw ดังนั้นแต่ละ rule จะมีผลกับทั้งสอง stack และ ufw status จะแสดง rule ของ IPv6 พร้อม suffix (v6) วิธีที่ยังทำให้เกิดปัญหาได้มีอธิบายไว้ใน กับดักของไฟร์วอลล์ IPv6
จะลบ UFW rule ได้อย่างไร
เรียกใช้ sudo ufw status numbered เพื่อแสดงรายการ rule พร้อมหมายเลขลำดับ จากนั้นเรียกใช้ sudo ufw delete N โดย N คือหมายเลขของ rule ที่ต้องการลบ คุณยังสามารถลบโดยระบุข้อกำหนดได้ เช่น sudo ufw delete allow 80/tcp
จะอนุญาตให้ port รับการเชื่อมต่อจาก IP address เดียวได้อย่างไร
ใช้ rule แบบ from แทน allow แบบทั่วไป หากต้องการให้เฉพาะ office address ของคุณเข้าถึง PostgreSQL ให้เรียกใช้ sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp เมื่อใช้นโยบายที่ปฏิเสธการเชื่อมต่อทั้งหมดเป็นค่าเริ่มต้น port จะปิดสำหรับทุกคนจนกว่าจะมี rule เปิดใช้งาน ดังนั้น rule แบบ from นี้จึงเป็นช่องทางเดียวที่อนุญาตให้เข้าถึงได้ โดย network ทั้งหมดจะยังถูกบล็อก และเฉพาะ address ที่คุณระบุเท่านั้นที่จะผ่านได้ อย่าเพิ่ม allow 5432/tcp แบบทั่วไปด้วย เพราะจะเปิด port ให้ทุกคนเข้าถึง วิธีนี้ปลอดภัยที่สุดสำหรับการเปิดเผยฐานข้อมูลหรือ admin panel ตรวจสอบผลด้วย sudo ufw status verbose ซึ่งจะแสดง source address ถัดจาก port