Course-এর সূচি

3.5

Security Group বনাম NACL, আর Ephemeral Port

stateful বনাম stateless filtering, rule কোন ক্রমে মেলে, ephemeral port, তিন স্তরের অ্যাপের rule set, আর timeout বনাম connection refused।

34 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি যা পারবে

  • VPC-তে firewall-এর দুটি স্তর কী, আর কোনটা কোথায় বসে, তা বুঝিয়ে বলতে পারবে।
  • Security Group-এর rule লিখতে পারবে, এমনকি এমন rule-ও, যেখানে source হিসেবে অন্য একটা Security Group দেওয়া থাকে।
  • Network ACL-এর rule লিখতে পারবে, “যে rule আগে মেলে, সেটাই চূড়ান্ত” নিয়মটা কাজে লাগাতে পারবে, আর custom NACL ও rule-এর ক্রম নিয়ে যে ফাঁদগুলো আছে সেগুলো এড়াতে পারবে।
  • stateful আর stateless filtering-এর পার্থক্য বোঝাতে পারবে, আর stateless filtering-এর জন্য যে ephemeral port rule লাগে সেগুলো যোগ করতে পারবে।
  • একটা web tier আর একটা database tier-এর পুরো rule set নিজে সাজাতে পারবে, আর সমস্যা হলে “timeout” আর “connection refused”-এর তফাত দেখে কারণ খুঁজে বের করতে পারবে।

#firewall-এর দুই স্তর

VPC-র কোনো Instance-এ যে packet ঢোকে বা বের হয়, তাকে দুই জায়গায় আটকানো বা ছেড়ে দেওয়া যায়:

  • Subnet-এর সীমানায় থাকে Network ACL (NACL)। Subnet-এ যত packet ঢোকে আর বের হয়, প্রত্যেকটা সে পরীক্ষা করে।
  • প্রতিটা Instance-এর গায়ে থাকে Security Group (SG) (ঠিকভাবে বললে, প্রতিটা network interface-এর গায়ে)। শুধু ওই একটা Instance-এ যা ঢোকে বা বের হয়, সেটুকুই সে দেখে।

ধরো Internet থেকে কেউ তোমার web server-এ request পাঠাল। সেটা আগে Subnet-এর Network ACL পার হবে, তারপর Instance-এর Security Group। উত্তর ফেরার সময় উল্টো পথ: আগে Security Group, তারপর Network ACL।

#Security Group

Security Group আসলে কিছু allow rule-এর তালিকা। প্রতিটা rule-এ তিনটা জিনিস থাকে: একটা protocol, একটা port range, আর inbound হলে একটা source, outbound হলে একটা destination। source হতে পারে:

  • একটা CIDR block, যেমন 0.0.0.0/0 (যে কেউ) বা 203.0.113.25/32 (শুধু একটা address);
  • অন্য একটা Security Group, মানে “যেসব network interface-এ ওই Security Group লাগানো আছে, তাদের সবাই”;
  • একটা managed prefix list (কয়েকটা CIDR block একসাথে, একটা নাম দিয়ে রাখা)।

Security Group কীভাবে কাজ করে:

বৈশিষ্ট্যকী বোঝায়
শুধু allow ruleএখানে “deny” rule বলে কিছু নেই। যেটার অনুমতি দেওয়া নেই, সেটা এমনিতেই বাদ পড়ে যায়।
Statefulকোনো request-কে ঢুকতে দিলে, তার উত্তর আপনা-আপনি বের হতে পারে; উল্টো দিকেও একই কথা। উত্তরের বেলায় outbound rule খুলে দেখাই হয় না।
সব rule একসাথে দেখা হয়কোনো ক্রম বা নম্বর নেই: যেকোনো একটা rule অনুমতি দিলেই traffic ঢুকতে পারবে।
নতুন group-এর শুরুর অবস্থাকোনো inbound rule থাকে না (মানে সব inbound বন্ধ), আর থাকে একটা outbound rule, যেটা সব traffic বের হতে দেয়।
network interface-এ লাগানো হয়একটা Instance-এ একাধিক Security Group লাগানো যায় (default হিসেবে প্রতি interface-এ ৫টা), আর সবগুলোর rule মিলিয়ে কাজ করে। আবার একটা group অনেক Instance-এ লাগানো যায়।
সীমাএকটা Security Group একটা Region-এর একটা VPC-র মধ্যেই থাকে।
বদল সাথে সাথে কাজ করেrule বদলালে চালু Instance-গুলোতে তখনই প্রভাব পড়ে; restart লাগে না।
কোটাdefault হিসেবে প্রতি group-এ ৬০টা inbound আর ৬০টা outbound rule (বাড়ানো যায়)।

