ยอมรับ RELATED, ESTABLISHED สำหรับทุกแหล่งใน iptables ที่ถือว่า“ เปิดมากเกินไป” หรือไม่


9

ฉันมักจะเห็นกฎที่-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTใช้ ในขณะที่ฉันไม่ใช่ผู้เชี่ยวชาญบรรทัดนั้นเกี่ยวข้องกับฉัน เห็นได้ชัดว่ากฎอนุญาตการรับส่งข้อมูลทั้งหมดโดยมีข้อยกเว้นเพียงอย่างเดียวว่าการเชื่อมต่อจะต้องมีการสร้างขึ้นหรือเกี่ยวข้องกับการเชื่อมต่อที่สร้างไว้แล้ว

สถานการณ์

  • ฉันจะอนุญาตให้เชื่อมต่อกับพอร์ต SSH เริ่มต้น22จากเซิร์ฟเวอร์ LAN ในซับเน็ต192.168.0.0/16หรืออะไรก็ตาม
  • SuperInsecureApp®เปิดเผยบางสิ่งบนพอร์ต1337ซึ่งฉันเพิ่มลงในINPUTห่วงโซ่ของฉัน
  • ฉันได้เพิ่มconntrackกฎเพื่อยอมรับESTABLISHEDและRELATEDจากทุกแหล่ง
  • นโยบายลูกโซ่คือ DROP

ดังนั้นโดยทั่วไปแล้วการกำหนดค่า shoud อนุญาตให้เชื่อมต่อ SSH จาก LAN เท่านั้นในขณะที่อนุญาตการรับส่งข้อมูลขาเข้าบนพอร์ต 1337 จากโลก

นี่คือที่ที่ความสับสนของฉันบาน จะconntrackในทางใดทางหนึ่งเปิดเผยข้อบกพร่องการรักษาความปลอดภัยที่จะช่วยให้หนึ่งที่จะได้รับการเชื่อมต่อที่จัดตั้งขึ้นใน 1337 (ตั้งแต่มันเปิดโลก) แล้วใช้การเชื่อมต่อที่สามารถเข้าถึงพอร์ต SSH (หรือพอร์ตอื่น ๆ สำหรับเรื่องที่)?

คำตอบ:


8

ฉันจะไม่พิจารณา ESTABLISHED และการเข้าชมที่เกี่ยวข้องเปิดเกินไป คุณอาจจะไม่เกี่ยวข้องกับ RELATED แต่ควรอนุญาตให้ ESTABLISHED ทั้งสองประเภทการเข้าชมเหล่านี้ใช้สถานะ conntrack

การเชื่อมต่อ ESTABLISHED ได้รับการตรวจสอบโดยกฎอื่นแล้ว สิ่งนี้ทำให้การใช้กฎทิศทางเดียวทำได้ง่ายกว่ามาก สิ่งนี้อนุญาตให้คุณทำธุรกรรมต่อบนพอร์ตเดียวกันเท่านั้น

การเชื่อมต่อที่เกี่ยวข้องนั้นจะถูกตรวจสอบโดยกฎอื่น มันไม่ได้ใช้กับโปรโตคอลจำนวนมาก พวกเขาทำให้การกำหนดค่ากฎง่ายขึ้นอีกครั้ง พวกเขายังมั่นใจลำดับที่เหมาะสมของการเชื่อมต่อที่พวกเขาใช้ สิ่งนี้ทำให้กฎของคุณปลอดภัยยิ่งขึ้น แม้ว่าสิ่งนี้อาจทำให้สามารถเชื่อมต่อบนพอร์ตอื่นได้ แต่พอร์ตนั้นควรเป็นส่วนหนึ่งของกระบวนการที่เกี่ยวข้องเช่นการเชื่อมต่อข้อมูล FTP พอร์ตใดที่อนุญาตให้มีการควบคุมโดยโมดูลควบคุมเฉพาะโปรโตคอล

ด้วยการอนุญาตให้มีการเชื่อมต่อ ESTABLISHED และ RELATED คุณจะสามารถมุ่งเน้นไปที่การเชื่อมต่อใหม่ที่คุณต้องการให้ไฟร์วอลล์ยอมรับ นอกจากนี้ยังหลีกเลี่ยงกฎที่ใช้งานไม่ได้ซึ่งหมายความว่าอนุญาตให้รับส่งคืน แต่จะอนุญาตการเชื่อมต่อใหม่

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

มีความเป็นไปได้สูงมากที่การเชื่อมต่อบนพอร์ต 1337 สามารถใช้เพื่อเข้าถึงพอร์ต 22 ได้จากระยะไกล แต่เป็นไปได้ที่การเชื่อมต่อกับพอร์ต 1337 สามารถใช้เพื่อเชื่อมต่อพร็อกซีกับพอร์ต 22

คุณอาจต้องการให้ SSH มีความปลอดภัยในเชิงลึก:

  • ใช้ hosts.allow เพื่อ จำกัด การเข้าถึงนอกเหนือจากข้อ จำกัด ไฟร์วอลล์
  • ป้องกันการเข้าถึงรูทหรืออย่างน้อยต้องใช้กุญแจและ จำกัด การเข้าถึงในไฟล์ authorized_keys
  • ตรวจสอบความล้มเหลวในการเข้าสู่ระบบ เครื่องสแกนบันทึกสามารถส่งรายงานที่ผิดปกติเป็นระยะ ๆ ถึงคุณ
  • พิจารณาใช้เครื่องมือเช่น fail2ban เพื่อบล็อกการเข้าถึงโดยอัตโนมัติเมื่อเกิดความล้มเหลวในการเข้าถึงซ้ำ

