본문 바로가기
Development

파이썬 faker 모듈 사용하여 웹 서버 access log 만들기

by _Jay_ 2023. 11. 21.
반응형

 

 

최근 회사에서 관제 시스템 구축 사업을 맡아 진행하면서 웹 서버의 access log를 볼 일이 굉장히 많아졌는데, 머신러닝 라이브러리를 이용해서 이상 탐지를 구현하기 위해 테스트 데이터가 필요하게 되었다. 실제 운영 서버의 데이터를 이용하기에는 회사 정책적으로 조금 무리가 있었기 때문인데, 이 테스트 데이터를 어떻게 구현할까 하다가 파이썬의 faker 모듈을 사용하여 웹 서버의 access log를 비슷하게 만들어보고자 했다.

 

 

출처 - 보안프로젝트 유튜브

 

 

관련 자료를 찾다가 운이 좋게 얼마 전에 이미 보안 프로젝트의 조정원 대표님이 이와 관련된 영상을 유튜브에 찍어둔게 있어서 위의 영상을 참고하게 되었는데, 여기서 나는 URL 부분만 조금 다르게 변형시켜서 최대한 실제 access log와 유사하게 만들었다. 아파치나 웹투비 Nginx 등 다양한 웹 서버가 존재하지만, 대부분 로그의 형식은 비슷비슷한데 여기서 구조에 대한 자세한 설명은 생략하고 위의 영상에서 조금 변형한 코드를 첨부하겠다.

 

 

from faker import Faker as fk
import time, random

fk = fk()

count = 100

with open('fake_apache_log.log', 'w') as log_file:
    for _ in range(count):
        ip_v4 = fk.ipv4()
        curTime = int(time.time())
        timestamp = time.strftime('%d/%b/%Y:%H:%M:%S +0000', time.gmtime(curTime))
        
        http_method = random.choice(['GET', 'POST', 'PUT', 'DELETE'])
        
        url_temp = fk.uri()
        url_idx = url_temp[8:].index('/') + 1
        url = url_temp[8+url_idx:]
        
        http_version = 'HTTP/1.1'
        
        status_code = random.choice([200, 404, 500])
        response_size = random.randint(100, 5000)
        
        referer = fk.uri()
        user_agent = fk.user_agent()
        
        log_message = '%s - - [%s] "%s %s %s" %d %d "%s" "%s"\n' % (ip_v4, timestamp, http_method, url, http_version, status_code, response_size, referer, user_agent)
        
        log_file.write(log_message)

 

 

나의 경우 아직도 집에서는 파이썬2를 사용하고 있어서, 파이썬3 사용자라면 log_message 포맷을 % operator가 아닌 위 영상의 f-string 방식으로 사용하길 바란다. 내가 수정한 부분은 URL인데, 만약 네이버에서 python을 검색했을 때 URL이 "http://www.search.naver.com/query=test"라면, access log에서는 "query=test"만 남게된다. 그래서 index 함수를 이용하여 faker.uri() 함수를 이용했을 때 나오는 "https://" 부분을 제외하고 index 함수로 첫 "/" 부분을 찾아 그 이후만 출력하도록 수정하였다.

 

 

referer도 항상 나오는 데이터는 아니기 때문에 테스트 데이터라고 부르기엔 애매하다

 

 

그리고 사실 위의 테스트 데이터는 굉장히 실제 데이터와 거리가 있는 것이, 대부분의 웹 서버는 로그 파일 용량의 한계로 인해 GET 방식만 로그를 남기기 때문에, 실제 access log 데이터의 관제는 GET 방식의 파라미터 부분만 확인한다. 그러다보니 실제로 우리가 악성 판별 데이터로 이용할 수 있는 부분은 IP와 URL, user-agent 그리고 가끔 포함되는 referer 정도라고 할 수 있다. 이 마저도 실제 악성 판별은 위해서는 virustotal이나 외부 인텔리전스를 이용할 수 밖에 없는 실정이다.


위의 데이터를 테스트 데이터로 이용하기에는 조금 무리가 있지만, 그래도 머신러닝을 공부하면서 데이터 분석을 진행할 때 실 access log 데이터를 구할 수 없는 입문자에게는 꽤 유용하지 않을까 싶다. 기회가 된다면 access log의 구조와 함께 실제 보안 업계에서 이 로그를 가지고 악성 유무 판별을 어떻게 진행하는지 적어보도록 하겠다.

 

 

반응형

댓글