สคริปต์ที่ปรึกษากฎ iptables


9

มีเซิร์ฟเวอร์ที่ไม่มีการป้องกันiptables :ACCEPT all..

อาจมีแอปพลิเคชันที่กำหนดเองบนเซิร์ฟเวอร์นี้

หากเราจำเป็นต้องทำให้เซิร์ฟเวอร์นี้แข็ง (ปฏิเสธทั้งหมดและอนุญาตเฉพาะสิ่งที่แอปพลิเคชันต้องการ) ด้วยกฎ iptables ที่เข้มงวดเราต้องค้นหาด้วยตนเองว่าแอปใดที่ใช้ซึ่งdst/src port/protocolแล้วเราต้องเขียนกฎ iptables สำหรับ พวกเขา ..

คำถาม : มีสคริปต์ใดบ้างที่สามารถช่วยรวบรวมข้อมูลเหล่านี้จากเครื่องที่กำลังทำงานอยู่ได้? (จากบันทึกหรือไม่) - และสร้างกฎ iptables โดยอัตโนมัติหรือไม่

เหมือนมีในaudit2allow SELinuxเพียงเพื่อiptables!

เครื่องไม่สามารถหยุดทำงานได้!

ตัวอย่าง: สคริปต์ "MAGIC" ควรรันสัปดาห์ / เดือนบนเครื่องรวบรวมข้อมูลจากนั้นหลังจากสัปดาห์ / เดือนสคริปต์จะสามารถสร้างไฟล์กฎ iptables ที่เราสามารถใช้ได้

หลายคนอาจได้รับในสถานการณ์เช่นนี้ (วิธีทำให้เซิร์ฟเวอร์แข็งขึ้นเกี่ยวกับ iptables) และมันจะดีมากถ้ามีสคริปต์ / โซลูชันที่สามารถทำได้: \


หรือบล็อกทุกอย่างและปล่อยให้สิ่งที่ต้องการผ่าน คุณสามารถค้นหาสิ่งที่ต้องการด้วยการรัน tcpdump มากกว่าหนึ่งสัปดาห์หรือมากกว่านั้น
Lawrence

ไม่มีการหยุดทำงานบนเครื่องนี้ :)
evachristine

1
เกิดอะไรขึ้นกับfail2ban
totti

1
คุณสามารถตรวจสอบทราฟฟิกหรือตรวจสอบพอร์ตที่เปิดอยู่ แต่คุณอาจจะไม่ค่อยได้รับ แต่ทราฟฟิกขาออกที่สำคัญ (อัปเดตความปลอดภัยพิเศษอีเมลที่ส่งในกรณีที่หายาก ... ) ตราบใดที่คุณต้องการกรองทราฟฟิกที่เข้ามาการมอนิเตอร์อาจเป็นตัวเลือก
jofel

นี่เป็นไปได้ที่จะทำคุณสามารถเขียนสคริปต์วิธีสร้างชุดกฎจากแอปพลิเคชันที่รันอยู่และพอร์ตที่เปิดเผย แต่คุณจริงๆไม่ต้องการที่จะทำเช่นนี้เพราะ 1) ในกรณีส่วนใหญ่ไม่ได้ให้บริการทั้งหมดจะต้องสัมผัสกับเครือข่ายและ 2) อาจจะมีการให้บริการอย่างที่คุณไม่ต้องการที่จะได้สัมผัสกับเครือข่าย แต่ทำด้วยมือทันทีตั้งค่ากฎที่ดีและไปจากที่นั่น วิธีหนึ่งที่จะทำได้อย่างปลอดภัยคือการสร้างชุดกฎด้วยกฎ ESTABLISHED / RELATED และ ACCEPT จากนั้นตรวจสอบกฎที่เกี่ยวข้องว่าตรงกับปริมาณการใช้งานหรือไม่ เมื่อคุณมีความสุขให้เปลี่ยนนโยบายการป้อนข้อมูลเพื่อปล่อย
เปโดร

คำตอบ:


2

ทำด้วยตนเอง

sudo ss -tuanp

หรือ

sudo netstat -tuanp

คำอธิบาย:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name

1

เรียกใช้tcpdumpบนเครื่องเป็นเวลาหนึ่งสัปดาห์หรือมากกว่านั้นเพื่อบันทึกปริมาณการใช้งานโดยเฉลี่ย จากนั้นคุณสามารถเรียกดูทราฟฟิกโดยใช้ wireshark ในภายหลังเพื่อดูว่ามีการใช้พอร์ตใด