แม้ว่านี่จะเป็นตัวอย่างโดยพลการ แต่สิ่งแรกที่ฉันทำบนเซิร์ฟเวอร์ใหม่คือการปิดใช้งานการเข้าถึงรูทและการรับรองความถูกต้องแบบธรรมดาใน sshd - นั่นเป็นคำแนะนำที่ดีมาก นอกจากนี้ fail2ban ยังถูกติดตั้งในการตั้งค่าในชีวิตจริงจากตัวอย่างที่ได้รับแรงบันดาลใจ "การเชื่อมต่อ ESTABLISHED ได้รับการตรวจสอบโดยกฎอื่นแล้ว"เป็นสิ่งที่ฉันไม่แน่ใจเกี่ยวกับและตอบคำถามของฉันได้อย่างสมบูรณ์แบบ ขอบคุณสำหรับคำตอบที่ชัดเจนของคุณ!
Dencker

คำถามด้านข้าง: จากมุมมองของประสิทธิภาพมันจะเปลี่ยนแปลงอะไรบ้างไหมถ้าconntrackกฎนั้นอยู่ในจุดเริ่มต้นหรือจุดสิ้นสุดของโซ่ จากความเข้าใจของฉันiptablesมันจะต้องประมวลผลกฎทั้งหมดในการเชื่อมต่อที่จัดตั้งขึ้นถ้ามันอยู่ในท้ายที่สุดและมีเพียงกฎเดียวนั้นถ้ามันถูกวางไว้ในจุดเริ่มต้น?
Dencker

@Dencker คุณต้องการกฎที่สร้างขึ้นและเกี่ยวข้องก่อน จะยอมรับการเข้าชมมากที่สุด นอกเหนือจากนั้นคุณอาจต้องการมีกฎที่ยอมรับปริมาณการใช้งานมากที่สุดแม้ว่าจะเป็นการดีที่สุดที่จะชั่งน้ำหนักอย่างหนักเพื่อให้สามารถอ่านได้ กฎของฉันถูกจัดกลุ่มไวต่อเวลาแฝงการรับส่งข้อมูลสูง (จัดกลุ่มตามประเภท) อื่น ๆ Iptables มีตัวนับที่อนุญาตให้คุณดูปริมาณการรับส่งข้อมูลแต่ละกฎ ฉันใช้ Shorewall ซึ่งเพิ่มค่าเริ่มต้นที่มีประโยชน์และมีไฟล์กฎการอ่านที่ง่ายในการสร้างไฟร์วอลล์ของฉัน
BillThor

2

ESTABLISHED และ RELATED เป็นคุณสมบัติของการกรองแพ็คเก็ต "stateful" ซึ่งการกรองไม่เพียง แต่ขึ้นอยู่กับชุดของกฎแบบคงที่ แต่ยังอยู่ในบริบทซึ่งพิจารณาว่าเป็นกลุ่มใด คุณต้องการ ESTABLISHED เพื่อให้การเชื่อมต่อทำงานได้และคุณต้องการ RELATED สำหรับข้อความ ICMP ที่เกี่ยวข้อง การกรองแบบ Stateful อนุญาตให้กรองได้แม่นยำยิ่งขึ้นเมื่อเปรียบเทียบกับกฎ "ไร้สัญชาติ" แบบคงที่

ลองดู ESTABLISHED ก่อน เช่นพิจารณา TCP พอร์ต 22. ริเริ่ม (ลูกค้า) จะส่งไปSYN serverIPaddr:22เซิร์ฟเวอร์ส่งคืนSYN+ACKไปยังไคลเอ็นต์ ACKตอนนี้ก็เปิดของลูกค้าที่จะส่ง กฎการกรองบนเซิร์ฟเวอร์ควรมีลักษณะอย่างไรเช่นว่ายอมรับเฉพาะ "การจับคู่" ACKเท่านั้น กฎไร้สัญชาติทั่วไปจะดูเหมือน

-A INPUT --proto tcp --port 22 -j ACCEPT

ซึ่งมีแนวคิดเสรีมากกว่ากฎแบบรัฐ กฎไร้สัญชาติอนุญาตให้ส่วน TCP โดยพลการเช่นACKหรือFINไม่ได้สร้างการเชื่อมต่อก่อน สแกนเนอร์พอร์ตสามารถใช้ประโยชน์จากพฤติกรรมเช่นนี้สำหรับการพิมพ์ลายนิ้วมือ OS

ตอนนี้เรามาดูที่เกี่ยวข้องกัน ใช้สำหรับข้อความ ICMP ซึ่งส่วนใหญ่เป็นข้อความแสดงข้อผิดพลาด ตัวอย่างเช่นหากแพ็กเก็ตจากเซิร์ฟเวอร์ไปยังไคลเอนต์หลุดจากนั้นข้อความผิดพลาดจะถูกส่งไปยังเซิร์ฟเวอร์ ข้อความแสดงข้อผิดพลาดนี้คือ "เกี่ยวข้อง" กับการเชื่อมต่อที่สร้างไว้ก่อนหน้านี้ หากไม่มีกฎที่เกี่ยวข้องเราจะต้องอนุญาตข้อความแสดงข้อผิดพลาดที่เข้ามาโดยทั่วไป (โดยไม่มีบริบท) หรือตามที่กำหนดเองสำหรับหลาย ๆ ไซต์ให้วาง ICMP พร้อมกันแล้วรอเวลาหมดเวลาในเลเยอร์การขนส่ง (โปรดทราบว่านี่เป็นแนวคิดที่ไม่ดีสำหรับ IPv6 แต่ ICMPv6 มีบทบาทสำคัญสำหรับ IPv6 มากกว่า ICMP สำหรับ IP ดั้งเดิม)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.