পাঠ ১৬ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Cloud Computing & DevOps / সিকিউরিটি গ্রুপ

নেটওয়ার্ক সিকিউরিটি গ্রুপ ও ফায়ারওয়াল রুলস

Network security groups & firewall rules
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

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

  • সিকিউরিটি গ্রুপ (stateful) ও Network ACL (stateless)-এর পার্থক্য
  • নেটওয়ার্কিং-এ least privilege নীতির প্রয়োগ
  • একটি সাধারণ, বাস্তব-জীবনের মিসকনফিগারেশন যা ক্লাউড ব্রিচের নেতৃত্ব দেয়
  • Python দিয়ে একটি সিকিউরিটি-গ্রুপ রুল ইভালুয়েটর তৈরি — নিরাপদ বনাম বিপজ্জনক রুলসেট তুলনা

১ · সিকিউরিটি গ্রুপ — Stateful, রিসোর্স-লেভেল ফায়ারওয়াল

সিকিউরিটি গ্রুপSecurity Groupএকটি stateful, রিসোর্স/ইনস্ট্যান্স-লেভেল ফায়ারওয়াল — নির্দিষ্ট করে কোন ইনবাউন্ড/আউটবাউন্ড ট্রাফিক অনুমোদিত। একটি রিসোর্স বা ইনস্ট্যান্সের সাথে সংযুক্ত ফায়ারওয়াল রুলের একটি সেট — পোর্ট, প্রোটোকল ও উৎস (source) অনুযায়ী ইনবাউন্ড ও আউটবাউন্ড ট্রাফিক নিয়ন্ত্রণ করে। এটি stateful — মানে একটি অনুমোদিত ইনবাউন্ড রিকোয়েস্টের রেসপন্স স্বয়ংক্রিয়ভাবে বাইরে যাওয়ার অনুমতি পায়, আলাদা করে কোনো আউটবাউন্ড রুল যোগ করার প্রয়োজন হয় না।

২ · Network ACL — Stateless, সাবনেট-লেভেল

এর বিপরীতে, Network ACLNetwork Access Control Listএকটি stateless, সাবনেট-লেভেল ফায়ারওয়াল — ইনবাউন্ড ও আউটবাউন্ড উভয় দিকের জন্য আলাদাভাবে স্পষ্ট রুল প্রয়োজন। সম্পূর্ণ একটি সাবনেটের (L13) জন্য প্রযোজ্য এবং stateless — ইনবাউন্ড ট্রাফিক অনুমোদিত হলেই যে তার রেসপন্স আউটবাউন্ডে অনুমোদিত হবে তা নিশ্চিত নয়; উভয় দিকের জন্য স্পষ্টভাবে আলাদা রুল লিখতে হয়।

সিকিউরিটি গ্রুপ
Stateful · ইনস্ট্যান্স-লেভেল · রেসপন্স স্বয়ংক্রিয়ভাবে অনুমোদিত
Network ACL
Stateless · সাবনেট-লেভেল · উভয় দিকের রুল স্পষ্টভাবে লিখতে হয়

৩ · Least Privilege — নেটওয়ার্কিং-এ প্রয়োগ

Cybersecurity কোর্সের least privilege নীতি (প্রয়োজনের চেয়ে বেশি অ্যাক্সেস কখনো না দেওয়া) নেটওয়ার্কিং-এও সরাসরি প্রযোজ্য — শুধু প্রকৃতপক্ষে যে পোর্ট/সোর্স প্রয়োজন, ঠিক ততটুকুই খুলুন, বাকি সব ডিফল্টভাবে বন্ধ রাখুন (deny-by-default)। একটি ডেটাবেস সার্ভারের ৫৪৩২ পোর্ট শুধুমাত্র অ্যাপ-টিয়ার সিকিউরিটি গ্রুপের জন্য খোলা রাখা উচিত, পুরো ইন্টারনেটের জন্য নয়।

সবচেয়ে সাধারণ বাস্তব মিসকনফিগারেশন

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

৪ · সিমুলেশন — সিকিউরিটি-গ্রুপ রুল ইভালুয়েটর

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

Python
# সিকিউরিটি-গ্রুপ স্টাইল রুল ইভালুয়েটর (Python stdlib-এর ipaddress মডিউল ব্যবহার করে)
import ipaddress

