จำกัดการเข้าถึงเซิร์ฟเวอร์และวาง WAF ไว้หน้าแอปของคุณ
ตั้งแต่การ deploy ครั้งแรก
erpc worker จะอนุญาต SSH จากที่อยู่ของคุณเท่านั้น และ drop การเชื่อมต่อขาเข้าอื่นทั้งหมด ส่วนตาราง [waf] จะวาง proxy สำหรับกรองไว้หน้า API ของคุณหน้านี้อธิบาย ERPC CLI
v0.1.0-rc.4 ซึ่งเป็นเวอร์ชัน pre-releaseไฟร์วอลล์
การ deploy จะตั้งค่าไฟร์วอลล์ของเซิร์ฟเวอร์ก่อนที่แอปจะเริ่มทำงานครั้งแรก:
- SSH ได้เฉพาะจาก
firewall.ssh_allowและจากที่อยู่ต้นทางของการ deploy - การเชื่อมต่อขาเข้าอื่นทั้งหมดถูก drop ยกเว้น
run.portจากfirewall.app_allowส่วนแอปที่อยู่หลัง WAF จะเป็นพอร์ตของ WAF แทน และเฉพาะเมื่อ WAF บนเซิร์ฟเวอร์รันกฎที่[waf]กำหนดในตอนนี้อยู่แล้วเท่านั้น (ด้านล่าง)
การเปลี่ยนแปลงแต่ละครั้งทำงานภายใต้ตัวจับเวลา rollback 120 วินาที และจะถูกคงไว้ก็ต่อเมื่อการเชื่อมต่อใหม่เข้ามาได้แล้วเท่านั้น การเปลี่ยนแปลงที่ผิดพลาดจึงไม่สามารถทำให้คุณถูกกันออกจากเซิร์ฟเวอร์ได้
อย่างไรก็ตาม allowlist จะยังคงอยู่แม้ที่อยู่ที่ใช้สร้างมันจะเปลี่ยนไปแล้ว: หากที่อยู่ IP ที่บ้านของคุณเปลี่ยน ทางกลับเข้าไปคือทีมสนับสนุนของ ERPC สำหรับเซิร์ฟเวอร์ของ ERPC หรือคอนโซลของผู้ให้บริการสำหรับเซิร์ฟเวอร์ของคุณเอง โปรดใส่ที่อยู่ที่สองที่คุณใช้เข้าถึงเซิร์ฟเวอร์ได้ (ออฟฟิศ หรือ VPN exit) ไว้ใน
firewall.ssh_allow ก่อนที่จะไว้ใจที่อยู่ IP ที่บ้านหากที่อยู่ของคุณเปลี่ยน ให้เพิ่มที่อยู่คงที่ทุกที่อยู่ที่ผู้ดูแลระบบของคุณใช้:
bash
วาง WAF ไว้หน้าแอปของคุณ
เพิ่มตารางหนึ่งตารางใน
erpc.toml:toml
จากนั้น
erpc worker deploy จะรัน HTTP reverse proxy บนเซิร์ฟเวอร์ใน systemd unit ของตัวเอง (erpc-waf-<app>-<env>): ทำงานในฐานะ dynamic user ที่ไม่มีสิทธิ์พิเศษ ไม่มีคีย์ ไม่มี secret และไม่มีสิ่งใดของ worker และถูกจำกัดหน่วยความจำไว้ที่ 1 GiB WAF รอรับการเชื่อมต่อที่ waf.port อ่านคำขอแต่ละรายการก่อนที่แอปจะอ่าน ปฏิเสธสิ่งที่กฎของ WAF ระบุ และส่งต่อส่วนที่เหลือไปยังแอปที่ 127.0.0.1:<run.port>-
แอปยังอยู่บน loopback พอร์ตของแอปเองจะไม่ถูกเปิดให้เข้าถึงจากภายนอกเลย
erpc worker apiและ health check เข้าถึงแอปผ่าน loopback โดยไม่ผ่าน WAF -
ใครเชื่อมต่อได้ยังคงเป็นไปตามรายการของไฟร์วอลล์ และพอร์ตของ WAF เป็นที่เดียวที่รายการนั้นอนุญาตให้ทุกคนได้:shเมื่อไม่มีใครอยู่ในรายการ WAF จะรอรับการเชื่อมต่อแต่ไม่มีใครได้รับอนุญาตให้เข้ามา และการ deploy จะแจ้งเรื่องนี้
-
พอร์ตจะเปิดเมื่อ WAF รอรับการเชื่อมต่อบนพอร์ตนั้นแล้ว ไม่เปิดก่อนหน้านั้นเลย การ deploy ที่ WAF ไม่ขึ้นมาทำงานจะล้มเหลวและแจ้งสาเหตุ โดยที่แอปยังคงทำงานอยู่
-
เมื่อคุณเปลี่ยน
[waf]พอร์ตจะไม่เปิดให้ใครรายใหม่จนกว่าการ deploy จะนำกฎใหม่ไปใช้แล้ว -
การนำ
[waf]ออกจากerpc.tomlแล้ว deploy จะลบ WAF ออกจากเซิร์ฟเวอร์
การตั้งค่า WAF
มีเพียง
port ที่จำเป็น นี่คือ key ทั้งหมดพร้อมค่าเริ่มต้น:toml
rate, max_connections_per_address, ban และ new_connections ปิดได้ด้วย false (ban = false) และ key ที่ไม่ได้ระบุจะใช้ค่าเริ่มต้น erpc worker check จะบอกว่าตาราง [waf] จะทำอะไร และมีอะไรผิด ก่อนการ deploy ใด ๆสิ่งที่ WAF ทำโดยไม่ต้องตั้งค่า
- คำขอที่ไม่สามารถอ่านเป็นคำขอ HTTP/1 หนึ่งรายการที่ไม่กำกวมจะได้รับ 400 และ path ที่ไม่อยู่ในรูปแบบปกติ (normal form) ก็เช่นกัน
- คำขอเปลี่ยนโปรโตคอล (
Upgrade) จะได้รับ 501 - การปฏิเสธทุกครั้งถูกนับรวมในเกณฑ์การแบน และการปฏิเสธแต่ละครั้งจะปิดการเชื่อมต่อนั้น
- ที่อยู่หนึ่งหมายถึงที่อยู่ IPv4 หนึ่งที่อยู่ หรือ IPv6 หนึ่ง
/64 - WAF ไม่ส่งต่อ header ของการเชื่อมต่อระหว่าง client กับ proxy (
Connectionและ header ที่ header นั้นระบุ,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer),Expect, header ที่ชื่อมีขีดล่าง หรือForwarded,X-Real-IPและX-Forwarded-Protoที่ client ส่งมาเอง WAF ตั้งX-Real-IPเป็นที่อยู่ต้นทางของการเชื่อมต่อ และเพิ่มที่อยู่นั้นต่อท้ายX-Forwarded-Forมีเพียงรายการสุดท้ายของX-Forwarded-Forเท่านั้นที่ proxy รับรอง
ดูว่า WAF ทำอะไร
คำขอที่ถูกส่งต่อจะไม่ทิ้งบรรทัด log ไว้ และจะไม่มีการบันทึก header หรือ body ลง log เลย ส่วน query ของคำขอที่ถูกบล็อกจะถูกบันทึกเท่าที่ 200 ไบต์ครอบคลุม สิ่งที่ client ส่งมาไม่สามารถเขียนลงบนเทอร์มินัลของคุณได้ เพราะ WAF เขียน journal เป็น ASCII ที่พิมพ์ได้
สิ่งที่ WAF ไม่ทำ
- ไม่มี TLS WAF ใช้ HTTP/1.1 แบบไม่เข้ารหัสบนพอร์ตของตัวเอง
- ไม่รองรับ HTTP/2: WAF ตอบกลับด้วย 400
- ไม่รองรับ WebSocket และ
Upgradeแบบอื่นใด: 501 - ไม่ดูข้อมูลภายใน body body จะถูกวัดขนาด แต่ไม่ถูกอ่านเลย รายการ probe นั้นสั้น และเป็นเพียงตัวกรองสัญญาณรบกวน ไม่ใช่การรับประกัน แอปยังคงตรวจสอบ input ของตัวเอง
- ไม่มีการยืนยันตัวตน ใครเรียกแอปได้เป็นเรื่องที่แอปต้องตัดสินใจเอง และเป็นไปตามรายการของไฟร์วอลล์
- ที่อยู่หนึ่งคือ client หนึ่งราย client ที่อยู่หลัง NAT, proxy หรือ CDN เดียวกันจะใช้ rate และการแบนร่วมกัน ส่วน client ที่มีหลายที่อยู่จะมี rate เท่ากับจำนวนที่อยู่
- การแบนและจำนวนนับจะถูกลืมเมื่อ WAF รีสตาร์ท
- WAF จำที่อยู่ได้สูงสุด 8192 ที่อยู่ และถือการเชื่อมต่อพร้อมกันได้สูงสุด 1024 รายการ
- WAF รอรับการเชื่อมต่อบน IPv4 เท่านั้น รายการ IPv6 ใน
app_allowจึงยังเข้าถึงสิ่งใดไม่ได้ - path ถูกเปรียบเทียบตามไบต์ที่ได้หลังถอดรหัส แอปที่อ่าน path อย่างหลวมกว่า (ไม่แยกตัวพิมพ์เล็กพิมพ์ใหญ่ พารามิเตอร์
;หรือถอดรหัสสองครั้ง) อาจถูกเข้าถึงได้ภายใต้ชื่อที่deny_pathsไม่ครอบคลุม ส่วนallow_pathsไม่มีช่องโหว่นี้ เพราะสิ่งที่ไม่อยู่ในรายการจะไม่ถูกส่งต่อ - client ที่อ่านช้าจะได้รับคำตอบจนจบ client ที่ยังคงรับคำตอบอยู่ ไม่ว่าจะช้าเพียงใด จะได้รับคำตอบจนจบ
- flood อาจตัดการอัปโหลดขนาดใหญ่ได้ WAF ทำงานบน thread เดียว flood จึงอาจตัดการอัปโหลดขนาดใหญ่ด้วย 408 ได้ แอปที่รับ body ขนาดใหญ่ให้เพิ่ม
body_timeout_secsไปพร้อมกับmax_body_bytes
คู่มือ worker มีกฎทั้งหมด รวมถึงกรณีที่การเปลี่ยนแปลง
app_allow จะถูกพักไว้จนถึงการ deploy ครั้งถัดไป





