No history yet

পাইথনে সিকিউরিটি ডেটা হ্যান্ডলিং

ফাইল থেকে ডেটা পড়া

একজন SOC এনালিস্ট হিসেবে আপনাকে প্রতিদিন প্রচুর লগ ফাইল নিয়ে কাজ করতে হয়। পাইথন এই কাজটি অনেক সহজ করে দেয়। প্লেইন টেক্সট ফাইল পড়া এবং লেখা পাইথনের অন্যতম মৌলিক কাজ।

কোনো ফাইল নিয়ে কাজ করার জন্য প্রথমে open() ফাংশন ব্যবহার করতে হয়। এই ফাংশনটি দুটি আর্গুমেন্ট নেয়: ফাইলের নাম এবং মোড (যেমন, 'r' মানে read, 'w' মানে write)। তবে ফাইল খোলার পর তা বন্ধ করাও জরুরি। এই কাজটি সহজ করার জন্য পাইথনে with স্টেটমেন্ট ব্যবহার করা হয়। with ব্লক শেষ হওয়ার সাথে সাথে ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়, যা রিসোর্স লিক হওয়া থেকে বাঁচায়।

# একটি সাধারণ লগ ফাইল পড়ার উদাহরণ
with open('auth.log', 'r') as log_file:
    for line in log_file:
        if 'failed' in line.lower():
            print(line.strip()) # strip() মেথড লাইনের শুরু এবং শেষের boşluk মুছে ফেলে

উপরের কোডটি auth.log ফাইলটি খুলে প্রতিটি লাইন পড়বে এবং যেখানে 'failed' শব্দটি পাবে, সেই লাইনটি প্রিন্ট করবে। এটি ব্যর্থ লগইন প্রচেষ্টা খুঁজে বের করার একটি সহজ উপায়।

CSV এবং JSON ডেটা পার্সিং

লগ ফাইলগুলো প্রায়ই সাধারণ টেক্সটের চেয়ে বেশি স্ট্রাকচার্ড হয়। (Comma-Separated Values) এবং (JavaScript Object Notation) হলো দুটি বহুল ব্যবহৃত ফরম্যাট। পাইথনে এই ফরম্যাটগুলো পার্স করার জন্য বিল্ট-ইন মডিউল রয়েছে।

ধরুন, আপনার কাছে নেটওয়ার্ক ট্রাফিকের একটি CSV ফাইল আছে। পাইথনের csv মডিউল ব্যবহার করে আপনি সহজেই প্রতিটি রো-কে একটি লিস্ট বা ডিকশনারি হিসেবে পড়তে পারেন।

import csv

with open('network_traffic.csv', 'r') as file:
    reader = csv.DictReader(file) # প্রতিটি রো-কে ডিকশনারি হিসেবে পড়ে
    for row in reader:
        # যদি সোর্স আইপি 192.168.1.100 হয়
        if row['source_ip'] == '192.168.1.100':
            print(f"Alert: High traffic from {row['source_ip']} to {row['destination_ip']}")

একইভাবে, json মডিউল ব্যবহার করে JSON ডেটা খুব সহজে পাইথন ডিকশনারিতে রূপান্তর করা যায়। এটি বিশেষভাবে কার্যকর যখন আপনি বিভিন্ন সিকিউরিটি টুল বা API থেকে আউটপুট নিয়ে কাজ করেন, কারণ বেশিরভাগ আধুনিক টুল JSON ফরম্যাটে আউটপুট দেয়।

import json

# একটি JSON স্ট্রিং (বা ফাইল থেকে পড়া ডেটা)
api_response = '{"event_id": 1234, "user": "admin", "action": "login_failure"}'

data = json.loads(api_response) # JSON স্ট্রিংকে ডিকশনারিতে রূপান্তর করে

if data.get('action') == 'login_failure':
    print(f"Login failure for user: {data['user']}")

ডেটা ফিল্টারিং এর আধুনিক উপায়

লগ ফাইল থেকে নির্দিষ্ট তথ্য খুঁজে বের করার জন্য লুপ ব্যবহার করা একটি সাধারণ উপায়। কিন্তু পাইথনে আরও কার্যকর এবং সংক্ষিপ্ত পদ্ধতি রয়েছে, যেমন । এটি আপনাকে এক লাইনে একটি নতুন লিস্ট তৈরি করতে সাহায্য করে, যা একটি লুপের মাধ্যমে ফিল্টার করা ডেটা দিয়ে গঠিত।