def check_traffic_allowed(port, source_ip, rules):
    """rules: (allow, port, source_cidr) টাপলের তালিকা, ক্রমানুসারে চেক হয়, প্রথম ম্যাচ জেতে।"""
    ip = ipaddress.ip_address(source_ip)
    for allow, rule_port, source_cidr in rules:
        if rule_port == port and ip in ipaddress.ip_network(source_cidr):
            return allow
    return False   # ডিফল্ট ডিনাই — কোনো রুল ম্যাচ না করলে ব্লক

# সঠিকভাবে স্কোপড রুলসেট — শুধু অ্যাপ-টিয়ার সাবনেট থেকে DB পোর্ট (৫৪৩২) অ্যাক্সেসযোগ্য
safe_rules = [
    (True, 5432, "10.0.2.0/24"),   # শুধু অ্যাপ-টিয়ার সাবনেট
]

# বিপজ্জনকভাবে খোলা রুলসেট — সম্পূর্ণ ইন্টারনেট থেকে DB পোর্ট অ্যাক্সেসযোগ্য (মিসকনফিগারেশন)
dangerous_rules = [
    (True, 5432, "0.0.0.0/0"),     # ভুল কনফিগারেশন — পুরো ইন্টারনেট!
]

app_tier_ip = "10.0.2.15"
public_internet_ip = "203.0.113.42"

print("--- সঠিকভাবে স্কোপড রুলসেট ---")
print(f"অ্যাপ-টিয়ার থেকে DB পোর্ট অ্যাক্সেস: {check_traffic_allowed(5432, app_tier_ip, safe_rules)}")
print(f"পাবলিক ইন্টারনেট থেকে DB পোর্ট অ্যাক্সেস: {check_traffic_allowed(5432, public_internet_ip, safe_rules)}")

print("\n--- বিপজ্জনকভাবে খোলা রুলসেট (মিসকনফিগারেশন) ---")
print(f"অ্যাপ-টিয়ার থেকে DB পোর্ট অ্যাক্সেস: {check_traffic_allowed(5432, app_tier_ip, dangerous_rules)}")
allowed = check_traffic_allowed(5432, public_internet_ip, dangerous_rules)
print(f"পাবলিক ইন্টারনেট থেকে DB পোর্ট অ্যাক্সেস: {allowed}")
if allowed:
    print("সতর্কতা: এই রুল পুরো ইন্টারনেট থেকে ডেটাবেস পোর্ট অ্যাক্সেসের অনুমতি দিচ্ছে — একটি গুরুতর মিসকনফিগারেশন!")

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

৫ · Cybersecurity ও IaC কোর্সের সাথে সম্পর্ক

Least privilege নীতির গভীর আলোচনা Cybersecurity কোর্সে আছে। এখানে দেখানো রুল-ইভালুয়েটর প্যাটার্নটি L21-এ IaC পলিসি-চেকিং-এ পুনরায় ব্যবহৃত হবে — যেখানে এই ধরনের বিপজ্জনক রুল প্রোডাকশনে পৌঁছানোর আগেই একটি স্বয়ংক্রিয় CI/CD চেক (M8) হিসেবে ধরা হয়।

মূল কথা · Key takeaway

সিকিউরিটি গ্রুপ (stateful, ইনস্ট্যান্স-লেভেল) ও Network ACL (stateless, সাবনেট-লেভেল) দুটি ভিন্ন কিন্তু পরিপূরক প্রতিরক্ষা স্তর, আর least-privilege, deny-by-default নীতি প্রয়োগ করাই সবচেয়ে সাধারণ, সবচেয়ে ব্যয়বহুল ক্লাউড মিসকনফিগারেশন (একটি ডেটাবেস পোর্ট পুরো ইন্টারনেটের জন্য খুলে রাখা) প্রতিরোধের মূল চাবিকাঠি।

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

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

প্র ০১ সিকিউরিটি গ্রুপ stateful হওয়ার কারণে দৈনন্দিন অপারেশনে ঠিক কী সুবিধা পাওয়া যায়?

একটি অ্যাপ্লিকেশন সার্ভার যখন ইন্টারনেট থেকে একটি অনুমোদিত রিকোয়েস্ট গ্রহণ করে, তার রেসপন্স স্বয়ংক্রিয়ভাবে বাইরে পাঠানো যায় — ইঞ্জিনিয়ারকে প্রতিটি সম্ভাব্য রেসপন্স পোর্টের জন্য আলাদা আউটবাউন্ড রুল মনে রেখে লিখতে হয় না। এটি কনফিগারেশন সরল রাখে এবং ভুলে যাওয়া আউটবাউন্ড রুলের কারণে সার্ভিস ভেঙে যাওয়ার ঝুঁকি কমায়।

