लॉग, श और क्रोन के आधार पर FreeBSD की सक्रिय सुरक्षा

सभी फ्रीबीएसडी प्रशासकों को बधाई!

FreeBSD पर अपना दूसरा सर्वर स्थापित करने और वहाँ महत्वपूर्ण कॉर्पोरेट जानकारी स्थानांतरित करने के बाद, मैंने सुरक्षा के बारे में सोचा। मैं खुद को एंटीवायरस, फायरवॉल और अतिरिक्त उपयोगी प्रणालियों के बारे में नहीं दोहराऊंगा - इनमें से किसी भी उपकरण ने मेरी समस्या हल नहीं की।

लॉग्स को देखते ही कार्य स्वयं उत्पन्न हो गया:
/var/log/exim/rejectlog
/var/log/auth.log
/var/log/apache22/httpd-error.log


एक्ज़िम के पासवर्ड को सर्वर और वेब मेल पर खोजने के असफल प्रयासों के बारे में उन्हें लगातार जानकारी मिली। जल्दी या बाद में, हमलावर पासवर्ड उठा सकते हैं, इसलिए आपको किसी तरह उन्हें रोकने की जरूरत है, उदाहरण के लिए, उनके आईपी पते को आईपीएफडब्ल्यू नियमों में जोड़कर। और वेब सर्वर पर उन्होंने गैर-मौजूद निर्देशिकाओं और प्रशासन से संबंधित फाइलों को खोजने की कोशिश की, जैसे कि phpmyadmin, जाहिर है, मौजूदा कमजोरियों के लिए उन्हें जांचने के लिए।

Google और सुरक्षा के कुछ पहलुओं पर एक लिसियारा लेख ने दिशा का सुझाव दिया।

अंत में समाधान सरल दिखता है: क्रोन एक मिनट में एक बार एक स्क्रिप्ट चलाता है, जो निर्दिष्ट लॉग्स को स्कैन करता है और फॉर्म में ipfw नियमों के लिए अशुभ घुसपैठियों को जोड़ता है:
deny ip from 123.123.123.123 to me

मैं एक फ़ाइल के साथ लिसियारा से स्क्रिप्ट को संशोधित करने में कामयाब रहा:


प्रत्येक लॉग फ़ाइल के लिए, मैंने क्रमशः अपनी स्वयं की स्क्रिप्ट बनाई,
mailsec.sh
nixsec.sh
websec.sh

क्योंकि समस्या को हल करने के लिए उनके पास थोड़ा अलग दृष्टिकोण है, लेकिन सामान्य अवधारणा समान है।

लिपियों ने तेजी से अपनी बिजली का काम किया, जानवर बल को लगभग असंभव बना दिया और अनावश्यक रूप से जिज्ञासुओं से रक्षा की। संचित आंकड़ों के अनुसार, एक मिनट में सबसे तेज 100 से अधिक चयन प्रयासों को बनाने में कामयाब रहा। लिपियों को चालू करने से पहले, प्रयास चौबीसों घंटे और अनगिनत थे।

मुझे लगता है कि इस तरह की स्क्रिप्ट प्रत्येक सर्वर पर होनी चाहिए, क्योंकि ज्यादा सुरक्षा कभी नहीं है।
मुझे उम्मीद है कि मेरा अनुभव इसमें आपकी मदद करेगा। मैं कोड लाता हूं। बिना किसी सवाल के जवाब देने के लिए तैयार।



