cat /var/log/apache2/access.log
▶ 분석
192.168.5.20 -> 접속자의 IP
24/Sep/2024:14:41:21 +0900 -> 접속한 시간
GET -> 요청 방식
/board/board_show.php?no=6 -> 요청한 페이지
HTTP/1.1 -> 프로토콜
500 -> 응답코드
2348 -> 전송한 패킷크기
http://192.168.5.66/board/board.php -> 응답 주소
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" -> 접속한 브라우저
▶ 원하는 정보만 추출하기
awk '{ print $1,$4,$6,$23}' /var/log/apache2/access.log > web_history.txt
cat web_history.txt
awk는 기본적으로 공백으로 요소를 구분하므로 원하는 요소의 번호를 입력하여
원하는 정보만 추출할 수 있습니다.
▶ 각 IP가 서버에 접근한 횟수 추출하기
awk '{ arr[$1] +=1 } END { for(i in arr) print i,arr[i] }' /var/log/apache2/access.log
반복문 명령어를 이용하여 IP별로 서버에 몇번 요청을 보냈는지 확인할 수 있습니다.
접근 횟수가 비정상적으로 크면 공격을 받고 있다고 추정할 수 있으며,
IP별로 접근 가능 횟수를 지정하는 방식으로 공격을 차단할 수 있습니다.
Python과 SSH를 통한 로그 자동수집
# SSH 모듈
from netmiko import ConnectHandler
# 운영체제 관련 명령어 사용
import os
# range()함수는 정수를 사용함
for i in range(65,69) : # 접속할 IP 범위
host_ip = '192.168.5.' + str(i) #192.168.5.65~68
# 로그인을 위한 서버 기본 정보
servers = {
'device_type' : 'linux',
'host' : host_ip,
'username' : 'root',
'password' : '12345678',
'port' : 22}
try:
net_connect = ConnectHandler(**servers)
net_connect.enable()
access_log_file = net_connect.send_command("cat /var/log/apache2/access.log")
# 수집된 로그 정보를 파일로 저장하기
file_name = './' + str(i) + '_access_log.txt'
f = open(file_name, 'w', encoding='utf-8') # 한글 인코딩 uec-kr, utf-8, cp949
f.write(access_log_file)
f.close()
except:
print("fail")
os.system('pause')
SSH 접속이 성공하면 fail이 출력되며
접속이 성공하면 로그가 생성됩니다.
해당 예제에서는 68번 IP가 접속 실패했으며
나머지 65~67번 IP의 로그가 추출된 것을 확인할 수 있습니다.