คำสั่งสำหรับสิ่งนี้จะเป็น tcpdump -i <interface> -s 65535 -w <some-file>

จากนั้นคุณสามารถแมปกลับนี้โดยใช้netstat -tuanpเพื่อดู PID / แอปพลิเคชันที่ใช้พอร์ตใด

ในทางทฤษฎีนี้สามารถเขียนสคริปต์


1

คุณสามารถเริ่มต้นด้วยเทมเพลตขั้นพื้นฐานอย่างเช่นhttps://gist.github.com/jirutka/3742890ซึ่งอนุญาตเฉพาะ ssh และ ping และเพิ่มสิ่งอื่นด้วยตนเอง

แฮ็คสคริปต์ที่รวดเร็วเพื่อสร้างกฎ iptables สำหรับแอปพลิเคชันของคุณฟังในส่วนต่อประสานสาธารณะ (0.0.0.0) / tcp

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

คุณยังสามารถใช้iptables -I INPUT <number>เพื่อฉีดกฎในสถานที่เฉพาะซึ่งคุณสามารถแสดงรายการด้วยiptables -nvL --line-numbers INPUT


1

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

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

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

หมายเหตุ:ในข้างต้นคุณสามารถดูว่าบริการใดที่ฉันใช้บนเซิร์ฟเวอร์ที่ยอมรับการเชื่อมต่อ TCP นั่นคือ "กำลังรับฟัง" สำหรับการเชื่อมต่อบนพอร์ตต่างๆ

การเริ่มต้นกับสิ่งต่าง ๆ เช่น SSH (พอร์ต 22) และ HTTP (พอร์ต 80) ไม่ใช่เรื่องง่ายหากสิ่งเหล่านี้เป็นเรื่องปกติสำหรับระบบของคุณดังนั้นฉันจะทำบริการประเภทนี้เป็นจำนวนมากในคราวเดียว สำหรับบริการอื่น ๆ เช่น LDAP หรือ NIS คุณอาจต้องการทำสิ่งเหล่านี้ในลักษณะที่ควบคุมได้มากขึ้น

เครื่องมือเช่นFireHOL , ตัวสร้างไฟร์วอลล์ (fwbuilder) และeztablesอาจเป็นประโยชน์ในขณะที่คุณโจมตีโครงการนี้เนื่องจากมันให้เลเยอร์ที่เป็นนามธรรมของการสร้างiptableกฎที่กำหนดเองด้วยมือซึ่งอาจเป็นเรื่องยุ่งยาก

FireHOL

FireHOL เป็นภาษา (และโปรแกรมที่เรียกใช้) ซึ่งสร้างไฟร์วอลล์ที่ปลอดภัยและระบุสถานะของความซับซ้อนใด ๆ จากการกำหนดค่าที่เข้าใจได้ง่ายและมนุษย์อ่านได้

ตัวอย่าง

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder เป็นเครื่องมือไฟร์วอลล์กราฟิกที่ไม่เหมือนใครที่ช่วยให้ผู้ใช้สร้างวัตถุจากนั้นลากและวางวัตถุเหล่านั้นลงในไฟร์วอลล์เพื่อสร้างระบบรักษาความปลอดภัยที่ทรงพลังสำหรับพีซีเครื่องเดียวหรือเครือข่ายพีซี Fwbuilder สนับสนุนไฟร์วอลล์ที่หลากหลาย (Cisco ASA / PIX, iptables Linux, ipfilter ของ FreeBSD, pf ของ OpenBSD และอื่น ๆ ) ดังนั้นกฎของมันจึงสามารถนำไปใช้กับหลายแพลตฟอร์มได้ มาดูการใช้ Fwbuilder บน Linux ซึ่งอาจกลายเป็นเรื่องตลอดชีวิตด้วยระบบความปลอดภัยที่มีประสิทธิภาพ

ตัวอย่าง

   ss fwbuilder

eztables

Eztables ช่วยให้คุณกำหนดค่าไฟร์วอลล์ได้อย่างรวดเร็วโดยไม่ต้องแตะ iptables ไวยากรณ์ของกฎไฟร์วอลล์ได้รับการออกแบบให้อ่านและใช้งานง่าย

นี่คือวิธีที่คุณอนุญาตให้อินเทอร์เน็ตทั้งหมดเข้าถึงเว็บเซิร์ฟเวอร์ของคุณบน TCP-port 80:

  allow_in any $eth0 any 80/tcp

