check pass; user unknown 메세지로그 차단

리눅스/Security|2015. 1. 26. 18:04
반응형

불법 접근(SSH 무작위 접속시도, 스패머 릴레이 시도) 자동 차단, 통보 스크립트  
" 아래의 메세지가 /var/log/message
check pass; user unknown
Aug  9 14:17:40 localhost sshd(pam_unix)[9144]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=

 

 

 

vi  sshsecurity.sh
======================================================================================

 

#!/bin/sh

IPTABLES="/sbin/iptables" # iptables 의 절대 경로
#IPTABLES="/usr/local/sbin/iptables" # iptables 의 절대 경로
NUMBER=20   ## 1일 Block 적용 대상에 포함될 최대 체크 횟수 (Default:하루에 10번 이상 체킹 되면 해당 IP 패킷은 모두 DROP)
ORDER=4     ## iptables 정책에 몇번째 라인에 DROP 라인을 삽입할것인가 (Default:4번째 라인에 삽입)

 

## 작업디렉토리 지정, 없을시 생성
if [ ! -d "/root/root_dir" ] ; then
                mkdir -p "/root/root_dir"
                chmod 700 "/root/root_dir"
fi
#########################################
##### 211.43.205.124를 자기 서버 아피를 적는다.    #
########################################
## 최초 실행시(/root/root_dir/iptables.deny 파일이 비존재시) 실행되는 부분

 


if [ ! -f /root/root_dir/iptables.deny ]; then
        cd /root/root_dir

 

        grep "illegal" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
        sed -e "s/illegal//g" temp > iptables.deny.tmp

 

        grep "Invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $6 $10}' > temp
        sed -e "s/Invalid//g" temp >> iptables.deny.tmp

 

        grep "invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
        sed -e "s/invalid//g" temp >> iptables.deny.tmp

 

        grep "authentication failure" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' | awk -F"host=" '{print $2}' > temp
        #빈줄 없앰
        sed -e "/^$/d" temp > temp.tmp
        mv temp.tmp temp
        sed -e "s/uid=0rhost=//g" temp >> iptables.deny.tmp

 

        grep "Relaying denied" /var/log/maillog | egrep -v "211.43.205.124" | awk '{print $9}' | awk -F"[" '{print $2}' | awk -F"]" '{print $1}' > temp
        #빈줄 없앰
        sed -e "/^$/d" temp > temp.tmp
        mv temp.tmp temp
        sed -e "s/^//g" temp >> iptables.deny.tmp

 

if [ -s /root/root_dir/iptables.deny.tmp ]; then
sort iptables.deny.tmp | uniq > iptables.deny.uniq
# 일정 횟수 이상만 차단
for block_ip in $(cat iptables.deny.uniq)
        do
                num=`grep "$block_ip" iptables.deny.tmp | wc -l`
                if [ $num -gt $NUMBER ]
                        then
                        echo $block_ip >> iptables.deny
                fi
done

 

if [ -s /root/root_dir/iptables.deny ]; then
        sort iptables.deny | uniq > iptables.deny.uniq
        mv iptables.deny.uniq iptables.deny
fi
        ## 포착된 IP 관리자 메일로 통보
        if [ -s /root/root_dir/iptables.deny ]; then
        mail -s "[IPTABLES]불법 접근 IP 발견!! 방화벽:ALL 포트 차단" root@localhost < iptables.deny
        fi
        
        ## 방화벽 정책에 DROP 정책 추가
        if [ -s /root/root_dir/iptables.deny ]; then
        for DENY_LIST in $(cat iptables.deny);
                do $IPTABLES -I INPUT $ORDER -s $DENY_LIST -j DROP;
        done;
        fi

 

        rm -f /root/root_dir/temp
        rm -f /root/root_dir/illegal
        rm -f /root/root_dir/invalid
        rm -f /root/root_dir/authentication
        rm -f /root/root_dir/smtp_block
        rm -f /root/root_dir/iptables.deny.tmp

 

fi
else

 


### 최초 실행이 아닐경우에 구동되는 부분(/root/root_dir/iptables.deny 파일이 존재하고 있을경우)
cd /root/root_dir

 

sort iptables.deny | uniq > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny
#빈줄 없앰
sed -e "/^$/d" iptables.deny > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny

 


grep "illegal" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
sed -e "s/illegal//g" temp > iptables.deny.tmp

 

grep "Invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $6 $10}' > temp
sed -e "s/Invalid//g" temp >> iptables.deny.tmp

 

grep "invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
sed -e "s/invalid//g" temp >> iptables.deny.tmp

 


grep "authentication failure" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' | awk -F"host=" '{print $2}' > temp
#빈줄 없앰
sed -e '/^$/d' temp > temp.tmp
mv temp.tmp temp
sed -e "s/uid=0rhost=//g" temp >> iptables.deny.tmp

 