ধরুন, আপনার কাছে সন্দেহজনক আইপি অ্যাড্রেসের একটি লিস্ট আছে এবং আপনি লগ ফাইল থেকে সেই আইপিগুলোর সাথে সম্পর্কিত সমস্ত এন্ট্রি খুঁজে বের করতে চান।

suspicious_ips = ['10.0.0.5', '192.168.2.12']
all_logs = [
    'INFO: Connection from 192.168.1.1',
    'WARN: Failed login from 10.0.0.5',
    'INFO: Data transfer from 192.168.2.12'
]

# লিস্ট কম্প্রিহেনশন ব্যবহার করে ফিল্টারিং
filtered_logs = [log for log in all_logs if any(ip in log for ip in suspicious_ips)]

print(filtered_logs)
# আউটপুট: ['WARN: Failed login from 10.0.0.5', 'INFO: Data transfer from 192.168.2.12']

ডিকশনারি কম্প্রিহেনশনও একইভাবে কাজ করে। এর মাধ্যমে আপনি একটি বিদ্যমান ডিকশনারি থেকে ফিল্টার করে বা ডেটা পরিবর্তন করে একটি নতুন ডিকশনারি তৈরি করতে পারেন। যেমন, একটি ডিকশনারি থেকে শুধুমাত্র নির্দিষ্ট কী-ভ্যালু পেয়ারগুলো আলাদা করা।

সিকিউরিটি টুলের আউটপুট বিশ্লেষণ

একজন SOC এনালিস্ট হিসেবে আপনাকে -এর মতো টুলগুলোর আউটপুট বিশ্লেষণ করতে হয়। Nmap তার স্ক্যান রেজাল্ট বিভিন্ন ফরম্যাটে সংরক্ষণ করতে পারে, যার মধ্যে XML (-oX) অন্যতম। পাইথনের xml লাইব্রেরি ব্যবহার করে এই XML ফাইলটি পার্স করা যায় এবং প্রয়োজনীয় তথ্য, যেমন খোলা পোর্ট বা সার্ভিসের নাম, বের করা যায়।

উদাহরণস্বরূপ, nmap স্ক্যানের XML আউটপুট থেকে কোনো নির্দিষ্ট হোস্টের জন্য খোলা সব TCP পোর্ট খুঁজে বের করার একটি পাইথন স্ক্রিপ্ট নিচে দেওয়া হলো।

import xml.etree.ElementTree as ET

def parse_nmap_xml(filename):
    tree = ET.parse(filename)
    root = tree.getroot()

    for host in root.findall('host'):
        ip_address = host.find('address').get('addr')
        print(f'Host: {ip_address}')

        ports = host.find('ports')
        for port in ports.findall('port'):
            if port.find('state').get('state') == 'open':
                port_id = port.get('portid')
                service = port.find('service').get('name')
                print(f'  [+] Open Port: {port_id}/{port.get("protocol")} - Service: {service}')

# nmap -sV -oX scan_results.xml example.com
parse_nmap_xml('scan_results.xml')

এই স্ক্রিপ্টটি একটি nmap XML আউটপুট ফাইল পার্স করে এবং প্রতিটি হোস্টের জন্য খোলা পোর্ট এবং চলমান সার্ভিসগুলোর একটি পরিষ্কার তালিকা দেখায়। এটি আপনাকে ম্যানুয়ালি বড় XML ফাইল পড়ার ঝামেলা থেকে মুক্তি দেয় এবং দ্রুত বিশ্লেষণের সুযোগ করে দেয়।

Quiz Questions 1/5

পাইথনে with open(...) as f: স্টেটমেন্ট ব্যবহার করার প্রধান সুবিধা কী?

Quiz Questions 2/5

একজন SOC এনালিস্টকে কমা দ্বারা পৃথক করা মান (CSV) ফরম্যাটে একটি লগ ফাইল বিশ্লেষণ করতে হবে। এই কাজটি করার জন্য পাইথনের কোন বিল্ট-ইন মডিউলটি সবচেয়ে উপযুক্ত?

এই কৌশলগুলো ব্যবহার করে আপনি বিভিন্ন সোর্স থেকে আসা বিপুল পরিমাণ সিকিউরিটি ডেটা দ্রুত এবং কার্যকরভাবে প্রসেস করতে পারবেন। এটি আপনাকে হুমকির প্যাটার্ন খুঁজে পেতে এবং সময়মতো ব্যবস্থা নিতে সাহায্য করবে।