'2025/02/04'에 해당되는 글 1건

  1. 13:30:31 hosts.deny 자동 추가 하기 (auth.log 의 ssh 접근 로그를 감시)

hosts.deny 자동 추가 하기 (auth.log 의 ssh 접근 로그를 감시)

|

우분투에서 /var/log/auth.log 를 실시간으로 감시하여

ssh로 로그인 시도후 실패 처리되는 모든 ip를 hosts.deny에 자동으로 추가하여

접속을 완전히 차단시키기 위한 스크립트데몬을 만들어 보았다. 

이전까지 fail2ban 을 사용하였지만 좀 더 즉각적이고 직관적인 관리가 필요했다.

특정 ip 또는 특정 id 로 로그인하는 경우는 차단하지 않도록 하는 내용도 추가하였다.

 

아래 bash script 코드를 적당한 파일명으로 작성하고 실행시켜두면 로그인 실패하는 모든 ip가 hosts.deny에 자동 추가 된다.

※ ※ ※ ※  아래 주의사항을 지키지 않으면 차단되어 로그인 못하는 불상사가 생길수 있으니 꼭 주의하자. ※ ※ ※ ※

※ 단 1번이라도 실패하면 차단되니 충분히 테스트를 한 후 적용한다. (미리 로그인 한 터미널을 잘 유지하자)
※ 사용자 ID 는  존재하거나 허용된 경우에만 user=에 출력된다.  꼭 로그인 가능한 ID로 접속해야 차단되지 않는다.
    (그렇지 않은 경우에도 필요ID를 차단시키지 않으려면 grep -q "authentication failure"  말고 다른 라인을 찾아서 검색조건을 바꿔야 한다.)
※ 모무조건 로그인 가능한 IP 하나는 꼭 지정한다.

 

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

#!/bin/bash


LOG_FILE="/var/log/auth.log"
HOSTS_DENY="/etc/hosts.deny"
EXCEPTION_IDS=("firstid" "secondid" "thirdid" "fourthid") # 예외 처리할 ID 목록
EXCEPTION_IPS=("111.111.111.111" "222.222.222.222" "1.0.0.1" "1.0.0.2") # 예외 처리할 IP 목록


tail -n0 -F $LOG_FILE | while read line
do
    if echo "$line" | grep -q "authentication failure"
    then
        IP=$(echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | tr -d ' \t\n\r')
        USER=$(echo "$line" | grep -oP '(?<![r])user=\K[^ ]*' | tr -d ' \t\n\r')

        # 예외 ID 체크
        EXCEPTION=false
        for EXCEPT_ID in "${EXCEPTION_IDS[@]}"
        do
            if [ "$USER" == "$EXCEPT_ID" ]
            then
                EXCEPTION=true
                break
            fi
        done

        # 예외 IP 체크
        for EXCEPT_IP in "${EXCEPTION_IPS[@]}"
        do
            if [ "$IP" == "$EXCEPT_IP" ]
            then
                EXCEPTION=true
                break
            fi
        done

        if [ ! -z "$IP" ] && [ "$EXCEPTION" == false ]
        then
            if ! grep -q "sshd: $IP" $HOSTS_DENY
            then
                echo "sshd: $IP" >> $HOSTS_DENY
                echo "$(date): Blocked $IP (Failed login for $USER)" >> /var/log/ip_block.log
            fi
        elif [ "$EXCEPTION" == true ]
        then
            echo "$(date): Ignored failed login attempt for exception user $USER from $IP" >> /var/log/ip_block.log
        fi
    fi
done

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

And
prev | 1 | next