กระบวนการบล็อคเว็บนั้นมีหลายวิธีการและหลายเหตุผล ทั้งการควบคุมเนื้อหา ไม่ว่าจะเป็นรัฐบาลต้องการเซ็นเซอร์เว็บหรือผู้ปกครองต้องการระมัดระวังไม่ให้บุตรหลานเข้าถึงข้อมูลไม่เหมาะสม, เพิ่มความปลอดภัยหากเรามีรายการของโดเมนที่เป็นภัยหรือถูกแฮก, ตลอดจนการรักษาความเป็นส่วนด้วยด้วยการบล็อคโดเมนที่เกี่ยวข้องกับการโฆษณา ที่เป็นที่นิยมค่อนข้างมาก จนโครงการ Pi-hole กลายเป็นหนึ่งในโครงการยอดนิยมของ GitHub ด้วยจำนวนดาวถึง 34,100 ดาว
กระบวนการบล็อคเว็บตามโดเมนที่ง่ายที่สุดคือการบล็อคที่เซิร์ฟเวอร์ DNS โดยอาศัยไคลเอนต์ทุกตัวให้ความร่วมมือในการใช้เซิร์ฟเวอร์ DNS ที่กำหนดไว้ ไม่ว่าจะเป็นการตั้งค่าเองด้วยมือ หรือตั้งค่าอัตโนมัติผ่าน DHCP ก็ตาม ตัวเซิร์ฟเวอร์ DNS จะพิจารณาแต่ละโดเมนว่าโดเมนที่กำลังร้องขออยู่ในรายการต้องห้ามหรือไม่ ถ้าไม่อยู่ก็จะตอบไอพีตามปกติ แต่หากอยู่อาจจะตอบว่าไม่พบโดเมน หรืออาจจะตอบไปยังไอพีที่ตั้งไว้ ที่แสดงหน้าเว็บว่าผู้ใช้กำลังเข้าเว็บที่ถูกบล็อค
การบล็อคเว็บผ่านทางเซิร์ฟเวอร์ DNS นั้นมีข้อจำกัดในตัวเอง ข้อสำคัญคือผู้ใช้อาจจะไม่ให้ความร่วมมือใช้งานเซิร์ฟเวอร์ DNS ที่เรากำหนดไว้ เช่น ตั้งค่าไปใช้งานเซิร์ฟเวอร์ DNS สาธารณะ 8.8.8.8 ของกูเกิล หรือ 1.1.1.1 ของ Cloudflare ที่ผ่านมาบางองค์กรอาจจะพยายามโยกทราฟิกของเซิร์ฟเวอร์เหล่านี้เข้าไปยังเซิร์ฟเวอร์ DNS ขององค์กรเองเพื่อให้สามารถควบคุมการเข้าโดเมนต่างๆ ได้อยู่ แต่ความนิยมของโปรโตคอล DNS over HTTPS (DoH) ก็ทำให้การควบคุมทำให้ยากขึ้น หากพยายามใช้เซิร์ฟเวอร์ขององค์กรไปแทน DoH ก็จะทำให้ผู้ใช้ไม่สามารถใช้งานอินเทอร์เน็ตได้เลย
กระบวนการบล็อคเว็บอีกรูปแบบที่นิยมกัน คือการใช้ไฟร์วอลล์อ่านฟิลด์ Host ใน HTTP header ซึ่งได้เฉพาะการเชื่อมต่อที่ไม่เข้ารหัสเท่านั้น หากเชื่อมต่อเข้ารหัสแล้วไฟร์วอลล์ก็จะไม่สามารถอ่านค่า HTTP header ได้อีกต่อไป อย่างไรก็ดีการเชื่อมต่อที่เข้ารหัสนั้น แม้เนื้อหาในการเชื่อมต่อจะเข้ารหัสแทบทั้งหมดแต่ก็มีข้อมูลบางส่วนที่ไม่ได้เข้ารหัสเอาไว้ ทำให้ผู้ให้บริการอินเทอร์เน็ตสามารถสังเกตได้ว่าผู้ใช้กำลังเข้าเว็บใด คือค่า TLS SNI
TLS SNI (RFC3456 มีการปรับปรุงอีกหลายครั้งตามเวอร์ชั่น TLS) เป็นส่วนขยายของ TLS 1.0 ที่ช่วยให้ไคลเอนต์สามารถแจ้งเซิร์ฟเวอร์ได้ว่าต้องการเชื่อมต่อกับโดเมนใด การแจ้งล่วงหน้านี้ทำให้เซิร์ฟเวอร์หนึ่งไอพีสามารถให้บริการได้หลายโดเมนพร้อมกัน และเลือกเปิดการเชื่อมต่อตามโดเมนที่ผู้ใช้ร้องขอมา หลังจากเซิร์ฟเวอร์รับรู้ว่าไคลเอนต์ต้องการเชื่อมต่อกับเซิร์ฟเวอร์โดเมนใดแล้วก็จะส่งใบรับรองตามโดเมนนั้นๆ กลับไป เพื่อเริ่มกระบวนการเข้ารหัสในใบรับรองนั้นจะระบุชื่อโดเมนของเว็บที่กำลังใช้งานเอาไว้ในฟิลด์ CN (canonical name) และ SAN (subject alternative name) เราท์เตอร์ที่คั่นกลางการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์สามารถเลือกตัดการเชื่อมต่อรายโดเมน โดยดูค่า SNI ได้
ซอฟต์แวร์ในกลุ่มที่สังเกตุข้อมูลการเชื่อมต่อและตัดการเชื่อมต่อจากข้อมูลเหล่านั้นได้ เรียกว่า Intrusion Prevention Systems (IPS) หรือบางทีก็เรียกว่า Intrusion Detection Systems (IDS) การทำงานนั้นคาบเกี่ยวกันไปมา แต่โดยรวมแล้วซอฟต์แวร์ในกลุ่มนี้จะตรวจข้อมูลการเชื่อมต่อได้อย่างละเอียด
Suricata เป็นหนึ่งใน IPS/IDS แบบโอเพนซอร์สยอดนิยม (รองจาก Snort ที่อยู่ในกลุ่มเดียวกัน และปัจจุบันเป็นโครงการที่ดูแลโดยซิสโก้) มันถูกใช้งานอยู่ในบริการไฟร์วอลล์หลายตัว เช่น ไฟร์วอลล์ชื่อ Threat Prevention ในเราท์เตอร์ของ Synology
Suricata รองรับลินุกซ์หลายดิสโทร ตั้งแต่ Ubuntu, Debian, Fedora, RHEL/CentOS (ทดสอบกับ Rocky Linux ก็สามารถใช้งานได้ ในกรณีของ CentOS/Rocky Linux นั้นสามารถติดตั้งได้ด้วยสามคำสั่ง
yum install epel-release yum-plugin-copr yum copr enable @oisf/suricata-6.0 yum install suricata
คอนฟิกเริ่มต้นของของ Suricata ในแพ็กเกจนั้นไม่ได้ปรับมาให้ตรงกับ CentOS ต้องเข้าไปแก้ไฟล์ /etc/suricata/suricata.yaml
เสียก่อน โดยเฉพาะฟิลด์ default-rule-path: /etc/suricata/rules
เพื่อกำหนดตำแหน่งของไฟล์ที่จะใช้กรองแพ็กเก็ต จากนั้นกำหนดรายการไฟล์กฎการกรองในฟิลด์ rule-files
กฎของ Suricata นั้นมีรูปแบบดังนี้
[action] [protocol] [source IP] [source port] -> [dest IP] [dest port] (msg:"[log message]"; [conditions]; sid:[signature ID]; rev:[revision])
ในกรณีของโปรโตคอล TLS นั้น Suricata สามารถดึงเอาค่า SNI, เวอร์ชั่นโปรโตคอล, สถานะการเชื่อมต่อ (เริ่มส่ง Hello, หรือกำลังแลกกุญแจ), ตลอดจนค่าต่างๆ ในใบรับรอง การตั้งค่าให้ Suricata บล็อคโดเมนนั้นสามารถทำได้เบื้องต้น เช่นการบล็อคโดเมน example.com จะใช้กฎว่า
drop tls any any -> any any (msg:"BLOGNONE Drop example.com"; content:"example.com" ; sid:2230031; rev:1;)
การรัน Suricata สามารถรันจาก command line ได้โดยตรง โดยกำหนดค่าคอนฟิกและอินเทอร์เฟซที่ต้องการ เช่น $ suricata -c /etc/suricata/suricata.yaml -i eth0
จะเป็นการกำหนดให้ Suricata อ่านข้อมูลที่วิ่งผ่านอินเทอร์เฟซ eth0 ทั้งหมด แต่ไม่สามารถตัดการเชื่อมต่อได้เนื่องจากเป็นการดักรับข้อมูลมาตรวจสอบเท่านั้น สำหรับการตัดการเชื่อมต่อ ต้องรัน Suricata ในโหมด IPS โดยรับข้อมูลผ่าน Netfilter Queue ที่เปิดให้ซอฟต์แวร์นอกเคอร์เนล (user space) โดยใช้คำสั่ง
nft add rule filter INPUT queue num 3 bypass
nft add rule filter OUTPUT queue num 3 bypass
การตั้ง Suricata สำหรับการใช้งานเป็นไฟร์วอลล์คั่นกลางระหว่างเน็ตเวิร์ค ต้องกรองใน FORWARD
การเพิ่มกฎสำหรับ INPUT/OUTPUT นั้นเป็นการใช้งาน filter เพื่อกรองข้อมูลที่เข้าและออกจากตัวเครื่องเองโดยตรง ในกรณีใช้งานลินุกซ์เป็นเราท์เตอร์ เช่นเซิร์ฟเวอร์ VPN จะต้องเปลี่ยนเป็น FORWARD แทน num 3
นั้นหมายถึงคิวหมายเลข 3 ซึ่งสามารถตั้งเป็นค่าอื่นๆ ได้ แต่ต้องตั้งให้ตรงกันเมื่อสั่งรัน Suricata และสุดท้ายคือ bypass เป็นการบอก netfilter ว่าหากไม่มีซอฟต์แวร์ใดมารับข้อมูลจากคิวหมายเลข 3 ให้ปล่อยผ่านข้อมูลไปได้เลย ป้องกันเน็ตเวิร์คล่มเมื่อ Suricata ไม่ได้รัน หรือแครชไป
จากนั้นให้รัน Suricata ให้รับข้อมูลจาก netfilter ในคิวหมายเลข 3 ด้วยคำสั่ง $ suricata -c /etc/suricata/suricata.yaml -q 3
หลังจากรันแล้วสามารถทดสอบด้วยคำสั่ง $ curl https://example.com
เพื่อเชื่อมต่อแบบ TLS เข้าไปยัง example .com จะพบว่าเชื่อมต่อไม่ได้ และหากไปดูใน log ที่ /var/log/suricata/fast.log
จะพบ log บันทึกว่า Suricata ตัดการเชื่อมต่อ
12/19/2021-08:07:50.785382 [Drop] [**] [1:2230031:1] BLOGNONE Drop example.com [**] [Classification: (null)] [Priority: 3] {TCP} xx.xx.xx.xx:48346 -> 93.184.216.34:443
หากต้องการบล็อคโดเมนทั้งหมดในรูปแบบเดียวกับ Pi-hole เราสามารถหารายชื่อโดเมนจากชุมชน Pi-hole มาสร้างกฎสำหรับ Suricata ได้ไม่ยากนัก นอกจากนี้ Suricata ยังมีฟีเจอร์ช่วยให้การตรวจจับครอบคลุมขึ้น เช่น การตรวจสอบ subdomain ด้วย dotprefix ในกรณีของ SNI นั้น IETF รับรู้ว่าผู้ให้บริการอินเทอร์เน็ตหลายรายตรวจสอบการเข้าเว็บด้วยข้อมูลนี้อยู่เช่นในบทความนี้ และกำลังพัฒนามาตรฐานเพื่อปิดบังข้อมูลนี้ ทั้ง ESNI ที่เคยเสมอเมื่อปี 2018 และ ECH เมื่อปี 2020 หากพัฒนาสำเร็จและมีการใช้งานเป็นวงกว้างก็น่าสนใจว่าในอนาคตระบบมอนิเตอร์เน็ตเวิร์คจะปรับตัวกันอย่างไร
Comments
จำนวนดาวถึง 34,100 ดาว -> มีผู้ให้ดาวถึง 34,100 ราย จะเหมาะกว่าไหมครับ
I need healing.