Security Group কাজ করে Instance-এর বাইরে। যে traffic আটকে যায়, সেটা operating system পর্যন্ত পৌঁছায়ই না, তাই Instance সেটা দেখতেও পায় না, log-ও করতে পারে না।

#rule-এ অন্য Security Group-কে source বানানো

Security Group-এর সবচেয়ে কাজের সুবিধা হলো, rule-এর source হিসেবে আরেকটা Security Group বসিয়ে দেওয়া যায়। “10.0.1.0/24 থেকে port 3306 খুলে দাও” না লিখে তুমি লিখতে পারো “sg-web থেকে port 3306 খুলে দাও”। এতে যা হয়:

  • যে Instance-এ sg-web লাগানো আছে, সে VPC-র যেখানেই থাকুক, connect করতে পারবে;
  • Auto Scaling group নতুন web server চালু করলে সেগুলোও আপনা-আপনি অনুমতি পেয়ে যায়;
  • একই Subnet-এ থাকা অন্য কোনো কিছু অনুমতি পায় না, তার address পাশাপাশি হলেও না।

স্তরগুলো এভাবেই একটার সাথে আরেকটা জোড়া লাগানো হয়: load balancer → web server → database। প্রতিটা group শুধু তার ঠিক আগের group-কে ঢুকতে দেয়। এটা একটা VPC-র ভেতরে কাজ করে, আবার একই Region-এ peering করা VPC-গুলোর মধ্যেও কাজ করে।

#যে Port-গুলো দেখলেই চিনতে হবে

PortProtocolকী কাজে লাগে
22SSHLinux Instance-এ লগইন করা; SFTP-ও (SSH-এর ওপর দিয়ে ফাইল আদান-প্রদান)
21FTPencryption ছাড়া ফাইল আদান-প্রদান
80HTTPencryption ছাড়া ওয়েবসাইট
443HTTPSencrypted ওয়েবসাইট আর API
3389RDPWindows Instance-এ Remote Desktop
3306MySQL / MariaDB / Aurora MySQLdatabase connection
5432PostgreSQL / Aurora PostgreSQLdatabase connection

একটা বাস্তব উদাহরণ নাও: একটা EC2 Instance-এ একটা WordPress সাইট চলছে। সাইটটা সবাই দেখবে, তাই Security Group-এ 0.0.0.0/0 থেকে HTTP (80) আর HTTPS (443) খোলা রাখতে হবে। server দেখভালের জন্য SSH (22)-ও লাগবে, কিন্তু সেটা খুলবে শুধু তোমার নিজের বাসা বা অফিসের address থেকে, যেমন 203.0.113.25/32। 0.0.0.0/0 থেকে কখনোই না। পরীক্ষায় যে option-এ port 22 0.0.0.0/0-এর জন্য খোলা, সেটা সবসময়ই “bad practice”।

#Network ACL

Network ACL হলো Subnet-এর সীমানায় বসানো allow আর deny rule-এর একটা নম্বর দেওয়া তালিকা।

বৈশিষ্ট্যকী বোঝায়
allow আর deny দুটোইএখানে সরাসরি deny rule লেখা যায়। তাই নির্দিষ্ট কোনো IP address বা range আটকাতে NACL-ই হলো আসল হাতিয়ার।
Statelessসে কিছুই মনে রাখে না। উত্তরটাও তার কাছে একটা নতুন packet, তাই উল্টো দিকের জন্য আলাদা rule-এর সাথে সেটাকে মিলতে হয়।
নম্বর দেওয়া, যেটা আগে মেলে সেটাই চূড়ান্তrule চেক হয় সবচেয়ে ছোট নম্বর থেকে শুরু করে ওপরের দিকে (1 থেকে 32766)। প্রথম যে rule মিলে যায়, সিদ্ধান্ত সেটাই; পরের rule-গুলো আর পড়াই হয় না।
শেষে একটা ধরা-পড়ার ruleপ্রতিটা NACL-এর শেষে একটা * rule থাকে। নম্বর দেওয়া কোনো rule-এর সাথে যা মেলেনি, সেটা এখানে এসে deny হয়। এই rule বদলানো বা মোছা যায় না।
প্রতি Subnet-এ একটাএকটা Subnet-এর সাথে ঠিক একটা NACL-ই যুক্ত থাকে; তবে একটা NACL অনেকগুলো Subnet-এ কাজ করতে পারে। নতুন Subnet বানালে সেটা VPC-র default NACL ব্যবহার করে।
নম্বর দেওয়ার অভ্যাসAWS বলে ১০০ করে বাড়িয়ে নম্বর দিতে (100, 200, 300…), যাতে পরে মাঝখানে নতুন rule ঢোকানোর জায়গা থাকে।
কোটাdefault হিসেবে প্রতি দিকে ২০টা rule (৪০ পর্যন্ত বাড়ানো যায়)।

