วิธีตั้งค่า UFW firewall บน VPS ให้ปลอดภัย
เรียนรู้วิธีใช้งาน UFW เพื่อตั้งค่า firewall บน VPS โดยเน้นการตั้งค่า default-deny และวิธีอนุญาตพอร์ต SSH เพื่อป้องกันปัญหาการถูกล็อกออกจากระบบหลังเปิดใช้งาน
UFW คืออะไรและทำไมคุณจึงควรใช้งาน
UFW ย่อมาจาก Uncomplicated Firewall ซึ่งเป็นชื่อที่ตรงไปตรงมา UFW ทำหน้าที่เป็นส่วนติดต่อผู้ใช้ (front end) ที่ใช้งานง่ายสำหรับ firewall ที่มีอยู่ใน Linux kernel อยู่แล้ว แทนที่จะต้องเขียนกฎแบบดิบ (raw rules) คุณสามารถใช้คำสั่งสั้นๆ อย่าง ufw allow 22/tcp ได้ บน VPS ที่ติดตั้งใหม่ บริการที่เปิดรับการเชื่อมต่อ (listening service) ทุกอย่างจะสามารถเข้าถึงได้จากอินเทอร์เน็ตโดยค่าเริ่มต้น การใช้ firewall จะเปลี่ยนสถานะดังกล่าว โดยเริ่มจากการปฏิเสธการเชื่อมต่อทั้งหมด แล้วจึงอนุญาตเฉพาะพอร์ตที่จำเป็นต้องใช้งานจริง การเปลี่ยนแปลงนี้เพียงอย่างเดียวสามารถลดความเสี่ยงจากการถูกโจมตีส่วนใหญ่ได้ด้วยคำสั่งเพียงประมาณ 4 คำสั่ง
ก่อนเริ่มใช้งาน คุณควรทราบว่ามีบริการใดบ้างที่กำลังเปิดรับการเชื่อมต่อ เนื่องจาก firewall จะเป็นตัวกำหนดสิทธิ์การเข้าถึงของบริการเหล่านั้น การใช้ ss -tlnp เพื่อ อ่านข้อมูลบริการที่กำลังเปิดรับการเชื่อมต่อ คือขั้นตอนแรกที่ถูกต้อง
กฎข้อเดียวที่ช่วยป้องกันไม่ให้คุณถูกล็อกออกจากระบบ
นี่คือข้อผิดพลาดที่ทำให้หลายคนกังวลเกี่ยวกับการใช้งาน firewall หากคุณเปิดใช้งาน UFW โดยตั้งค่า default-deny แต่ไม่ได้อนุญาต SSH ไว้ เมื่อ firewall เริ่มทำงาน การเชื่อมต่อของคุณจะถูกตัดขาดทันทีและทำให้ไม่สามารถกลับเข้าสู่ระบบได้ วิธีป้องกันคือต้องอนุญาต SSH ก่อนที่จะเปิดใช้งาน UFW เสมอ ขั้นตอนด้านล่างนี้คือลำดับขั้นตอนที่ปลอดภัยเพื่อป้องกันปัญหานี้
หากเกิดปัญหานี้ขึ้น คุณยังสามารถแก้ไขได้ โดยใช้ web console ของผู้ให้บริการผ่านทาง VNC หรือ serial เนื่องจากช่องทางดังกล่าวไม่ได้ใช้งานผ่าน SSH คุณจึงสามารถล็อกอินเพื่อรัน ufw disable หรือเพิ่ม rule ที่ขาดหายไปได้
Step 1: การตั้งค่า default policies
เริ่มต้นด้วยการสั่งให้ UFW ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมด และอนุญาตการเชื่อมต่อขาออกทั้งหมด:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming คือส่วนที่สำคัญที่สุด หมายความว่าพอร์ตใดก็ตามที่ไม่มีกฎ allow ระบุไว้จะถูกปิดกั้นจากภายนอก แม้ว่าจะมี service กำลังทำงานอยู่บนพอร์ตนั้นก็ตาม allow outgoing ช่วยให้ server ของคุณสามารถเชื่อมต่ออินเทอร์เน็ตเพื่อทำการ update และงานอื่นๆ ได้ตามปกติ คำสั่งทั้งสองนี้เป็นการเปลี่ยนค่า policy เท่านั้น จะยังไม่มีการบังคับใช้จนกว่าคุณจะเปิดใช้งาน UFW ใน step 3
Step 2: อนุญาตเฉพาะ port ที่จำเป็นต้องใช้งาน
ก่อนเริ่มเปิดใช้งาน ให้เปิด SSH ไว้เพื่อป้องกันการตัดการเชื่อมต่อ:
sudo ufw allow 22/tcpUFW สามารถจำกัดอัตราการเชื่อมต่อ (rate-limit) สำหรับ SSH ได้: sudo ufw limit 22/tcp จะอนุญาต port ดังกล่าว แต่จะบล็อกทุก address ที่มีการเชื่อมต่อตั้งแต่ 6 ครั้งขึ้นไปภายใน 30 วินาที ซึ่งช่วยป้องกันการโจมตีแบบ brute-force โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม
หากคุณใช้งาน web server ให้เปิดอนุญาต HTTP และ HTTPS ด้วย:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpอนุญาตเฉพาะบริการที่ต้องการเปิดให้สาธารณะเข้าถึงเท่านั้น สำหรับ database เช่น Postgres บน port 5432 ไม่ควรตั้งค่า allow rule โดยเด็ดขาด ควรตั้งค่า bind ไปที่ 127.0.0.1 เพื่อให้เข้าถึงได้เฉพาะภายในเครื่องเท่านั้น ทุก port ที่คุณเปิดคือช่องทางที่ต้องได้รับการป้องกัน ดังนั้นควรจำกัดรายการให้สั้นที่สุด
คุณสามารถสร้างชุดคำสั่ง ufw ทั้งหมดสำหรับ server ของคุณได้ที่นี่ แล้วจึงรันคำสั่งตามลำดับดังนี้:
Step 3: Enable, and confirm it is on
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สังเกตข้อมูลสองส่วนจากผลลัพธ์ Status: active หมายถึง firewall กำลังทำงานอยู่ และกฎทุกข้อจะปรากฏขึ้นสองครั้ง ครั้งแรกแบบปกติ และอีกครั้งพร้อมกับ (v6) ซึ่งระบุว่า UFW กำลังควบคุมทั้ง IPv6 และ IPv4 หากไม่พบแถว (v6) แสดงว่า IPv6 ไม่ได้รับการจัดการ ซึ่งเป็นปัญหาที่ต้องระวังและมีรายละเอียดใน the IPv6 firewall post
การจัดการกฎในภายหลัง
หากต้องการดูรายการกฎพร้อมหมายเลขเพื่อใช้ในการลบกฎ:
sudo ufw status numbered
sudo ufw delete 3หากต้องการอนุญาตให้เข้าถึงพอร์ตได้จากเพียงที่อยู่เดียว ซึ่งเป็นวิธีที่ดีในการเปิดบริการ admin ให้เข้าถึงได้เฉพาะจาก IP ของคุณเท่านั้น:
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpFirewall เป็นเพียงการป้องกันชั้นหนึ่งเท่านั้น ระบบนี้ควบคุมสิ่งที่สามารถเข้าถึงพอร์ตได้ แต่ไม่สามารถชะลอการโจมตีแบบ brute force ที่พยายามเชื่อมต่อพอร์ตที่เปิดทิ้งไว้ เช่น SSH ได้ สำหรับกรณีนี้ ควรติดตั้ง Fail2ban เพื่อใช้งานร่วมกับ SSH เพื่อแบนผู้ที่พยายามบุกรุกซ้ำๆ การป้องกันแบบ Defence in depth หมายถึงการที่แต่ละชั้นจะช่วยป้องกันในส่วนที่ชั้นอื่นไม่สามารถทำได้
การใช้งาน Firewall จะมีประสิทธิภาพก็ต่อเมื่อคุณเข้าใจ หลักการของพอร์ตและการทำงานของ service และการตั้งค่า Firewall คือขั้นตอนหนึ่งใน การตั้งค่า VPS ใหม่ในช่วง 10 นาทีแรก
FAQ
การเปิดใช้งาน UFW จะทำให้การเชื่อมต่อ SSH หลุดหรือไม่?
จะไม่หลุดหากคุณอนุญาต SSH ก่อน ให้รันคำสั่ง sudo ufw allow 22/tcp ก่อน sudo ufw enable เพื่อให้การเชื่อมต่อยังคงอยู่เนื่องจาก firewall อนุญาต port 22 แล้ว ความเสี่ยงจะเกิดขึ้นเมื่อเปิดใช้งาน firewall แบบ default-deny โดยไม่มีกฎ allow SSH ซึ่งจะทำให้คุณถูกตัดการเชื่อมต่อ หากเกิดเหตุการณ์ดังกล่าว ให้เข้าสู่ระบบผ่าน VNC หรือ serial console ของผู้ให้บริการแล้วรันคำสั่ง ufw disable
ควรเปิด port ใดบ้างบน VPS?
เปิดเฉพาะ port ที่ต้องให้บริการแก่สาธารณะเท่านั้น ได้แก่ SSH (22/tcp) เพื่อใช้ในการจัดการเครื่อง และ HTTP และ HTTPS (80/tcp, 443/tcp) หากคุณรันเว็บไซต์ ส่วนบริการอื่นๆ ควรตั้งค่าเป็น deny ไว้ทั้งหมด บริการภายใน เช่น database ควร bind ไว้ที่ 127.0.0.1 และไม่ต้องสร้างกฎ firewall ใดๆ เพื่อป้องกันไม่ให้เข้าถึงได้จากเครือข่าย
UFW รองรับ IPv6 หรือไม่?
บน Ubuntu เวอร์ชันปัจจุบัน รองรับ เนื่องจากมีการตั้งค่า IPV6=yes ใน /etc/default/ufw ทำให้แต่ละกฎมีผลกับทั้งสอง stack และ ufw status จะแสดงกฎ IPv6 พร้อมกับ suffix (v6) สำหรับปัญหาที่อาจเกิดขึ้นเกี่ยวกับ IPv6 สามารถอ่านเพิ่มเติมได้ที่ กับดัก IPv6 firewall
วิธีลบกฎของ UFW ทำอย่างไร?
รันคำสั่ง sudo ufw status numbered เพื่อแสดงรายการกฎพร้อมหมายเลข index จากนั้นรัน sudo ufw delete N โดยแทนที่ N ด้วยหมายเลขของกฎที่ต้องการลบ นอกจากนี้ยังสามารถลบโดยระบุรายละเอียดได้ เช่น sudo ufw delete allow 80/tcp
วิธีอนุญาต port ให้เข้าถึงได้เฉพาะจาก IP address เดียวทำอย่างไร?
ให้ใช้กฎแบบ from แทนการใช้ allow แบบปกติ หากต้องการให้เฉพาะ IP ของสำนักงานเข้าถึง PostgreSQL ได้ ให้รันคำสั่ง sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp ภายใต้นโยบาย default-deny port จะถูกปิดสำหรับทุกคนจนกว่าจะมีกฎมาเปิด ดังนั้นกฎ from นี้จึงเป็นช่องทางเดียวที่อนุญาตให้เข้าถึงได้ โดยอินเทอร์เน็ตทั้งหมดจะยังคงถูกบล็อกและมีเพียง address ที่ระบุเท่านั้นที่ผ่านเข้ามาได้ ห้ามเพิ่มกฎ allow 5432/tcp แบบปกติ เพราะจะทำให้ port เปิดให้ทุกคนเข้าถึงได้ นี่คือวิธีที่ปลอดภัยที่สุดในการเปิดใช้งาน database หรือ admin panel ตรวจสอบความถูกต้องด้วยคำสั่ง sudo ufw status verbose ซึ่งจะแสดง source address ควบคู่ไปกับ port