mailsec.sh

 #!/bin/sh #  trusted_net='192.168.' debug_log="/var/log/mailsec.log" cur_log_file="rejectlog" cur_log_dir="/var/log/exim/" #echo "Hi!" > /dev/ttyv0 #         if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 04 ] then { #      echo "-= RULES STATS =-" >> ${debug_log} /sbin/ipfw show 3 >> ${debug_log} /sbin/ipfw delete 3 >/dev/null 2>&1 echo "-= RESET RULES =-" >> ${debug_log} date >> ${debug_log} } fi #         cat ${cur_log_dir}${cur_log_file} | grep "auth_login authenticator failed for" | sed 's/ (/--/' | sed 's/failed for--/failed for (/' | sort | awk '{print $1,$8}' | sed 's/\[/ /' | sed 's/\]:/ /' | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` logday=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 3` logmonth=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 2` logyear=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 1` IP=`echo ${count_IP} | awk '{print $3}'` day=`date +%d` mon=`date +%m` yea=`date +%Y` ippresent=`/sbin/ipfw show | grep ${IP} >/dev/null 2>&1` if [ ${day} -eq ${logday} ] && [ ${mon} -eq ${logmonth} ] && [ ${yea} -eq ${logyear} ] && [ ! ${ippresent} ] then { if [ ${count_deny} -ge 6 ] && echo $IP | grep ${trusted_net} >/dev/null 2>&1 then echo "MAILSEC: (bruteforce) IP address = ${IP} attempts count = ${count_deny}.    ( IP)" >> ${debug_log} else { if [ ${count_deny} -ge 6 ] then { echo "MAILSEC: (bruteforce) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 3 deny ip from ${IP} to me >/dev/null 2>&1 } fi } fi } fi done } 




nixsec.sh

 #!/bin/sh #echo "Hi!" > /dev/ttyv0 #        if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 00 ] then { /sbin/ipfw delete 1 >/dev/null 2>&1 echo "-= RESET RULES =-" >> /var/log/nixsec.log date >> /var/log/nixsec.log } fi # day=`date +%d` month=`date +%m` year=`date +%Y` log_dir="/var/old_log/${year}/${month}" #     mkdir -p ${log_dir} log_file="${log_dir}/${day}_auth.log" #   cat /var/log/auth.log > /tmp/auth.log cat /dev/null > /var/log/auth.log cat /tmp/auth.log >> ${log_file} #   IP     #    cat /tmp/auth.log | grep "Invalid user" | awk '{print $10}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (invalid user) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me #>/dev/null 2>&1 } fi done } #     cat /tmp/auth.log | grep "Did not receive identification string" | awk '{print $12}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (not ident) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #     c   cat /tmp/auth.log | grep "but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT" | awk '{print $7}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (break) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #  ,    root cat /tmp/auth.log | grep "User root from" | awk '{print $9}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (root attempt) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } 




websec.sh

 #!/bin/sh #  trusted_nets='192.168. 127.0. 10.0.' debug_log="/var/log/websec.log" cur_log_file="httpd-error.log" cur_log_dir="/var/log/apache22" old_log_dir="/var/log/apache22/old" #echo "Hi!" > /dev/ttyv0 #         if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 02 ] then { echo "-= RULES STATS =-" >> ${debug_log} /sbin/ipfw show 2 >> ${debug_log} /sbin/ipfw delete 2 >/dev/null 2>&1 echo "-= RESET RULES =-" >> ${debug_log} date >> ${debug_log} } fi #      day=`date +%d` month=`date +%m` year=`date +%Y` log_dir="${old_log_dir}/${year}/${month}" # Ј    mkdir -p ${log_dir} log_file="${log_dir}/${day}_${cur_log_file}" #   cat ${cur_log_dir}/${cur_log_file} > /tmp/${cur_log_file} #    cat /dev/null > ${cur_log_dir}/${cur_log_file} #    cat /tmp/${cur_log_file} >> ${log_file} #       cat /tmp/${cur_log_file} | grep "File does not exist" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 5 ] && echo $IP | grep 192.168. >/dev/null 2>&1 then echo "WEBSEC: (files) IP address = ${IP} attempts count = ${count_deny}.    ( IP)" >> ${debug_log} else { if [ ${count_deny} -ge 5 ] then { echo "WEBSEC: (files) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi } fi done } #      URI cat /tmp/${cur_log_file} | grep "Invalid URI in request" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "WEBSEC: (URI) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #     RFC cat /tmp/${cur_log_file} | grep "request without hostname" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "WEBSEC: (RFC) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } 


शायद श स्क्रिप्ट विशेषज्ञ कोड को अनुकूलित करने में मदद कर सकते हैं।

Source: https://habr.com/ru/post/In130501/


All Articles