Eztables ออกแบบมาให้เรียบง่าย แต่ทรงพลัง ไม่สำคัญว่าคุณต้องการปกป้องแล็ปท็อปของคุณกำลังตั้งค่าเราเตอร์ที่บ้านหรือสร้างไฟร์วอลล์ของ บริษัท

ใช้ Fail2Ban

ด้วยพื้นฐานiptablesไฟร์วอลล์ในสถานที่ที่คุณอาจจะต้องการที่จะชมเชยโดยใช้เครื่องมือเช่นfail2ban

สิ่งที่สกัดมา

Fail2ban สแกนไฟล์บันทึก (เช่น / var / log / apache / error_log) และแบนไอพีที่แสดงสัญญาณที่เป็นอันตราย - รหัสผ่านล้มเหลวมากเกินไปการค้นหาช่องโหว่ ฯลฯ โดยทั่วไป Fail2Ban จะใช้เพื่อปรับปรุงกฎไฟร์วอลล์เพื่อปฏิเสธที่อยู่ IP ตามระยะเวลาที่กำหนดถึงแม้ว่าการดำเนินการอื่นใดโดยพลการ (เช่นการส่งอีเมล) สามารถกำหนดค่าได้ Fail2Ban มาพร้อมกับตัวกรองสำหรับบริการต่างๆ (apache, courier, ssh, ฯลฯ )

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

อ้างอิง


0

ใช้กฎ iptable เพื่อบันทึกการเชื่อมต่อใหม่ที่จะบันทึก udp ด้วย

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

คุณสามารถระบุที่แตกต่างกัน--log-level เพื่อให้บันทึกในไฟล์อื่นที่ไม่ใช่ / var / log / messages (คุณจะต้องกำหนดค่า syslog daemon)

ฉันคิดว่าคุณควรอ่านบันทึกการใช้งานหลักเนื่องจากเซิร์ฟเวอร์บางตัวมีกิจกรรมเป็นระยะ ๆ เช่นเที่ยง, สิ้นสัปดาห์, สิ้นเดือน (ไตรมาส, ปี) ดังนั้นคุณจะไม่พลาดกิจกรรมเครือข่ายที่สำคัญของเซิร์ฟเวอร์

เนื่องจากเซิร์ฟเวอร์มีความสำคัญทำให้เมทริกซ์โฟลว์เครือข่ายของเซิร์ฟเวอร์บนสเปรดชีตที่ดี (แหล่งที่มา IP, ปลายทาง IP, โปรโตคอล, พอร์ต, แอปพลิเคชัน) ที่จะช่วยให้คุณสร้างกฎ


0

ฉันรู้ว่านี่ไม่ใช่สคริปต์และ ไม่ใช่คำตอบสำหรับคำถามของ OP แต่เป็นแนวคิดของฉันที่ฉันต้องการแบ่งปันกับ OP

ฉันได้ฟังพอร์ตทั้งหมดด้วย:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

บางทีนี่อาจช่วยให้คุณเขียนสคริปต์ของคุณเองได้ :)


0

คุณสามารถเริ่มต้นด้วยสิ่งนี้:

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

แล้วติดตามด้วย

iptables -P INPUT DROP

หรือ

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

สิ่งที่บรรทัดแรกทำคือใช้ netstat เพื่อแสดงรายการกระบวนการรับฟังและพอร์ต จากนั้นจะสร้างบรรทัด "iptables" เพื่ออนุญาตการเชื่อมต่อขาเข้าแต่ละรายการ การทดแทน regex sed เล็กน้อยถูกปรับแต่งสำหรับเอาต์พุต netstat บนเซิร์ฟเวอร์ของฉันดังนั้นจึงอาจต้องมีการปรับแต่งเล็กน้อยสำหรับคุณ เมื่อใช้งานได้คุณควรลงท้ายด้วยสิ่งที่ดูเหมือนว่า:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

สองสิ่งสำคัญที่ควรทราบ:

1) กฎเหล่านี้ไม่ได้ทำอะไรให้คุณจนกว่าคุณจะวางสาย DROP หรือ REJECT ที่ส่วนท้ายหรือทำให้นโยบายเริ่มต้นสำหรับแพ็กเก็ตที่ไม่ตรงกัน กฎเหล่านี้อนุญาตให้แพ็กเก็ตซึ่งเป็น moot หากนโยบายเริ่มต้นอนุญาตสิ่งใดที่ไม่ตรงกัน

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

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