grep "Relaying denied" /var/log/maillog | egrep -v "211.43.205.124" | awk '{print $9}' | awk -F"[" '{print $2}' | awk -F"]" '{print $1}' > temp
#빈줄 없앰
sed -e '/^$/d' temp > temp.tmp
mv temp.tmp temp
sed -e "s/^//g" temp >> iptables.deny.tmp


if [ -s /root/root_dir/iptables.deny.tmp ]; then
sort iptables.deny.tmp | uniq > iptables.deny.uniq
# 일정 횟수 이상만 차단
for block_ip in $(cat iptables.deny.uniq)
        do
                num=`grep "$block_ip" iptables.deny.tmp | wc -l`
                if [ $num -gt $NUMBER ]
                        then
                        echo $block_ip >> iptables.deny.tmp.tmp
                fi
done

 

if [ -s /root/root_dir/iptables.deny.tmp.tmp ]; then
sort iptables.deny.tmp.tmp | uniq >> iptables.deny.tmp.tmp.uniq
mv iptables.deny.tmp.tmp.uniq iptables.deny.tmp.tmp

 

diff iptables.deny.tmp.tmp iptables.deny | awk -F"< " '{print $2}' > deny.new
#빈줄 없앰
sed -e '/^$/d' deny.new > deny.new.tmp
mv deny.new.tmp deny.new

 

sort deny.new | uniq >> deny.new.tmp
mv deny.new.tmp deny.new
fi

 

## 포착된 IP 관리자 메일로 통보
if [ -s /root/root_dir/deny.new ]; then
        mail -s "[IPTABLES]불법 접근 IP 발견!! 방화벽:ALL 포트 차단" root@localhost < /root/root_dir/deny.new
fi

 

## 방화벽 정책에 DROP 정책 추가
if [ -s /root/root_dir/deny.new ]; then
for DENY_LIST in $(cat deny.new);
        do $IPTABLES -I INPUT $ORDER -s $DENY_LIST -j DROP;
done;
cat deny.new >> iptables.deny

 

fi

 

## 스크립트 실행 중 생성된 임시 파일들 삭제
rm -f /root/root_dir/temp
rm -f /root/root_dir/illegal
rm -f /root/root_dir/invalid
rm -f /root/root_dir/authentication
rm -f /root/root_dir/smtp_block
rm -f /root/root_dir/deny.new
rm -f /root/root_dir/iptables.deny.tmp
rm -f /root/root_dir/iptables.deny.tmp.tmp

 

sort iptables.deny | uniq > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny
#빈줄 없앰
sed -e '/^$/d' iptables.deny > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny

 

fi

 

fi

 

cd - > /dev/null 2>&1

 

======================================================================================


* 위의  스크립트를  임의의 파일명으로
 /etc/cron.1min/sshsecurity.sh  아래에 위치시키고,

 

 /etc/crontab 에 */1 * * * * root run-parts /etc/cron.1min

 

라인을 추가시키면 매, 1분마다 불법접근을 분석후 차단시킴.

 

* 하루에 10번(패스워드 입력 실패, 불법 릴레이 시도, 비존재 계정 접근 시도 등..)의 제한을 두었으므로, 로그파일(/var/log/messages)역시 하루에 한번 로테이션 되게 설정.

 

* 매일 리셋되어야 하므로,  /root/root_dir/iptables.deny 파일 내용을 하루에 한번 리셋(클리어) 해주어야 함
- 리셋 스크립트 내용을 아래의 디렉토리에 만들어주고 (/etc/cron.daily/reset_iptables_deny.sh)
======================================================================================
#!/bin/bash
cat /root/root_dir/iptables.deny >> /root/root_dir/iptables.deny_history
cat /dev/null > /root/root_dir/iptables.deny
uniq /root/root_dir/iptables.deny_history > /root/root_dir/iptables.deny_history.tmp
mv /root/root_dir/iptables.deny_history.tmp /root/root_dir/iptables.deny_history
/etc/rc.d/rc.firewall
======================================================================================

 

* 방화벽 구동시 차단된 아이피 자동 로딩 부분 추가 
 (/etc/rc.d/rc.firewall 파일 하단에 아래 스크립트 추가)함
======================================================================================
############# 불법 접근 시도 IP 차단 (해당 스크립트 구동시) #########################
if [ -s /root/root_dir/iptables.deny ]; then
for DENY_LIST in $(cat /root/root_dir/iptables.deny);
        do $IPTABLES -I INPUT 4 -s $DENY_LIST -j DROP;
#### 4 는 정책이 들어간 순서(몇번째 라인에 삽입할것인가 임)
done;
fi
======================================================================================

반응형

댓글()