পাঠ ৪৮ · ৬০-এর মধ্যে · মডিউল ১০
Home / Courses / Cybersecurity & Ethical Hacking / লগ অ্যানালাইসিস

লগ অ্যানালাইসিস ও SIEM বেসিকস

Log analysis & SIEM basics
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • SIEM কী এবং এটি কেন শুধু "লগ সংরক্ষণ" থেকে ভিন্ন
  • লগ কো-রিলেশন (correlation) কীভাবে একাধিক উৎসের ডেটা মিলিয়ে একটি প্যাটার্ন প্রকাশ করে
  • একটি ব্রুট-ফোর্স/ক্রেডেনশিয়াল-স্টাফিং আক্রমণের ক্লাসিক লগ signature চিনতে শেখা
  • কীভাবে একটি সাধারণ থ্রেশহোল্ড-ভিত্তিক ডিটেকশন ফাংশন লেখা যায়

১ · SIEM কী এবং কেন এটি প্রয়োজন

SIEMSecurity Information and Event Managementএকাধিক উৎস (ফায়ারওয়াল, সার্ভার, অ্যাপ্লিকেশন, এন্ডপয়েন্ট) থেকে লগ একত্র করে, সেগুলোকে normalize ও correlate করে, এবং সন্দেহজনক প্যাটার্ন শনাক্ত হলে সতর্কতা তৈরি করে এমন একটি প্ল্যাটফর্ম। একটি বড় সংগঠনে প্রতিদিন লক্ষ লক্ষ লগ এন্ট্রি তৈরি হয় — কোনো মানুষের পক্ষে এগুলো এক এক করে পড়া অসম্ভব। SIEM এই বিশাল পরিমাণ ডেটাকে এক জায়গায় এনে, নিয়ম বা প্যাটার্নের ভিত্তিতে স্বয়ংক্রিয়ভাবে সন্দেহজনক ঘটনা চিহ্নিত করে।

এটি সরাসরি L29-এ শেখা Security Logging ও Monitoring Failures-এর সমাধান — শুধু লগ তৈরি করা যথেষ্ট নয় যদি কেউ সেগুলো পর্যালোচনা না করে। SIEM হলো সেই টুলিং যা লগ করা ডেটাকে বাস্তবে কার্যকর করে তোলে।

Aggregation (সংগ্রহ)
ফায়ারওয়াল, সার্ভার, অ্যাপ্লিকেশন — সব উৎসের লগ একটি কেন্দ্রীয় প্ল্যাটফর্মে আসে।
Correlation (কো-রিলেশন)
একাধিক উৎসের ঘটনা একসাথে মিলিয়ে দেখা হয় — একটি একক লগ যা দেখায় না, একসাথে দেখলে তা প্রকাশ পায়।
Alerting (সতর্কতা)
প্যাটার্ন থ্রেশহোল্ড ছাড়ালে স্বয়ংক্রিয়ভাবে সিকিউরিটি দলকে সতর্ক করা হয়।

২ · একটি ক্লাসিক কো-রিলেশন উদাহরণ

ধরা যাক, একটি সার্ভারের লগে দেখা গেল একই ইউজারনেমের জন্য অল্প সময়ের মধ্যে অনেকগুলো ব্যর্থ লগইন প্রচেষ্টা — বিভিন্ন উৎস IP থেকে। একা এই তথ্যই সন্দেহজনক, কিন্তু যদি তার ঠিক পরপরই সেই একই অ্যাকাউন্ট থেকে একটি সফল লগইন একটি অস্বাভাবিক IP থেকে আসে — এই দুটি ঘটনা একসাথে মিলিয়ে দেখলে এটি একটি ক্লাসিক ব্রুট-ফোর্স বা ক্রেডেনশিয়াল-স্টাফিং আক্রমণের signature (ties to L30)। একটি লগ আলাদাভাবে দেখলে হয়তো উপেক্ষা করা হতো — কিন্তু কো-রিলেশন এই প্যাটার্নকে দৃশ্যমান করে তোলে।

গুরুত্বপূর্ণ সতর্কতা · অনুমতির সীমা

লগ অ্যানালাইসিস ও মনিটরিং শুধুমাত্র সেই সিস্টেম ও নেটওয়ার্কে করা উচিত যেখানে আপনার স্পষ্ট, লিখিত অনুমতি আছে (নিজের প্রতিষ্ঠানের সিস্টেম, বা যেখানে আপনি অনুমোদিত সিকিউরিটি দলের অংশ)। ব্যবহারকারীর লগ ডেটাতেও প্রায়ই সংবেদনশীল ব্যক্তিগত তথ্য থাকে — এটি প্রয়োজনীয়তা-ভিত্তিক অ্যাক্সেস ও গোপনীয়তা নীতি মেনে পরিচালনা করা উচিত।