Network ACL-এর rule-এ শুধু CIDR block দেওয়া যায়, Security Group দেওয়া যায় না।

#Default আর custom Network ACL

পরীক্ষায় সবচেয়ে বেশি যে ফাঁদগুলো আসে, এটা তার একটা:

  • Default NACL (প্রতিটা VPC-র সাথে নিজে থেকেই তৈরি হয়) সব inbound আর সব outbound traffic যেতে দেয়।
  • তুমি নিজে যে custom NACL বানাও, তাতে rule যোগ না করা পর্যন্ত সব inbound আর সব outbound traffic আটকে থাকে।

Network ACL rule: যেটা আগে মেলে, সেটাই চূড়ান্ত

একই দুটো rule, দুই রকম ক্রমে সাজানো। খেয়াল করো, প্রথম যে rule-এর সাথে মেলে, চেক সেখানেই থেমে যায়।

পরিস্থিতি

Web Subnet
আক্রমণকারী203.0.113.50
গ্রাহক198.51.100.20
Network ACL
Web Server
TCP 80

inbound rule (ছোট নম্বর আগে)

Rule #ধরনউৎসসিদ্ধান্ত
100All traffic203.0.113.50/32Deny
200TCP 800.0.0.0/0Allow
*All traffic0.0.0.0/0Deny
ধাপ 1 / 3
1

আক্রমণকারীর packet এল। প্রথমে rule 100 চেক হয়: source 203.0.113.50/32, মিলে গেল।

#Stateful, stateless আর ephemeral port

প্রতিটা TCP connection-এর দুটো মাথা থাকে, আর দুই মাথাতেই একটা করে port লাগে:

  • Server একটা পরিচিত port-এ অপেক্ষা করে: 80, 443, 3306…
  • Client-এর operating system শুধু এই একটা connection-এর জন্য একটা অস্থায়ী port বেছে নেয়। এটাকেই বলে ephemeral port।

ধরো 198.51.100.20-এর একটা browser request পাঠাল 198.51.100.20:50105 → 10.0.1.10:80। উত্তর ফিরবে 10.0.1.10:80 → 198.51.100.20:50105 পথে। মানে উত্তরটা যায় client-এর ephemeral port-এ।

Security Group stateful, তাই এই ঝামেলা সে নিজেই সামলে নেয়। Network ACL stateless, সে সামলায় না। তাই তার outbound rule-এ client-দের ephemeral port-এ উত্তর পাঠানোর অনুমতি রাখতে হবে। আর তোমার server-ই যদি client হয় (যেমন database বা কোনো API-কে call করে), তাহলে inbound rule-এও ওই server-এর ephemeral port-এ ফেরত আসা উত্তর ঢুকতে দিতে হবে।

কোন system কোন ephemeral port range ব্যবহার করে, সেটা আলাদা:

ClientEphemeral range
বেশিরভাগ Linux kernel (Amazon Linux-ও)32768–60999
Windows Server 2008 আর তার পরের সংস্করণ, IANA-র সুপারিশ49152–65535
AWS NAT gateway, Elastic Load Balancing, Lambda1024–65535

একটা public web server-এ কে client হয়ে আসবে তার ঠিক নেই, তাই সাধারণত rule দেওয়া হয় TCP 1024–65535। এতে সব ধরনের client ধরা পড়ে।

একটা request, দুটো firewall, যাওয়া-আসা দুই পথেই

একটা browser web server-এর কাছে একটা পেজ চাইছে। Network ACL পাহারা দেয় Subnet-এর সীমানায়, আর Security Group পাহারা দেয় Instance-এর গায়ে।

পরিস্থিতি

Browser198.51.100.20
Network ACLSubnet-এর সীমানায়, stateless
Security GroupInstance-এর গায়ে, stateful
Web Server10.0.1.10
TCP 50105 → 80
ধাপ 1 / 7
1

browser নিজের দিকে যেকোনো একটা source port বেছে নেয় (এটাই ephemeral port, এখানে 50105), তারপর server-এর port 80-তে connect করে। packet সবার আগে পৌঁছায় Subnet-এর সীমানায়।

নিজেকে যাচাই করোপ্রশ্ন

