iptables ดีเริ่มต้นกฎสำหรับเว็บเซิร์ฟเวอร์หรือไม่


12

ฉันกำลังติดตั้งเซิร์ฟเวอร์ centos 5.4 ใหม่และฉันต้องการมีชุดกฎที่สะอาดสำหรับ mu iptables เพื่อเริ่มต้น

กฎที่ดีในการเริ่มต้นคืออะไร?

นี่เป็นจุดเริ่มต้นที่ดีหรือไม่:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

สำหรับกฎนี้คืออะไร:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

อัปเดต:

มันจะเป็นเว็บเซิร์ฟเวอร์ที่มี FTP (จำเป็น), apache, SSH, mysql


ฉันใช้กฎง่ายๆนี้ .... ปิดทุกอย่างและทำงานย้อนหลังและเปิดสิ่งที่จำเป็น สำหรับเว็บเซิร์ฟเวอร์โดยทั่วไปพอร์ต 80/443 เป็นบริการสาธารณะเท่านั้น บล็อกทุกอย่างอื่นหรือ จำกัด การเข้าถึง - ตัวอย่างเช่น จำกัด ssh ไปยัง IP ที่ระบุหรือเครือข่ายส่วนตัว
jeffatrackaid

คำตอบ:


13

กฎ IPTables ของคุณดูเหมือนจะเหมาะสมที่สุดสำหรับเซิร์ฟเวอร์ของคุณ แต่ฉันขอแนะนำการเปลี่ยนแปลงที่เป็นไปได้สองประการ:

  • หากคุณไม่ต้องการอนุญาตการเข้าถึง SSH, MySQL และ FTP จากอินเทอร์เน็ตทั้งหมดการใช้ตัวเลือก '--source' เพื่อ จำกัด การเข้าถึงพอร์ตเหล่านั้นจากที่อยู่ IP ที่ได้รับอนุมัติเท่านั้น ตัวอย่างเช่นเพื่ออนุญาตการเข้าถึง SSH จากที่อยู่ IP 71.82.93.101 คุณจะเปลี่ยนกฎข้อที่ 5 เป็น 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT' คุณอาจจะต้องเพิ่มกฎแยกต่างหากสำหรับแต่ละที่อยู่ IP บุคคลที่คุณต้องการให้ดูที่คำถามนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับว่าiptables IP ที่หลายแหล่ง

  • หากเครื่องนี้ใช้เซิร์ฟเวอร์ DNS คุณอาจต้องการปิดกั้นการเข้าถึงพอร์ต 'โดเมน' (53) ในการทำเช่นนี้ให้ลบบรรทัด 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT' (สิ่งนี้ควรตอบคำถามสุดท้ายของคุณ BTW) หากคุณใช้เซิร์ฟเวอร์ DNS จริง ๆ ให้ปล่อยกฎนี้ไว้

  • หากคุณต้องการอนุญาตให้ไคลเอนต์ MySQL ระยะไกลเข้าถึงเครือข่ายคุณจะต้องเพิ่มบรรทัด 'iptables -A-INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' เพื่อเปิดการเข้าถึงภายนอกไปยังพอร์ต MySQL มาตรฐาน . แต่อย่าทำเช่นนี้เว้นแต่ว่าจำเป็นจริงๆ - ถ้าคุณต้องการเข้าถึง MySQL เฉพาะที่ (สำหรับแอป PHP ที่ทำงานภายใต้ Apache ให้พูด) คุณไม่จำเป็นต้องให้การเข้าถึง MySQL ระยะไกล และถ้าคุณไม่ต้องการเสี่ยงต่อการถูกแฮ็กถ้าคุณเปิดพอร์ต 3306 กับเครือข่ายตรวจสอบให้แน่ใจว่าคุณต้องการรหัสผ่านที่รัดกุมสำหรับบัญชีผู้ใช้ MySQL ทั้งหมดและแพ็คเกจเซิร์ฟเวอร์ MySQL ของคุณเป็นรุ่นล่าสุด

  • หนึ่งในความคิดเห็นของคุณ ('อนุญาต ssh, dns, ldap, ftp และบริการบนเว็บ') กล่าวถึงบริการ LDAP แต่ไม่มีกฎดังกล่าวในการกำหนดค่าของคุณ สิ่งนี้เกิดขึ้นกับฉันมากมายเมื่อฉันคัดลอกการกำหนดค่าตัวอย่างและปรับเปลี่ยน มันจะไม่ส่งผลกระทบต่อฟังก์ชั่น แต่ฉันจะแก้ไขความคิดเห็นเนื่องจากความคิดเห็นที่ทำให้เข้าใจผิดอาจทำให้เกิดทางอ้อมโดยทำให้คุณหรือผู้ดูแลระบบคนอื่นสับสนในอนาคต

จากประสบการณ์ของฉันมันยากที่จะเกิดขึ้นกับกฎ IPTables ที่สมบูรณ์แบบ แต่ฉันคิดว่าคุณกำลังอยู่ในเส้นทางที่ถูกต้อง โชคดีที่เรียนรู้เพิ่มเติมเกี่ยวกับ IPTables - กฎเหล่านี้อาจดูซับซ้อนในตอนแรก แต่มันเป็นทักษะที่มีประโยชน์มากสำหรับระบบปฏิบัติการลีนุกซ์ใด ๆ