প্র ০২ শুধু সিকিউরিটি গ্রুপ ব্যবহার করলেই কি Network ACL-এর প্রয়োজন ফুরিয়ে যায়? কেন না?

না — এই দুটি ভিন্ন স্তরে কাজ করে defense-in-depth তৈরি করে। যদি কোনো কারণে একটি ইনস্ট্যান্সের সিকিউরিটি গ্রুপ ভুলভাবে কনফিগার করা হয় (যেমন এই পাঠের বিপজ্জনক উদাহরণ), একটি সঠিকভাবে কনফিগার করা সাবনেট-লেভেল Network ACL তখনো সেই ভুল ট্রাফিক ব্লক করতে পারে — একটি স্তরের ব্যর্থতা পুরো সিস্টেমকে উন্মুক্ত করে না।

প্র ০৩ একটি নতুন ইঞ্জিনিয়ার "সহজে টেস্ট করার জন্য" সাময়িকভাবে একটি সিকিউরিটি গ্রুপ রুলে 0.0.0.0/0 ব্যবহার করে পরে "মনে করে" সরিয়ে ফেলার পরিকল্পনা করে — এটি কেন ঝুঁকিপূর্ণ অভ্যাস?

"পরে মনে করে সরিয়ে ফেলা" মানুষের স্মৃতির উপর নির্ভরশীল একটি ম্যানুয়াল প্রক্রিয়া — বাস্তবে এই "সাময়িক" রুলগুলো প্রায়ই ভুলে যাওয়া হয় এবং মাসের পর মাস, এমনকি বছরের পর বছর প্রোডাকশনে টিকে থাকে। এই কারণেই L21-এর মতো স্বয়ংক্রিয় IaC পলিসি-চেক পাইপলাইনে বসানো হয় — মানুষের স্মৃতির উপর নির্ভর না করে প্রতিটি পরিবর্তনে স্বয়ংক্রিয়ভাবে এই ধরনের বিপজ্জনক রুল ধরার জন্য।

অনুশীলন

  1. চিন্তা করুন: একটি ৩-টিয়ার অ্যাপ্লিকেশনের (ওয়েব, অ্যাপ, ডেটাবেস) জন্য কোন কোন সিকিউরিটি গ্রুপ রুল প্রয়োজন হবে বলে মনে হয় (কে কার সাথে কথা বলার অনুমতি পাবে)?

    ওয়েব-টিয়ারের সিকিউরিটি গ্রুপ ইন্টারনেট থেকে ৪৪৩/৮০ পোর্টে ইনবাউন্ড অনুমতি পাবে; অ্যাপ-টিয়ারের সিকিউরিটি গ্রুপ শুধু ওয়েব-টিয়ারের সিকিউরিটি গ্রুপ থেকে তার অ্যাপ্লিকেশন পোর্টে ইনবাউন্ড অনুমতি পাবে; ডেটাবেসের সিকিউরিটি গ্রুপ শুধু অ্যাপ-টিয়ারের সিকিউরিটি গ্রুপ থেকে ৫৪৩২ পোর্টে ইনবাউন্ড অনুমতি পাবে — প্রতিটি স্তর শুধু ঠিক আগের স্তরের কাছ থেকেই অ্যাক্সেসযোগ্য, একটি স্পষ্ট চেইন।

  2. পরীক্ষা করুন: উপরের কোড সেলে safe_rules-এ একটি দ্বিতীয় রুল (False, 5432, "0.0.0.0/0") যোগ করুন (তালিকার শেষে) এবং public_internet_ip-এর ফলাফল আবার পরীক্ষা করুন।

    ফলাফল অপরিবর্তিত থাকবে (False) কারণ প্রথম রুলটি (শুধু অ্যাপ-টিয়ার) ইতিমধ্যে 5432 পোর্টের সাথে ম্যাচ করে এবং প্রথম ম্যাচ জেতার নিয়ম অনুযায়ী দ্বিতীয় রুলটি কখনো চেক হয় না, যতক্ষণ না উৎস IP প্রথম রুলের সাথে না মেলে — এটি দেখায় রুলের ক্রম কেন গুরুত্বপূর্ণ একটি রুলসেটে।

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

আগের পাঠ
ক্লাউডে DNS ও সার্ভিস ডিসকভারি