Аналіз журналів NGINX за допомогою Python
Автор: mikola ivanov • Декабрь 5, 2023 • Лабораторная работа • 2,154 Слов (9 Страниц) • 103 Просмотры
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра БІТ
[pic 1]
З В І Т
до лабораторної роботи №1
з курсу: «Програмування скриптовими мовами»
на тему: « Аналіз журналів NGINX за допомогою Python»
Виконав: ст. гр. КБ-309
Шаповалов Б.Д.
Прийняв: Павликевич А.М.
Львів 2023
Завдання:
Проаналізувати записи журналу web-сервера NGINX на наявність запитів з IP адрес з негативною репутацією, використовуючи інформацію з публічної системи агрегації індикаторів загроз MalLverse
Результат роботи скрипта має видати перелік знайдених унікальних IP адрес доповнених інформацією з MalLverse
Журнал NGINX з даними для аналізу https://drive.google.com/file/d/1PzZCDA8NCgJOg4yBQwVMhCxxuUK0smch/view?usp=share_li nk
Довідкові матеріали:
1. Часто вживані формати журналів (log files)
hUps://www.crowdstrike.com/cybersecurity-101/observability/log-file-formats/
2. Формат журналу NGINX
hUp://fileformats.archiveteam.org/wiki/Combined_Log_Format
3. Приклади скриптів-парсерів
a. hUps://linuxtech.in/efficiently-parsing-nginx-log-files-using-python/
b. hUps://dev.to/ksndeveloper/parsing-nginx-logs-using-python-1m6k
4. Система MalLverse hUps://whaLs.malLverse.com
5. Модуль Python для роботи з MalLverse API hUps://github.com/malLverse/pythonmalLverse#table-of-contents
6. Аналіз інформації з MalLverse на Python hUps://infosecwriteups.com/python-threathunLng-tools-part-3-interacLng-with-apis-1b133d9a7ada
(копія - hUps://drive.google.com/file/d/1VGld5yVs422_Ej9Em10js4018Xn45Bk/view?usp=share_link
Виконання роботи:
Скрипт:
import ipaddress
import colorama
import pandas as pd
from maltiverse import Maltiverse
api = Maltiverse(auth_token='eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjIzMjU0NDIwNTYsImlhdCI6MTY5NDcyMjA1Niwic3ViIjoxNjc1OSwidXNlcm5hbWUiOiJhbmRyaWkua3VraGFydWsua2IiLCJhZG1pbiI6ZmFsc2UsInRlYW1faWQiOjI3OSwidGVhbV9uYW1lIjoibHBudSIsInRlYW1fbGVhZGVyIjpmYWxzZSwidGVhbV9yZXNlYXJjaGVyIjpmYWxzZSwidGVhbV9pbmRleCI6ImlvYy1scG51LWI3MTk2NDk2LTUxYTItMTFlZS1iOWQwLTAyNDJhYzEyMDAwNyIsImFwaV9saW1pdCI6MjUwMDB9.iAJBdU0T0tn142nZyF0L7SWe3TqOeOOOYyM92ghH4GI')
def log_error(exception):
print(colorama.Fore.RED + str(exception) + colorama.Style.RESET_ALL)
def get_ips_dataframe(log_file_name):
global log_file
ip_addresses = []
try:
log_file = open(log_file_name, 'r')
except FileNotFoundError as e:
log_error(e)
exit(1)
for line in log_file:
ip_addresses.append(line.split(' ')[0].strip())
log_file.close()
ip_addresses = list(set(ip_addresses))
return pd.DataFrame(ip_addresses, columns=['ip'])
def validate_ip(ip_df):
ip_df['valid'] = ip_df['ip'].apply(lambda x: True if ipaddress.ip_address(x) else False)
return ip_df
def main():
ips_df = get_ips_dataframe('career_nginx_all.log')
ips_df = validate_ip(ips_df)
valid_ip_df = ips_df[ips_df['valid'] == True]
valid_ip_df = valid_ip_df.drop(columns=['valid'])
for ip in valid_ip_df['ip']:
print(api.ip_get(ip))
if __name__ == '__main__':
main()
Результат:
{'address': '132 24 Wonmi-2dong Wonmi-gu Buchoen-shi\nKYONGGI Korea', 'as_name': 'AS3786 LG DACOM Corporation', 'asn_cidr': '61.32.0.0/13', 'asn_country_code': 'KR', 'asn_date': '2000-09-18 00:00:00', 'asn_registry': 'apnic', 'cidr': ['61.37.198.0/26'], 'city': 'Suwon', 'classification': 'neutral', 'country_code': 'KR', 'creation_time': '2023-09-13 18:29:59', 'email': ['b4029573@users.bora.net'], 'ip_addr': '61.37.198.1', 'is_cdn': False, 'is_cnc': False, 'is_distributing_malware': False, 'is_hosting': False, 'is_iot_threat': False, 'is_known_attacker': False, 'is_known_scanner': False, 'is_mining_pool': False, 'is_open_proxy': False, 'is_sinkhole': False, 'is_tor_node': False, 'is_vpn_node': False, 'location': {'lat': 37.2859, 'lon': 127.0099}, 'modification_time': '2023-09-13 18:29:59', 'number_of_blacklisted_domains_resolving': 0, 'number_of_domains_resolving': 0, 'number_of_offline_malicious_urls_allocated': 0, 'number_of_online_malicious_urls_allocated': 0, 'number_of_whitelisted_domains_resolving': 0, 'registrant_name': 'LEEBOCHEON\nPC Game Plaza User in\nWonmi-gu Buchoen-shi KYONGGI', 'type': 'ip'}
...