1
แทนที่จะอนุญาตให้เข้าถึง MySQL ระยะไกลผ่านไฟร์วอลล์คุณสามารถมั่นใจได้ว่าทุกคนที่ต้องการเข้าถึงเซิร์ฟเวอร์ MySQL มีสิทธิ์ที่จะทำให้พอร์ต SSH ส่งต่อ
ptman

การส่งต่อพอร์ต SSH เป็นทางเลือกที่มีศักยภาพในการเปิดพอร์ตและล็อคสิทธิ์ MySQL แต่ถ้าเขาจัดการกับข้อมูลที่ละเอียดอ่อนและ / หรือเขาเป็นเป้าหมายที่มีรายละเอียดสูง (ซึ่งจะทำให้คุณสมบัติการเข้ารหัสของ SSH มีประโยชน์) ฉันไม่เห็นประโยชน์ ท้ายที่สุด SSH tunneling มีข้อเสียของตัวเองรวมถึง: การติดตั้ง / กำหนดค่ายุ่งยาก; เพิ่มการใช้งาน CPU และ จำกัด แบนด์วิดท์ (เนื่องจากขนาดบัฟเฟอร์คงที่ของ OpenSSH) และถ้าเขาไม่ต้องการให้ไคลเอนต์ MySQL ระยะไกลของเขาทั้งหมดมีล็อกอินในเครื่อง?
Ryan B. Lynch

เท่าที่ความคิดเห็นที่ไม่ตรงกับกฎไปกฎ ICMP อนุญาต traceroutes, การค้นพบ PMTU และข้อความที่มีประโยชน์อื่น ๆ แต่พวกเขาไม่อนุญาตให้ส่ง Ping (echo-Request และ echo-reply)
เจอรัลด์รวงผึ้ง

เจอราลด์นั่นเป็นเรื่องที่ดีฉันไม่ได้สังเกตเลย เขาน่าจะเปลี่ยนความคิดเห็นเพื่อให้ทราบว่าไม่อนุญาตให้ ping หรือเขาควรเพิ่มกฎที่อนุญาตให้ ICMP echo ร้องขอ / ตอบกลับปริมาณข้อมูล
Ryan B. Lynch

4

พยายาม จำกัด การรับส่งข้อมูลขาออกของคุณด้วย

ฉันเคยเห็นหลายกรณีที่การโจมตีด้วย PHP ส่งผลให้คนที่ใช้ 'curl' หรือ 'wget' เพื่อดึงรหัสที่เป็นอันตรายจากที่อื่นจากนั้นเรียกใช้งานบนเซิร์ฟเวอร์ของคุณเพื่อเข้าร่วมบอทเน็ต

หากคุณไม่คาดหวังให้ Apache (เป็นตัวอย่าง) ต้องพูดคุยกับเว็บไซต์อื่นเอง จำกัด ปริมาณการใช้งานและช่วยตัวเองให้เจ็บปวดเล็กน้อย!


2

กฎเหล่านี้พร้อมที่จะนำเข้าผ่าน "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

และสำหรับระเบียน ... นโยบายเริ่มต้นเหล่านี้ควรตั้งค่าเช่นกันหากไม่ได้ใช้ iptables-restore ข้างต้น:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

ฉันได้แก้ไขโพสต์ของคุณ - StackOverflow เป็นรูปแบบคำถาม / คำตอบ โปรดอ่านคำถามที่พบบ่อย: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

สิ่งนี้จะนำเสนอปัญหาด้านประสิทธิภาพเนื่องจากกฎ stateful ปรากฏขึ้นที่นี่และควรปรากฏเป็นอันดับแรกเนื่องจากตรงกับแพ็กเก็ตส่วนใหญ่
Michael Hampton

0

ทำไมคุณถึงอนุญาตให้ ftp และ dns เซิร์ฟเวอร์ของคุณมีบริการเหล่านั้นหรือไม่ ไม่ควรใช้ FTP ยกเว้นกรณีการใช้งานเฉพาะบางกรณีให้ใช้ SFTP แทน (ไม่ใช่ FTPS) นอกจากนี้ทำไมระบุพอร์ตอื่นทั้งหมดด้วยชื่อสัญลักษณ์และ http ด้วยตัวเลข 80 คุณเพิ่งคัดลอกสิ่งนี้จากที่อื่นหรือไม่ ไม่มีการคัดลอกและให้คำแนะนำที่จะทำให้ขาดความเข้าใจ ตรวจสอบให้แน่ใจว่าคุณเข้าใจ TCP, IP, ไฟร์วอลล์และโปรโตคอลของบริการที่คุณจะให้


ฉันไม่ได้ตั้งใจที่จะรุกราน ptman แต่ฉันคิดว่าคำตอบของคุณอาจถูกมองว่าเป็นคนค่อนข้างสุภาพและวางตัว นอกจากนี้คุณไม่ได้ตอบคำถามจริงๆ หากผู้ถามขาดความเข้าใจคุณไม่คิดว่าจะเป็นการดีกว่าถ้าพูดด้วยความเคารพและให้การศึกษาเฉพาะเรื่องแก่เขา
Ryan B. Lynch

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