กฎลายเซ็นด้วย Snort และ Suricata
การเขียนและอ่านกฎเครือข่าย
กฎลายเซ็นด้วย Snort และ Suricata เป็นบทเรียน Cyber Security Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cyber Security Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
Snort และ Suricata
Snort และ Suricata คือระบบประมวลผล IDS/IPS แบบเปิดเผยซอร์สโค้ดที่มีการใช้งานอย่างแพร่หลายที่สุดสองระบบ ทั้งสองใช้ภาษาสำหรับเขียนกฎที่เข้ากันได้เป็นส่วนใหญ่ ดังนั้นกฎที่เขียนสำหรับระบบหนึ่งจึงมักทำงานบนอีกระบบได้
Suricata เพิ่มการประมวลผลหลายเธรด ตัวแยกวิเคราะห์โพรโทคอลในตัว การดึงไฟล์ออก และการบันทึกข้อมูลอย่างละเอียด (EVE JSON) ส่วน Snort 3 ก็ปรับปรุงระบบประมวลผลของตนให้ทันสมัยในแนวทางเดียวกัน การเรียนรู้ไวยากรณ์กฎเพียงครั้งเดียวช่วยให้คุณใช้งานได้อย่างมีประสิทธิภาพกับทั้งสองระบบ
โครงสร้างของกฎ
กฎทุกข้อมีสองส่วน: ส่วนหัว และ เนื้อหา ที่อยู่ในวงเล็บ ส่วนหัวกำหนดการดำเนินการ โพรโทคอล และทิศทางการรับส่งข้อมูล ส่วนเนื้อหากำหนดสิ่งที่จะจับคู่และวิธีรายงานผล
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 ( \
msg:"WEB suspicious request"; \
content:"/admin.php"; http_uri; \
sid:1000001; rev:1; )ฟิลด์ส่วนหัว
ส่วนหัวจะถูกอ่านจากซ้ายไปขวา:
- การกระทำ — แจ้งเตือน, ทิ้ง, ปฏิเสธ, อนุญาต
- โพรโทคอล — tcp, udp, icmp, ip (หรือโพรโทคอลระดับแอปพลิเคชันใน Suricata: http, dns, tls)
- IP/พอร์ตต้นทาง และ IP/พอร์ตปลายทาง
- ทิศทาง —
->ทางเดียว หรือ<>สองทิศทาง
ตัวแปรอย่าง $HOME_NET และ $EXTERNAL_NET มาจากการกำหนดค่าของคุณ เพื่อให้กฎยังคงนำไปใช้ได้กับหลายไซต์
drop tcp any any -> $HOME_NET 22 ( msg:"SSH blocked"; sid:1000002; rev:1; )การกระทำ: แจ้งเตือนเทียบกับทิ้ง
การกระทำจะเป็นตัวกำหนดพฤติกรรมแบบ IDS หรือ IPS สำหรับกฎนั้น:
alert— บันทึกและแจ้งเตือน โดยไม่หยุดการรับส่งข้อมูล (IDS)drop— ทิ้งแพ็กเก็ตโดยไม่แจ้งให้ทราบ (IPS ใช้ได้เฉพาะแบบอินไลน์)reject— ทิ้งแพ็กเก็ตและส่งการรีเซ็ต TCP หรือข้อความ ICMP ที่ระบุว่าเข้าถึงไม่ได้pass— อนุญาตอย่างชัดเจน และข้ามกฎถัดไป
เอนจินเดียวกันจะทำงานเป็น IDS หรือ IPS ขึ้นอยู่กับว่าติดตั้งแบบอินไลน์หรือไม่ และคุณใช้การกระทำใด
การจับคู่เนื้อหา
คีย์เวิร์ด content ใช้จับคู่รูปแบบไบต์ในข้อมูลส่วนบรรทุก ข้อความจะอยู่ในเครื่องหมายคำพูด ส่วนข้อมูลไบนารีจะอยู่ภายในเครื่องหมายไปป์ในรูปเลขฐานสิบหก
คีย์เวิร์ดสำหรับกำหนดจุดเริ่มช่วยให้การจับคู่แม่นยำขึ้น: offset, depth, distance และ within จะจำกัดตำแหน่งที่รูปแบบสามารถปรากฏได้ ซึ่งช่วยเพิ่มทั้งความถูกต้องและประสิทธิภาพ
alert tcp any any -> $HOME_NET any ( \
msg:"Malware magic bytes"; \
content:"|4D 5A|"; offset:0; depth:2; \
sid:1000003; rev:1; )บัฟเฟอร์แบบยึดติด
กฎสมัยใหม่จะจับคู่กับ บัฟเฟอร์ที่เข้าใจโพรโทคอล แทนกระแสข้อมูลดิบ หลังคีย์เวิร์ดบัฟเฟอร์ การจับคู่ content ที่ตามมาจะใช้กับส่วนนั้นของโพรโทคอลที่แยกวิเคราะห์แล้ว
http_uri— URI ของคำขอhttp_header— ส่วนหัวของคำขอ/การตอบกลับhttp_user_agent— User-Agenttls_sni/dns_query— ชื่อเซิร์ฟเวอร์ TLS / คำค้น DNS
วิธีนี้เชื่อถือได้มากกว่าการค้นหาสตริงย่อยในแพ็กเก็ตทั้งแพ็กเก็ต
alert http any any -> any any ( \
msg:"Suspicious user agent"; \
http.user_agent; content:"sqlmap"; nocase; \
sid:1000004; rev:1; )PCRE และการไม่แยกตัวพิมพ์เล็กใหญ่
เมื่อสตริงคงที่ไม่เพียงพอ pcre จะเพิ่มความสามารถในการใช้นิพจน์ปกติที่เข้ากันได้กับ Perl ควรใช้ตัวกรองเบื้องต้น content ที่มีต้นทุนต่ำคู่กับ pcre เพื่อให้นิพจน์ปกติทำงานเฉพาะกับแพ็กเก็ตที่เป็นตัวเลือกเท่านั้น ซึ่งช่วยรักษาประสิทธิภาพไว้
ตัวปรับแต่ง nocase ทำให้การจับคู่เนื้อหาไม่แยกตัวพิมพ์เล็กใหญ่ ซึ่งสำคัญสำหรับส่วนหัวและฟิลด์ที่ผู้ใช้ควบคุมได้และผู้โจมตีสามารถปรับเปลี่ยนได้
alert http any any -> $HOME_NET any ( \
msg:"SQLi attempt in URI"; \
http.uri; content:"select"; nocase; \
pcre:"/union\s+select/i"; \
sid:1000005; rev:1; )คีย์เวิร์ดโฟลว์และสถานะ
ตัวเลือก flow จะจำกัดขอบเขตของกฎตามสถานะและทิศทางของการเชื่อมต่อ ช่วยลดผลบวกลวงและต้นทุนการประมวลผล
established— ใช้เฉพาะกับเซสชัน TCP ที่เสร็จสมบูรณ์แล้วto_server/to_client— ทิศทางคำขอเทียบกับการตอบกลับ
การจับคู่การตอบกลับจากเซิร์ฟเวอร์เฉพาะเมื่อการเชื่อมต่อสร้างเสร็จแล้วและอยู่ในทิศทาง to_client จะช่วยป้องกันการทำงานกับแพ็กเก็ตหลงทางหรือแพ็กเก็ตปลอมแปลง
alert tcp $HOME_NET any -> $EXTERNAL_NET any ( \
msg:"Beacon response"; \
flow:established,to_client; \
content:"|00 01 02 03|"; \
sid:1000006; rev:1; )ข้อมูลเมตา: sid, rev, msg, reference
ตัวเลือกสำหรับจัดระเบียบช่วยให้ชุดกฎดูแลรักษาได้ง่าย:
sid— รหัสลายเซ็นที่ไม่ซ้ำกัน (ใช้ 1000000+ สำหรับกฎภายใน)rev— หมายเลขรุ่นแก้ไข ซึ่งต้องเพิ่มทุกครั้งที่แก้ไขmsg— ข้อความแจ้งเตือนที่นักวิเคราะห์เห็นclasstype— หมวดหมู่ที่ใช้กำหนดลำดับความสำคัญreference— ลิงก์ไปยัง CVE หรือคำแนะนำด้านความปลอดภัย
sid ที่คงที่และ rev ที่เพิ่มขึ้นตามลำดับช่วยให้คุณติดตามและอัปเดตกฎได้โดยไม่ทำให้แดชบอร์ดและการระงับการแจ้งเตือนเสียหาย
alert tcp any any -> $HOME_NET 445 ( \
msg:"EternalBlue exploit attempt"; \
flow:to_server,established; content:"|FF|SMB"; \
classtype:attempted-admin; \
reference:cve,2017-0144; sid:1000007; rev:2; )ความแตกต่างระหว่าง Snort กับ Suricata
แม้จะใช้กฎร่วมกันได้ แต่เอนจินทั้งสองมีความสามารถแตกต่างกัน:
- Suricata ทำงานแบบหลายเธรด แยกวิเคราะห์โพรโทคอลแอปพลิเคชันได้โดยกำเนิด แยกไฟล์ออกมา คำนวณ JA3 และส่งออก JSON ของ EVE
- Snort 3 เขียนเอนจินใหม่เพื่อเพิ่มประสิทธิภาพและรองรับระบบปลั๊กอินแบบแยกส่วน
คีย์เวิร์ดบางรายการใช้ได้เฉพาะกับเอนจินใดเอนจินหนึ่ง Suricata เพิ่มคีย์เวิร์ดระดับแอปพลิเคชัน (tls.sni, dns.query, http.method) รวมถึงความสามารถด้านชุดข้อมูลและ flowbits เมื่อแชร์กฎ ให้กำหนดเป้าหมายเป็นความสามารถร่วมขั้นต่ำสุด หรือดูแลชุดกฎแยกตามเอนจิน
การกรองตามอัตราและเกณฑ์จำกัด
เพื่อป้องกันไม่ให้กฎส่งข้อความจำนวนมากจนท่วมคอนโซล ให้ใช้เกณฑ์จำกัด detection_filter จะทำงานต่อเมื่อพบเหตุการณ์จำนวน N ครั้งภายในช่วงเวลาหนึ่ง ส่วน threshold ร่วมกับ limit จะจำกัดปริมาณการแจ้งเตือน
สิ่งนี้จำเป็นสำหรับการตรวจจับการเดารหัสผ่านแบบลองซ้ำและการสแกน เพราะเหตุการณ์เดียวไม่มีความหมาย แต่การเกิดเหตุการณ์ถี่เป็นสัญญาณสำคัญ
alert tcp any any -> $HOME_NET 22 ( \
msg:"SSH brute force"; flow:to_server; \
detection_filter:track by_src, count 5, seconds 60; \
sid:1000008; rev:1; )ตรวจสอบอย่างรวดเร็ว
อ่านกฎหนึ่งข้อแล้วคาดการณ์พฤติกรรมของกฎ
สรุปทบทวน
ขณะนี้คุณสามารถอ่านและเขียนลายเซ็นของ Snort/Suricata ได้แล้ว:
- กฎหนึ่งข้อประกอบด้วย ส่วนหัว (การกระทำ, โพรโทคอล, ต้นทาง/ปลายทาง, ทิศทาง) และตัวเลือกใน ส่วนเนื้อหา
- การกระทำกำหนดว่าเป็น IDS หรือ IPS:
alert,drop,reject,pass contentร่วมกับ offset/depth และเลขฐานสิบหกใช้จับคู่ไบต์ของข้อมูลส่วนบรรทุก- บัฟเฟอร์แบบยึดติด (http.uri, tls.sni, dns.query) ใช้จับคู่ฟิลด์ของโพรโทคอลที่แยกวิเคราะห์แล้ว
pcreและnocaseจัดการรูปแบบที่เปลี่ยนแปลงได้flowจำกัดขอบเขตตามสถานะและทิศทางsid/rev/msg/referenceช่วยให้ดูแลกฎได้ง่าย- เกณฑ์จำกัดช่วยลดสัญญาณรบกวนจากการเดารหัสผ่านแบบลองซ้ำและการสแกน
ถัดไป: การตรวจจับภัยคุกคามโดยไม่ใช้ลายเซ็นเลย
คำถามที่พบบ่อย
บทเรียน “กฎลายเซ็นด้วย Snort และ Suricata” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กฎลายเซ็นด้วย Snort และ Suricata” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cyber Security Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กฎลายเซ็นด้วย Snort และ Suricata”
การเขียนและอ่านกฎเครือข่าย คุณปฏิบัติ Cyber Security Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cyber Security Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cyber Security Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “กฎลายเซ็นด้วย Snort และ Suricata” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cyber Security Academy นี้ได้ไหม
ได้ บทเรียน Cyber Security Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิด IDS เทียบกับ IPS
- กฎลายเซ็นด้วย Snort และ Suricata
- การตรวจจับความผิดปกติและพฤติกรรม
- การปรับแต่งและการนำไปใช้งาน