একটা ক্ষতিকর IP address যেন একটা Subnet-এর কোনো Instance-এ পৌঁছাতে না পারে, সেটা নিশ্চিত করতে হবে। কী ব্যবহার করবে?

#Security Group আর Network ACL পাশাপাশি

Security GroupNetwork ACL
কার ওপর কাজ করেযেসব Instance / network interface-এ লাগানো আছেযুক্ত Subnet-গুলোর ভেতরের সব resource
Ruleশুধু allowallow আর deny দুটোই
StateStateful: উত্তর আপনা-আপনি যেতে পারেStateless: উত্তরের জন্যও আলাদা rule লাগে
কীভাবে চেক হয়সব rule একসাথে, কোনো ক্রম নেইনম্বর ধরে, ছোট নম্বর আগে, যেটা আগে মেলে সেটাই চূড়ান্ত
SourceCIDR block, অন্য Security Group, prefix listশুধু CIDR block
শুরুর অবস্থানতুন group: inbound বন্ধ, outbound সব খোলাDefault NACL: সব allow। Custom NACL: সব deny
সাধারণত কী কাজেপ্রতিটা resource-এর মূল আর খুঁটিনাটি নিয়ন্ত্রণপুরো Subnet-এর ওপর মোটা দাগের সুরক্ষা, আর নির্দিষ্ট address আটকানো

বাস্তবে বেশিরভাগ ডিজাইনে খুঁটিনাটি rule রাখা হয় Security Group-এ, আর Network ACL রাখা হয় সাদামাটা (প্রায়ই default-টাই)। পুরো Subnet-এর জন্য কোনো বাড়তি সুরক্ষা লাগলে, বা চেনা খারাপ address আটকাতে হলে, তখন NACL-এ rule যোগ করা হয়।

#দুই স্তরের পুরো rule set

পরীক্ষার একটা পরিচিত scenario: VPC 10.0.0.0/16। একটা public web Subnet 10.0.1.0/24, যেটা HTTP/HTTPS দেয়। আর একটা private database Subnet 10.0.2.0/24, যেখানে port 3306-এ MySQL চলে।

Web Subnet-এর NACL, inbound

Rule #ধরনউৎসসিদ্ধান্তউদ্দেশ্য
50All traffic203.0.113.50/32Denyচেনা এক আক্রমণকারীকে আটকানো
100TCP 800.0.0.0/0AllowHTTP-তে আসা ভিজিটর
110TCP 4430.0.0.0/0AllowHTTPS-এ আসা ভিজিটর
120TCP 1024–6553510.0.2.0/24Allowdatabase থেকে ফেরা উত্তর
*All traffic0.0.0.0/0Denyবাকি সব

Web Subnet-এর NACL, outbound

Rule #ধরনগন্তব্যসিদ্ধান্তউদ্দেশ্য
100TCP 1024–655350.0.0.0/0Allowbrowser-এ উত্তর পাঠানো (ephemeral port)
110TCP 330610.0.2.0/24Allowশুধু database Subnet-এ query পাঠানো
*All traffic0.0.0.0/0Denyবাকি সব

Database Subnet-এর NACL, inbound

Rule #ধরনউৎসসিদ্ধান্তউদ্দেশ্য
100TCP 330610.0.1.0/24Allowdatabase connection, শুধু web Subnet থেকে
*All traffic0.0.0.0/0DenyInternet আর বাকি সব

Database Subnet-এর NACL, outbound

Rule #ধরনগন্তব্যসিদ্ধান্তউদ্দেশ্য
100TCP 1024–6553510.0.1.0/24Allowquery-র ফল web server-এ ফেরত পাঠানো
*All traffic0.0.0.0/0DenyInternet-এর দিকে কিছুই বের হবে না

একটা web tier আর একটা database tier, এক এক করে প্রতিটা rule

VPC 10.0.0.0/16 · web Subnet 10.0.1.0/24 · database Subnet 10.0.2.0/24 (3306-এ MySQL)। প্রতিটা ধাপে দেখানো হয়েছে, কোন rule সিদ্ধান্তটা নিল।

পরিস্থিতি

VPC10.0.0.0/16
Web Subnet10.0.1.0/24
DB Subnet10.0.2.0/24
ভিজিটর198.51.100.20
আক্রমণকারী203.0.113.50
Web Server10.0.1.10
MySQL10.0.2.20
TCP → 443

Web NACL · inbound

