우분투 해킹시도 로그파일로 iptables 자동 차단등록하기(파이썬작업) 및 cron 등록

리눅스 서버를 운영하다보면 국내 및 해외에서 지속적인 로그인 시도 공격을 받게 된다 우분투 서버인경우
/var/log/auth.log 에 로그인 시도시 성공 및 실패의 기록이 기록되게 되는데 이를 주기적으로 분석하고 파이썬으로
자동 iptables 등록할 수 있는 파일을 작성하여 특별히 수작업없이 cron 스케쥴링 하게되면 편하게 외부접속 실패 ip
를 자동 Block 할 수 있게 해준다.
1. 로그파일 확인 및 분석
$ vi /var/log/auth.log 엔터

로그파일에서 Failed password 부분을 로그인 실폐한 부분으로 해당라인의 ip 부분을 파이썬 프로그램으로 처리하도록 한다.
2. 로그파일 분석 및 등록용 파이썬 파일 생성
$ /var/log/auth.log 엔터
import subprocess
import re
# /var/log/auth.log 파일 읽기
with open("/var/log/auth.log", "r") as file:
lines = file.readlines()
# ip 주소 저장
list = set()
for line in lines:
if "Failed password" in line:
ip = re.findall(r'[0-9]+(?:.[0-9]+){3}', line)[0]
if ip !='192.168.0.11': # ip 주소중 ssh 로 접속하여 설정시, 패스워드 입력오류등으로 ssh 접속이 끊기는 불상사를 없애준다.
list.add(ip)
# iptables 등록
for ip in list:
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP"])
print(f"Blocked IP: {ip}")
import re
# /var/log/auth.log 파일 읽기
with open("/var/log/auth.log", "r") as file:
lines = file.readlines()
# ip 주소 저장
list = set()
for line in lines:
if "Failed password" in line:
ip = re.findall(r'[0-9]+(?:.[0-9]+){3}', line)[0]
if ip !='192.168.0.11': # ip 주소중 ssh 로 접속하여 설정시, 패스워드 입력오류등으로 ssh 접속이 끊기는 불상사를 없애준다.
list.add(ip)
# iptables 등록
for ip in list:
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP"])
print(f"Blocked IP: {ip}")
3. 스케쥴 작업으로 하루에 한번 실행
$ crontab -e 엔터
59 11 * * * /usr/bin/python3 /home/shell/auto_iptables.py
$ crontab -e 엔터
59 11 * * * /usr/bin/python3 /home/shell/auto_iptables.py

cron 스케쥴로 매일 새벽 1시 10분 작동하여 자동으로 방화벽 iptables 에 등록하게 된다.
매번 모니터링하여 수작업으로 방화벽 등록할 필요가 없게 되었다.
매일 저장하게 되면 지속적인 같은 ip가 등록될수 있어 걸러내는 루틴을 추가하기전 일정을 1주일에 1번씩
스케쥴링 하는것으로 이후 수정하였으며, 같은 ip 중복으로 등록되지 않도록하는 방법을 찾고 있다.
수정작업완료
import subprocess
import re
import datetime
now = datetime.datetime.now()
now_day = now.strftime("%Y-%m-%d")
# /var/log/secure 파일을 읽어서 처리
with open("/var/log/auth.log", "r") as file:
log_lines = file.readlines()
# 비정상적인 접속 시도를 추적할 IP 주소 저장
ip_list = set()
day_list = set()
for line in log_lines:
if "Failed password" in line:
ip = re.findall(r'[0-9]+(?:.[0-9]+){3}', line)[0]
day = re.findall(r'd{4}-d{2}-d{2}', line)[0]
if ip !='192.168.0.11' and day == now_day: # 내 아이피 제외 및 금일접속로그만 추가
ip_list.add(ip)
day_list.add(da)
# 방화벽에 IP 추가 & 코멘트에 날짜추가
for ip in ip_list:
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP", "-m", "comment", "--comment", now_day])
print(f"Blocked IP: {ip}")
print("작동시간:", now_day)
import subprocess
import re
import datetime
now = datetime.datetime.now()
now_day = now.strftime("%Y-%m-%d")
# /var/log/secure 파일을 읽어서 처리
with open("/var/log/auth.log", "r") as file:
log_lines = file.readlines()
# 비정상적인 접속 시도를 추적할 IP 주소 저장
ip_list = set()
day_list = set()
for line in log_lines:
if "Failed password" in line:
ip = re.findall(r'[0-9]+(?:.[0-9]+){3}', line)[0]
day = re.findall(r'd{4}-d{2}-d{2}', line)[0]
if ip !='192.168.0.11' and day == now_day: # 내 아이피 제외 및 금일접속로그만 추가
ip_list.add(ip)
day_list.add(da)
# 방화벽에 IP 추가 & 코멘트에 날짜추가
for ip in ip_list:
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP", "-m", "comment", "--comment", now_day])
print(f"Blocked IP: {ip}")
print("작동시간:", now_day)
cron 작동하는 날짜의 정보만 추가함으로 중복으로 적용되지 않도록 처리하면서 완료됨,
--comment 옵션으로 등록 날짜 기록
크론 작동시간은 매일 11시 59분 에 해당날짜의 모든 오류를 blocked 함
외부접속이 많아질 경우 ssh 포트인 22 port 를 새로운 포트번호로 수정하여 사용하게되면 외부 접속시도를 거의 차단할 수 있지만
부득이 기본포트를 사용하여야 할 경우엔 위 방법을 이용하면 자동으로 차단되게 설정할 수 있다.
hit: 17

Leave a comment