৩ · ব্রুট-ফোর্স ডিটেকশন — একটি নিরাপদ সিমুলেশন

নিচের কোড সেলটি সম্পূর্ণ ইন-মেমরি — একটি ভুয়া লগ তালিকা তৈরি করে (স্বাভাবিক "নয়েজ" এবং একটি ইনজেক্ট করা আক্রমণ প্যাটার্ন সহ), তারপর একটি সাধারণ থ্রেশহোল্ড-ভিত্তিক ফাংশন দিয়ে ব্রুট-ফোর্স প্যাটার্ন শনাক্ত করে।

Python
from collections import defaultdict

# প্রতিটি এন্ট্রি: (timestamp, event_type, source_ip, username) — সবই ভুয়া, ইন-মেমরি ডেটা
logs = [
    (100, "login_success", "10.0.0.5",   "rahim"),
    (101, "login_failed",  "10.0.0.5",   "karim"),
    (102, "login_success", "10.0.0.9",   "sadia"),
    # নিচে একটি ইনজেক্ট করা ব্রুট-ফোর্স প্যাটার্ন — একই ইউজারনেমে অনেকগুলো ব্যর্থ লগইন
    (110, "login_failed",  "45.33.10.2", "admin"),
    (111, "login_failed",  "45.33.10.7", "admin"),
    (112, "login_failed",  "45.33.11.1", "admin"),
    (113, "login_failed",  "45.33.11.9", "admin"),
    (114, "login_failed",  "45.33.12.3", "admin"),
    (115, "login_failed",  "45.33.12.8", "admin"),
    (120, "login_success", "192.168.1.2","tanvir"),
]

def detect_bruteforce(log_entries, threshold=5, window=30):
    failed_by_user = defaultdict(list)
    for timestamp, event_type, source_ip, username in log_entries:
        if event_type == "login_failed":
            failed_by_user[username].append(timestamp)

    findings = []
    for username, timestamps in failed_by_user.items():
        timestamps.sort()
        # সাধারণীকৃত: একটি সিমুলেটেড সময়-উইন্ডোর মধ্যে failed attempt গণনা
        count_in_window = sum(
            1 for t in timestamps if t <= timestamps[0] + window
        )
        if count_in_window >= threshold:
            findings.append((username, count_in_window))
    return findings

print("=== ব্রুট-ফোর্স ডিটেকশন রিপোর্ট ===")
alerts = detect_bruteforce(logs, threshold=5, window=30)
if alerts:
    for username, count in alerts:
        print(f"⚠ সতর্কতা: '{username}' অ্যাকাউন্টে {count}টি ব্যর্থ লগইন — সম্ভাব্য ব্রুট-ফোর্স")
else:
    print("কোনো সন্দেহজনক প্যাটার্ন পাওয়া যায়নি।")

    
লক্ষ্য করুন — karim-এর একটিমাত্র ব্যর্থ লগইন স্বাভাবিক নয়েজ হিসেবে উপেক্ষা করা হয়েছে (থ্রেশহোল্ডের নিচে), কিন্তু admin-এর ৬টি ব্যর্থ লগইন — বিভিন্ন IP থেকে হলেও — সঠিকভাবে ফ্ল্যাগ করা হয়েছে। এটিই একটি SIEM-এর মূল কাজ: শোরগোলপূর্ণ স্বাভাবিক লগের মধ্যে থেকে প্রকৃত সংকেত আলাদা করা।
মূল কথা · Key takeaway

একটি একক লগ এন্ট্রি প্রায়ই নিরীহ দেখায়। SIEM-এর আসল শক্তি হলো সময় ও উৎস জুড়ে প্যাটার্ন খুঁজে বের করা — এই কো-রিলেশন ক্ষমতাই একটি সাধারণ লগ-ফাইল আর্কাইভ এবং একটি প্রকৃত ডিটেকশন প্ল্যাটফর্মের মধ্যে পার্থক্য তৈরি করে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি সার্ভারের একটিমাত্র লগ ফাইল থাকলে কেন ব্রুট-ফোর্স আক্রমণ শনাক্ত করা কঠিন হতে পারে, কিন্তু SIEM দিয়ে সহজ হয়?

