Tags:
Topics: 
Node Thumbnail

กระบวนการบล็อคเว็บนั้นมีหลายวิธีการและหลายเหตุผล ทั้งการควบคุมเนื้อหา ไม่ว่าจะเป็นรัฐบาลต้องการเซ็นเซอร์เว็บหรือผู้ปกครองต้องการระมัดระวังไม่ให้บุตรหลานเข้าถึงข้อมูลไม่เหมาะสม, เพิ่มความปลอดภัยหากเรามีรายการของโดเมนที่เป็นภัยหรือถูกแฮก, ตลอดจนการรักษาความเป็นส่วนด้วยด้วยการบล็อคโดเมนที่เกี่ยวข้องกับการโฆษณา ที่เป็นที่นิยมค่อนข้างมาก จนโครงการ Pi-hole กลายเป็นหนึ่งในโครงการยอดนิยมของ GitHub ด้วยจำนวนดาวถึง 34,100 ดาว

กระบวนการบล็อคเว็บตามโดเมนที่ง่ายที่สุดคือการบล็อคที่เซิร์ฟเวอร์ DNS โดยอาศัยไคลเอนต์ทุกตัวให้ความร่วมมือในการใช้เซิร์ฟเวอร์ DNS ที่กำหนดไว้ ไม่ว่าจะเป็นการตั้งค่าเองด้วยมือ หรือตั้งค่าอัตโนมัติผ่าน DHCP ก็ตาม ตัวเซิร์ฟเวอร์ DNS จะพิจารณาแต่ละโดเมนว่าโดเมนที่กำลังร้องขออยู่ในรายการต้องห้ามหรือไม่ ถ้าไม่อยู่ก็จะตอบไอพีตามปกติ แต่หากอยู่อาจจะตอบว่าไม่พบโดเมน หรืออาจจะตอบไปยังไอพีที่ตั้งไว้ ที่แสดงหน้าเว็บว่าผู้ใช้กำลังเข้าเว็บที่ถูกบล็อค

No Description

การบล็อคเว็บผ่านทางเซิร์ฟเวอร์ DNS นั้นมีข้อจำกัดในตัวเอง ข้อสำคัญคือผู้ใช้อาจจะไม่ให้ความร่วมมือใช้งานเซิร์ฟเวอร์ DNS ที่เรากำหนดไว้ เช่น ตั้งค่าไปใช้งานเซิร์ฟเวอร์ DNS สาธารณะ 8.8.8.8 ของกูเกิล หรือ 1.1.1.1 ของ Cloudflare ที่ผ่านมาบางองค์กรอาจจะพยายามโยกทราฟิกของเซิร์ฟเวอร์เหล่านี้เข้าไปยังเซิร์ฟเวอร์ DNS ขององค์กรเองเพื่อให้สามารถควบคุมการเข้าโดเมนต่างๆ ได้อยู่ แต่ความนิยมของโปรโตคอล DNS over HTTPS (DoH) ก็ทำให้การควบคุมทำให้ยากขึ้น หากพยายามใช้เซิร์ฟเวอร์ขององค์กรไปแทน DoH ก็จะทำให้ผู้ใช้ไม่สามารถใช้งานอินเทอร์เน็ตได้เลย

No Description

กระบวนการบล็อคเว็บอีกรูปแบบที่นิยมกัน คือการใช้ไฟร์วอลล์อ่านฟิลด์ 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])
  • action: สามารถกำหนดได้ว่าจะทำให้ทำอะไรหากจากทราฟิกตรงเงื่อนไข เช่น drop (ทิ้งแพ็กเก็ต ทำให้การเชื่อมต่อไม่สำเร็จ), reject (เหมือน drop แต่ส่ง RST ทำให้การเชื่อมต่อหลุด), pass (ถือว่าข้อมูลปลอดภัย ไม่ต้องพิจารณากฎอื่นต่อ), alert (ปล่อยผ่าน แต่ log ลงไฟล์)
  • protocol ตัว Suricata สามารถอ่านข้อมูลโปรโตคอลได้เป็นจำนวนมาก และการออกเวอร์ชั่นใหม่ๆ ก็มักเพิ่มโปรโตคอลใหม่ๆ อย่างต่อเนื่อง เช่นตอนนี้กำลังพัฒนาให้อ่าน mqtt เพิ่มเติมเนื่องจากใช้งานในระบบ IoT มากขึ้น โปรโตคอลพื้นฐานที่อ่านข้อมูลได้ ได้แก่ IP, ICMP, TCP, และ UDP และยังอ่านโปรโตคอลระบบแอปพลิเคชั่นได้อีกมาก ในกรณีนี้เราสนใจโปรโตคอล TLS (ใช้งานร่วมกับ SSL)
  • source IP ไอพีต้นทาง สามารถกำหนดเป็นกลุ่มได้ในคอนฟิก เช่น วงไอพีภายในองค์กร
  • source port พอร์ตต้นทง
  • dest IP ไอพีปลายทาง
  • dest port พอร์ตปลายทาง
  • log message ข้อความสำหรับแสดงในไฟล์ log ว่าต้องการแจ้งเตือนผู้ดูแลเน็ตเวิร์คว่าอย่างไรบ้าง เช่น แจ้งหมายเลข CVE ที่คนร้ายกำลังโจมตี
  • conditions เงื่อนไขสำหรับตรวจสอบ เช่น ฟิลด์ในโปรโตคอลที่เราต้องการตรวจสอบ
  • signature ID หมายเลขกฎสำหรับอ้างอิง ตัว Suricata จะบันทึกไว้ใน log เพื่อให้ผู้ดูแลมาตรวจสอบได้ง่ายขึ้น
  • revision หมายเลขเวอร์ชั่นของกฎ ในกรณีที่กฎมีการแก้ไข เช่น การปรับกฎหลังพบการโจมตีรูปแบบใหม่ๆ ในช่องโหว่เดิม ก็ควรปรับหมายเลข 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

No Description

การตั้ง 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 หากพัฒนาสำเร็จและมีการใช้งานเป็นวงกว้างก็น่าสนใจว่าในอนาคตระบบมอนิเตอร์เน็ตเวิร์คจะปรับตัวกันอย่างไร

Get latest news from Blognone

Comments

By: darkleonic
ContributorAndroidWindowsIn Love
on 21 December 2021 - 14:03 #1235095
darkleonic's picture

จำนวนดาวถึง 34,100 ดาว -> มีผู้ให้ดาวถึง 34,100 ราย จะเหมาะกว่าไหมครับ


I need healing.