Rule #ধরনউৎস / গন্তব্যসিদ্ধান্ত
50All traffic203.0.113.50/32Deny
100TCP 800.0.0.0/0Allow
110TCP 4430.0.0.0/0Allow
120TCP 1024–6553510.0.2.0/24Allow
*All traffic0.0.0.0/0Deny
ধাপ 1 / 5
1

ভিজিটরের HTTPS request web Subnet-এ ঢুকছে। web-এর inbound rule একে একে দেখা হয়: 50-এর source এটা না; 100 হলো port 80-র, মেলে না; 110-এ TCP 443 খোলা। Allow।

এই ডিজাইনে তিনটা জিনিস খেয়াল করার মতো:

  • Web-এর outbound rule 110 আসলে বাড়তি: rule 100 (যেকোনো জায়গায় 1024–65535) আগে চেক হয়, আর তার মধ্যেই 3306 পড়ে যায়। rule 110 কোনো ক্ষতি করে না, বরং উদ্দেশ্যটা লিখে রাখে; কিন্তু traffic আসলে এটার জোরে যায় না।
  • Rule 50 সব traffic আটকায়, শুধু port 80 না। শুধু port 80-তে deny দিলে আক্রমণকারী rule 110 দিয়ে 443-এ ঠিকই ঢুকে পড়ত।
  • Web server-গুলো নিজে থেকে Internet-এ 80/443-এ কোনো connection শুরু করতে পারে না (যেমন update নামাতে), কারণ outbound-এ শুধু উঁচু port-গুলো খোলা। কড়া ডিজাইনের জন্য এটা ঠিকই আছে, তবে তখন update-এর জন্য একটা proxy, মানানসই rule সহ একটা NAT পথ, বা VPC endpoint লাগবে।

এর সাথে মিলিয়ে Security Group-গুলো অনেক সহজ, কারণ এরা stateful আর একে অপরকে source হিসেবে দেখাতে পারে:

Security GroupInbound rule
sg-web0.0.0.0/0 থেকে TCP 80 আর 443 (load balancer থাকলে, তার Security Group থেকে)
sg-dbsg-web থেকে TCP 3306

#নিজে করে দেখো

# Security Group: web-এ যেকোনো জায়গা থেকে HTTPS খোলা, db-তে MySQL শুধু web group থেকে
WEB=$(aws ec2 create-security-group --group-name web --description web --vpc-id $VPC --query GroupId --output text)
DB=$(aws ec2 create-security-group --group-name db --description db --vpc-id $VPC --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $WEB --protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id $DB --protocol tcp --port 3306 --source-group $WEB

# Network ACL: ছোট rule নম্বর দিয়ে একটা address আটকাও
aws ec2 create-network-acl-entry --network-acl-id $NACL --ingress --rule-number 50 \
  --protocol -1 --cidr-block 203.0.113.50/32 --rule-action deny

# client থেকে সমস্যা খোঁজা: timeout নাকি refused
curl -m 5 http://203.0.113.25/     # "timed out" → firewall; "Connection refused" → কোনো app শুনছে না

#সারসংক্ষেপ

মূল কথাগুলো

  • VPC-তে দুটো ছাঁকনি: Subnet-এর সীমানায় Network ACL, আর প্রতিটা Instance-এ Security Group।
  • Security Group: শুধু allow rule, stateful, সব rule একসাথে দেখা হয়, source হিসেবে অন্য Security Group দেওয়া যায়; নতুন group-এ সব inbound বন্ধ আর সব outbound খোলা।
  • Network ACL: allow আর deny দুটোই, stateless, নম্বর দেওয়া আর যেটা আগে মেলে সেটাই চূড়ান্ত, শেষে একটা * deny, শুধু CIDR block, প্রতি Subnet-এ একটা। নির্দিষ্ট IP আটকাতে এটাই ব্যবহার করো।
  • Default NACL সব খোলা রাখে; নতুন custom NACL সব বন্ধ রাখে।
  • উত্তর যায় client-এর ephemeral port-এ। stateless NACL-এ এর জন্য আলাদা করে rule দিতে হয়; 1024–65535 দিলে সব ধরনের client ধরা পড়ে (Linux ব্যবহার করে 32768–60999, Windows 49152–65535)।
  • “request পৌঁছায়, কিন্তু উত্তর ফেরে না” → Network ACL দেখো। Timeout → কোনো firewall আটকেছে; connection refused → কোনো application শুনছে না।
  • স্তরগুলো জোড়া লাগাও এমন Security Group দিয়ে, যারা একে অপরকে source হিসেবে দেখায় (sg-db-তে sg-web থেকে 3306 খোলা); database port কখনো 0.0.0.0/0-এর জন্য খুলবে না।