একটি একক সার্ভারের লগে হয়তো প্রতিদিন হাজার হাজার এন্ট্রি থাকে, এবং একটি নির্দিষ্ট প্যাটার্ন (একই ইউজারনেমে বিভিন্ন IP থেকে বারবার ব্যর্থ লগইন) সেই বিশাল ডেটার মধ্যে হারিয়ে যেতে পারে যদি কেউ ম্যানুয়ালি খুঁজে দেখে। SIEM স্বয়ংক্রিয়ভাবে এই প্যাটার্ন থ্রেশহোল্ড অতিক্রম করলেই সতর্ক করে দেয় — মানুষকে প্রতিটি এন্ট্রি পড়তে হয় না।

প্র ০২ কেন শুধু "ব্যর্থ লগইনের সংখ্যা" গণনা করাই যথেষ্ট নয় — কেন একটি সময়-উইন্ডো (window) বিবেচনা করা প্রয়োজন?

একজন বৈধ ব্যবহারকারী মাসে কয়েকবার পাসওয়ার্ড ভুল করতেই পারেন — এটি স্বাভাবিক। কিন্তু একই সংখ্যক ব্যর্থ প্রচেষ্টা যদি কয়েক সেকেন্ড বা মিনিটের মধ্যে ঘটে, তা স্বয়ংক্রিয় আক্রমণের চিহ্ন। সময়-উইন্ডো ছাড়া গণনা করলে স্বাভাবিক দীর্ঘমেয়াদি ভুলগুলোকেও ভুলভাবে আক্রমণ হিসেবে ফ্ল্যাগ করা হতে পারে (false positive)।

প্র ০৩ আক্রমণকারী যদি একই ইউজারনেমে আক্রমণ চালানোর পরিবর্তে বহু ভিন্ন ইউজারনেমে অল্প অল্প প্রচেষ্টা চালায় (password spraying), উপরের সাধারণ ডিটেকশন কেন সেটি ধরতে পারবে না?

কারণ উপরের ফাংশনটি প্রতিটি ইউজারনেমের জন্য আলাদাভাবে থ্রেশহোল্ড গণনা করে — যদি প্রতিটি ইউজারনেমে মাত্র ১-২টি করে ব্যর্থ প্রচেষ্টা হয়, কোনোটিই থ্রেশহোল্ড অতিক্রম করবে না, যদিও একই উৎস IP থেকে মোট প্রচেষ্টা অনেক বেশি। একটি প্রকৃত SIEM এই ধরনের প্যাটার্ন ধরতে source_ip অনুযায়ীও কো-রিলেশন করে — এটি একটি বাস্তব SIEM নিয়মের জটিলতা যা এই সরলীকৃত সংস্করণে অন্তর্ভুক্ত করা হয়নি।

অনুশীলন

  1. চিন্তা করুন: লগে একটি সফল লগইন ইভেন্টও অন্তর্ভুক্ত আছে। কেন সন্দেহজনক লগইন প্যাটার্ন শনাক্তকরণে শুধু ব্যর্থ লগইন নয়, তার পরের সফল লগইনটিও গুরুত্বপূর্ণ হতে পারে?

    অনেকগুলো ব্যর্থ লগইনের পরপরই একটি সফল লগইন — বিশেষত একটি নতুন বা অস্বাভাবিক IP থেকে — নির্দেশ করে যে আক্রমণকারী শেষ পর্যন্ত সঠিক পাসওয়ার্ড অনুমান করতে সফল হয়েছে। শুধু ব্যর্থ প্রচেষ্টার সংখ্যা দেখলে বোঝা যায় আক্রমণ হয়েছিল কি না, কিন্তু পরের সফল লগইন দেখায় আক্রমণটি সফল হয়েছে কি না — যা রেসপন্সের জরুরিত্ব সম্পূর্ণ ভিন্নভাবে নির্ধারণ করে।

  2. পরীক্ষা করুন: উপরের কোড সেলে threshold-এর মান ৩-এ পরিবর্তন করে দেখুন ফলাফলে কী প্রভাব পড়ে।

    থ্রেশহোল্ড ৩-এ কমালে ফাংশনটি আরও সংবেদনশীল হয়ে যায় — এখন কম সংখ্যক ব্যর্থ প্রচেষ্টাতেই সতর্কতা তৈরি হবে। এটি বাস্তব SIEM টিউনিং-এর একটি মূল চ্যালেঞ্জ প্রদর্শন করে: থ্রেশহোল্ড খুব কম হলে false positive বেড়ে যায় (স্বাভাবিক ব্যবহারকারীর ভুলও ফ্ল্যাগ হয়), খুব বেশি হলে প্রকৃত আক্রমণ miss হয়ে যেতে পারে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
ইনসিডেন্ট রেসপন্স লাইফসাইকেল