- มีกรณีที่เซิร์ฟเวอร์ส่วนตัวล่มจากคำขอจำนวนมหาศาลของ บอตสแครป AI
- จากการวิเคราะห์ล็อก พบความพยายามเข้าถึงอย่างหนักจากช่วง IP โฮสต์ในสิงคโปร์ของ Alibaba(US) Technology (
47.79.*)
- เนื่องจากใช้ User-Agent ปลอมแปลง ในรูปแบบ
Mozilla/5.0 ระบบตรวจจับบอตทั่วไปจึงแทบใช้การไม่ได้
- ระบบบล็อกอัตโนมัติ ของ Fail2ban และ Nginx ทำงานหนักเกินไป จนต้องบล็อกทั้งช่วง IP ด้วยตนเอง
- ผู้ดูแลเซิร์ฟเวอร์ส่วนตัวต้องเผชิญการโจมตีซ้ำ ๆ จน สภาพแวดล้อมการโฮสต์ด้วยตนเองหดตัวลง และถูกผลักไปสู่แพลตฟอร์มแบบรวมศูนย์
สาเหตุที่เซิร์ฟเวอร์ล่มและการรับมือเบื้องต้น
- เมื่อไม่กี่วันก่อน เซิร์ฟเวอร์ขนาดเล็ก ที่ใช้โฮสต์เว็บไซต์หยุดให้บริการชั่วคราวจาก การโจมตีของบอตสแครป
- ก่อนหน้านี้ก็เคยมีการโจมตีลักษณะคล้ายกัน และกำลังพิจารณานำเครื่องมือป้องกันที่แข็งแกร่งอย่าง Anubis มาใช้
- การโจมตีที่เกิดซ้ำทำให้ แรงจูงใจในการสร้างสรรค์และความสนุกในฐานะงานอดิเรก ของนักพัฒนารายบุคคลลดลง
- หลังพบว่าเซิร์ฟเวอร์ตอบสนองช้า เมื่อตรวจสอบด้วยคำสั่ง
top ก็พบว่า Gitea และ Fail2ban ใช้ CPU ไปเกือบทั้งหมด
- แม้จะปิดโปรเซส Gitea แล้ว ภาระของ Fail2ban ก็ยังไม่ลดลง และ Nginx access log เพิ่มขึ้นอย่างผิดปกติ
การวิเคราะห์ล็อกและรูปแบบการโจมตี
- ในล็อกมีการบันทึก คำขอ HTTP 502 จำนวนมากที่พุ่งเป้าไปยังพาธ
/commit/
- ในส่วนหัวของคำขอ มีการใช้ User-Agent ที่ปลอมเป็นเบราว์เซอร์ทั่วไป เช่น
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
- เครื่องมือตรวจสอบ User-Agent ส่วนใหญ่มองว่าเป็นทราฟฟิกปกติ ทำให้ หลบเลี่ยงการตรวจจับ ได้
- IP ที่โจมตีไม่ได้มาจากแหล่งเดียว แต่เกิดจาก หลายที่อยู่ โดยทั้งหมดใช้ช่วง
47.79.* ร่วมกัน
- จากการตรวจสอบด้วย
ipinfo.io พบว่าช่วงดังกล่าวเป็นของ Alibaba(US) Technology Co., Ltd.
- ในฟอรัมอย่าง PhpBB ก็มีรายงาน กรณีการโจมตี จากช่วง IP เดียวกันเช่นกัน
มาตรการป้องกันและข้อจำกัด
- Fail2ban วิเคราะห์ Nginx log แบบเรียลไทม์เพื่อใช้กฎบล็อก แต่ เมื่อปริมาณล็อกพุ่งสูงมากจึงประมวลผลไม่ทัน
- มีการรันสคริปต์เพื่อบล็อก IP ที่พยายามเข้าถึง
/commit/ ทันที แต่ก็ยังมี ข้อจำกัดด้านความเร็ว
- สุดท้ายจึงต้องใช้คำสั่ง
iptables เพื่อ บล็อกทั้งช่วง 47.79.0.0/16 ด้วยตนเอง
- การรับมือเช่นนี้เป็นเพียง วิธีแก้ปัญหาเฉพาะหน้า เท่านั้น และยังมีโอกาสสูงที่การโจมตีจากช่วง IP ใหม่จะเกิดขึ้นต่อไป
- กำลังพิจารณาใช้ บริการป้องกันภายนอก อย่าง Cloudflare หรือระบบป้องกันขั้นสูงอย่าง Anubis
- แต่ก็ยังลังเล เพราะไม่ต้องการให้ทราฟฟิกวิ่งผ่าน เซิร์ฟเวอร์ในสหรัฐฯ ที่มีความสามารถในการติดตาม
ความยากลำบากของการดูแลเซิร์ฟเวอร์ส่วนตัว
- กำลังพิจารณาย้ายอินสแตนซ์ Gitea ไปยัง Codeberg
- ผู้ดูแลเซิร์ฟเวอร์ส่วนตัวจำนวนมากกำลัง เลิกโฮสต์เอง และย้ายไปใช้แพลตฟอร์มแบบรวมศูนย์ เพราะต้องเจอกับการโจมตีซ้ำแล้วซ้ำเล่า
- แนวโน้มนี้นำไปสู่ การอ่อนแอลงของความกระจายศูนย์และความเป็นอิสระของอินเทอร์เน็ต
- บล็อกเกอร์คนอื่น ๆ ก็รายงานความเสียหายจากการโจมตีลักษณะคล้ายกันเช่นกัน และปัญหานี้กำลังขยายไปเป็น ปัญหาของผู้ดูแลเว็บรายเล็กโดยรวม
ความผิดปกติของทราฟฟิกอื่นที่สังเกตพบ
- พบ Referer header ปลอม ที่อ้างถึงโดเมนบริษัทใหญ่ เช่น
bioware.com, mcdonalds.com, microsoft.com
- ในความเป็นจริง เว็บไซต์เหล่านั้นไม่ได้ให้ลิงก์มา และเกิดทราฟฟิกเพิ่มขึ้นโดย ไม่ทราบจุดประสงค์
- แม้การโจมตีจะเกิดขึ้นซ้ำอีก ก็ยังแสดง เจตนารมณ์ว่าจะไม่ละทิ้งการโฮสต์ด้วยตนเอง
- ตอนท้ายบทความย้ำความตั้งใจที่จะดูแลเซิร์ฟเวอร์อิสระต่อไปด้วยประโยค “Get Hostin’ Or Die Tryin’ ”
1 ความคิดเห็น
ความเห็นจาก Hacker News
รู้สึกว่าอินเทอร์เน็ตไม่ใช่ พื้นที่ปลอดภัยสำหรับนักพัฒนาซอฟต์แวร์สายงานอดิเรก อีกต่อไป
ผมดูแลเซิร์ฟเวอร์เองมาตั้งแต่ราวปี 2005 และทันทีที่เซิร์ฟเวอร์ออนไลน์ก็จะถูกโจมตีตลอด
โดยเฉพาะเมื่อผูกชื่อ DNS หรือใช้ใบรับรอง TLS ดูเหมือนว่าการถูกเปิดเผยใน certificate transparency logs จะยิ่งทำให้การโจมตีหนักขึ้น
พอเปิดเว็บไซต์สู่สาธารณะก็มีทราฟฟิกอันตรายถาโถมเข้ามา และถ้าไปทำให้องค์กรไหนไม่พอใจ ก็ดูเหมือนจะมีการจ้างคนมาลอง DDoS ด้วย
ทั้ง crawler, botnet, การโจมตีอัตโนมัติ และคนที่โกรธกัน ล้วนเป็นเรื่องที่เจอทุกปี
ลองใช้ผู้ให้บริการโฮสติ้งมาหลายเจ้าแล้ว แต่ผลก็คล้ายกัน
พอไม่อัปเดต WordPress ก็โดนฝัง SEO spam ภายในไม่กี่ชั่วโมง และพอเผลอเปิด Redis ออกสู่อินเทอร์เน็ตก็โดนติดตั้ง RAT ของบอตเน็ต
แต่ผมก็ไม่ได้คิดว่าสิ่งเหล่านี้แปลว่าอินเทอร์เน็ตนั้น ‘อันตราย’
กลับกัน มันเป็นประสบการณ์ที่สอนว่าผมยังต้องเรียนรู้อะไรอีก
หลังจากนั้นก็ใช้ star-cert เพื่อไม่ให้โผล่ใน certificate logs, เพิ่ม basic auth, ทำแบ็กอัปไว้ และดูแลระบบอย่างระมัดระวัง
สิ่งที่อันตรายจริง ๆ น่าจะเป็นคนที่ไม่รู้เรื่องเทคนิคแล้วติดตั้ง exe อะไรก็ได้ พร้อมส่งข้อมูลทุกอย่างให้ Facebook หรือ TikTok มากกว่า
คำขอส่วนใหญ่เป็นการพยายามโจมตีช่องโหว่ของ WordPress ทั้งที่ผมไม่เคยใช้ WordPress เลย
ตอนเห็นล็อกครั้งแรกผมช็อกมาก แต่ตอนนี้ก็มองว่าเป็นเรื่องปกติในชีวิตประจำวันไปแล้ว
ตัวอย่าง: https://www.masswerk.at/wp-admin
เป็นช่วงที่เครื่องมือสำหรับสแกนช่วง IP และค้นหาช่องโหว่อัตโนมัติเริ่มแพร่หลาย
คิดถึงยุคเว็บช่วงปี 1995~2008 ที่ยังมี Web Rings, Technorati และแฟนไซต์ต่าง ๆ
อ้างอิง: วิกิ Script Kiddie
ผมเคยใช้ zipbomb กันบอต แล้วได้ผลดี
แต่หลังจาก โพสต์เรื่องนั้นลง HN ก็มีบอตชุดใหม่แห่กันเข้ามาจนเซิร์ฟเวอร์ราคา $6 รับไม่ไหว
การเสิร์ฟ payload ขนาด 1~10MB ให้กับวันละ 100,000 requests เป็นไปไม่ได้เลย
หลังจากนั้นผมเลยเล็งเป้าเฉพาะบอตบางตัว แล้วทำ honeypot เพื่อเก็บ IP ก่อนตอบกลับ 403
ผ่านไปไม่กี่เดือน ทราฟฟิกก็กลับมาสู่ระดับปกติ
แค่ยังไม่แน่ใจว่าลูกค้าเป้าหมายคือใคร เพราะผู้ใช้ self-hosting ส่วนใหญ่ก็ไม่ได้มีเงินมาก
เซิร์ฟเวอร์ cgit ของผมก็โดน scraper เข้ามาตลอดมา 1 ปีแล้ว
แต่เป็นบอตที่ค่อนข้าง ‘สุภาพ’ เพราะยิงมาแค่ 2~3 ครั้งต่อนาที
ที่ตลกคือโค้ดที่ผมอัปโหลดทั้งหมดก็ clone ได้ตรงจาก upstream อยู่แล้ว แต่ก็ยังอุตส่าห์มาขูดเอาเอง
ดูจากล็อกแล้วเป็นระบบอัตโนมัติที่ไม่มีประสิทธิภาพจริง ๆ
ถ้าตั้งค่า rate-limiting ของ Nginx เอง ก็แก้ปัญหาได้ง่ายกว่า Fail2ban
บล็อกอ้างอิง: https://blog.nginx.org/blog/rate-limiting-nginx
อาจใช้กับบริการสาธารณะอย่างบล็อกได้ยาก แต่ถ้าเป็น self-hosting ใช้ส่วนตัว แนะนำให้ตั้งค่า การยืนยันตัวตนแบบ mTLS ไว้ที่ reverse proxy
คำขอที่ไม่มีใบรับรองจะถูกบล็อกทันที และมีแค่อุปกรณ์ของผมเท่านั้นที่เข้าได้
ตั้งครั้งเดียวแล้วแทบไม่ต้องคอยดูแลอะไรอีก
ตั้งค่าง่าย และทำงานได้ดีทั้งบน Android กับ iOS
ตอนนี้ผมตั้งให้บริการ self-hosted ทั้งหมดเข้าถึงได้เฉพาะจากภายใน Wireguard VPN เท่านั้น และเปิดไฟร์วอลล์ไว้แค่พอร์ตของ Wireguard
Anubis กำลังเล่นเกม ‘แมวจับหนู’ กับบอตได้ดี
แต่มีแค่เจ้าที่มีข้อมูลทราฟฟิกขนาดใหญ่แบบ Cloudflare เท่านั้นที่ทำการบล็อกตามชื่อเสียงของ IP ได้ดี
ผู้ดูแลรายเล็กมักทำได้แค่บล็อกทั้งช่วง IP ซึ่งไม่มีประสิทธิภาพ
จึงควรมีโซลูชันแบบ Crowdsec ที่แชร์ข้อมูลชื่อเสียงเพื่อบล็อก IP อันตราย และให้ challenge แบบง่าย ๆ ที่ไม่ต้องพึ่ง JS
ถ้าทำแนวทางนี้ได้จริง นักพัฒนาสายงานอดิเรกก็น่าจะกลับมารันบริการได้ง่ายขึ้น
อินสแตนซ์ Gitea ของผมก็เพิ่งโดน scraping ผ่าน IP และ ASN ที่กระจายตัว
ถ้าเป็นบริษัท AI ที่มีทุนหนา ก็คงยากจะกันได้แม้ใช้ Anubis
เลยกำลังคิดเรื่อง ‘วางยาพิษให้ scraper (poisoning)’ — คือส่งข้อมูลขยะไปแทนโค้ด
บริการแบบนี้ยิ่งทำให้การขัดขวาง scraping ยากขึ้น
ของที่ได้รับความนิยม สุดท้ายก็มักเข้าสู่วงจร ถูกมวลชนยึดไปจนพัง
เลยรู้สึกว่าทางแก้เดียวคือย้ายไปพื้นที่ใหม่อยู่เรื่อย ๆ
หลังย้าย DNS ไป Cloudflare ก็มี แพ็กเก็ต SYN แปลก ๆ เข้ามาไม่หยุด
มีคำขอมาที่พอร์ต 443 หรือ 22 ทุกวินาที แต่หลัง SYN-ACK แล้วกลับไม่มีการตอบสนอง
ดูเหมือนว่าส่วนใหญ่มาจากผู้ให้บริการโฮสต์เกม VPS ในบราซิลและที่อื่น ๆ
ผมเลยจับแพ็กเก็ต SYN ไปเช็กด้วย RDAP แล้วบล็อกทั้ง subnet ขององค์กรนั้นทิ้งเลย
ตอนนี้ whitelist ไว้แค่ Google
ส่วน Digital Ocean ดูเหมือนจะเป็นหนึ่งในแหล่งหลักของทราฟฟิกอันตราย
โดย network stack จะพยายามส่งซ้ำ ทำให้ทราฟฟิกถูกขยายและส่งใส่เหยื่อ
มักมีการปลอม src IP กันเยอะ จึงแนะนำให้ตั้ง
rp_filterเป็น strictเหมือนกับที่บริษัทไฟฟ้าไม่ควรห้ามใช้หลอดไฟสีแดง ผู้ให้บริการก็ไม่ควร ควบคุมทราฟฟิก ของบริการเช่นกัน
เหตุผลที่ผมอินกับโพสต์นี้ ไม่ใช่เพราะอินเทอร์เน็ตปลอดภัย แต่เพราะมัน บันทึกความจริงแบบนี้ไว้
ผมเองก็บล็อก Alibaba /16 กับทั้งช่วงของ AWS อยู่เหมือนกัน
ผมใช้สคริปต์ที่ดึงข้อมูล RouteViews มาทุกวันด้วย cron แล้วนำไปใส่ใน iptables
ตัวอย่างโค้ด:
ก็หวังว่าคลาวด์เจ้าอื่นจะทำแบบนี้เหมือนกัน