Yük dengeleyiciler için Cloud NGFW Essentials

1. Giriş

Bu Codelab'de, bölgesel ağ güvenlik duvarı politikaları kullanılarak dahili uygulama yük dengeleyiciler (ALB) ve proxy ağ yük dengeleyiciler (NLB) için Cloud Next Generation Firewall (NGFW) Essentials ele alınmaktadır.

Cloud NGFW, Google Cloud iş yüklerini korumak için gelişmiş tehdit koruması ve mikro segmentasyon özelliklerine sahip, tamamen dağıtılmış bir güvenlik duvarı hizmetidir. Yük dengeleyici düzeyinde Cloud NGFW'yi etkinleştirmek, dahili proxy tabanlı yük dengeleyicilere giren tüm TCP trafiğine tutarlı güvenlik duvarı politikası kuralları uygular. Tüm hizmetler için politikaların daha geniş kapsamlı şekilde uygulanmasını sağlayarak kuruluşun güvenlik duruşunun hazırlanmasını kolaylaştırır.

Bu Codelab'de aşağıdaki Cloud NGFW ve Cloud Load Balancer ürünleri ve özellikleri ele alınmaktadır:

  • Cloud NGFW Essentials
  • Bölgesel ağ güvenlik duvarı politikaları
  • Bölgesel dahili uygulama yük dengeleyicisi
  • Arka uç yönetilen örnek grubu (MIG) ve Private Service Connect (PSC) ağ uç noktası grubu (NEG)

NOT: Yük dengeleyici hedefleri için güvenlik duvarı politikası kurallarının desteklenen en yeni özellikleri ve sınırlamaları hakkında bilgi edinmek için Cloud NFGW belgelerine bakın.

Öğrenecekleriniz

  • Yük dengeleyicileri hedefleyen temel Cloud NGFW güvenlik duvarı politika kurallarını etkinleştirme
  • Sanal makine örneği ve PSC arka uçlarıyla dahili tüketici yük dengeleyici hizmetini koruma
  • İstemci erişimini test etme ve güvenlik duvarı günlüklerini doğrulama

İhtiyacınız olanlar

2. Kavramlar

Güvenlik duvarı özellik katmanları

Cloud NGFW'nin üç özellik katmanı vardır: Essentials, Standard ve Enterprise. Her aşamalı katman, ağ trafiği filtreleme ve inceleme özelliklerinin ek düzeylerini sunar.

Cloud NGFW Essentials'ın filtreleme özelliklerinin özeti:

Katman

Kapasite

Ağ katmanları

Örnek kural parametreleri

Essentials

IP adresi ve aralığı filtreleme

IP

--src-ip-ranges=1.1.1.0/24,2.2.2.2/32

Essentials

Adres grupları

IP

--src-address-groups=special-ranges

Essentials

Protokol ve bağlantı noktası filtreleme

TCP

--layer4-configs=tcp

Essentials

Güvenli etiketler

Meta veri

--src-secure-tags=tagValues/987654321098

Essentials

Ağ türü filtreleme

IP / meta veriler

--src-network-type=INTRA_VPC

Yük dengeleyici iletim kuralları, hedef TCP bağlantı noktasını açıkça tanımlar. Güvenlik duvarı kuralı --layer4-configs= parametresi yalnızca tcp değerini belirtebilir. Bağlantı noktası değeri, yönlendirme kuralının kendisi tarafından belirtilir.

Adres grupları ve ağ türleri, güvenlik duvarı politikası kurallarını daha verimli hale getirmek için yararlı olabilir. VPC_NETWORKS ve INTRA_VPC ağ türleri, yük dengeleyiciler için güvenlik duvarı politikası kurallarıyla desteklenir.

NOT: Yük dengeleyiciler için güvenlik duvarı politikası kuralları yalnızca --direction=INGRESS'ı destekler. Bu kurallar, yük dengeleyici tarafından kullanıma sunulan hizmetlere erişimi kontrol etmek için tasarlanmıştır.

Veri düzlemi filtreleme

Cloud NFGW Essentials özellikleri, temel Katman 3 (IP adresi) ve Katman 4 (TCP bağlantı noktası) durum bilgisi olan güvenlik duvarı kurallarını kapsar. Bu güvenlik duvarı politikası kuralı özellikleri, tam paket incelemesi yapılmasına gerek kalmadan yük dengeleyici veri düzleminde verimli bir şekilde gerçekleştirilir.

Sanal makine örneklerini hedefleyen Cloud NGFW Essentials politika kuralları, temel Google Cloud yazılımla tanımlanmış ağının (Andromeda) bir parçası olarak dağıtılmış VPC ağı yapısında uygulanır. Paket filtreleme ve güvenlik duvarı politikası kuralları, paket sanal makine örneği ağ arayüzüne ulaşmadan önce her bir sanal makine örneğinin hipervizör düzeyinde uygulanır.

Yük dengeleyicileri hedefleyen Cloud NGFW Essentials politika kuralları, Google Cloud yük dengeleyicilerinin temel teknolojileri (özellikle Envoy hizmet proxy'si altyapısı) kullanılarak uygulanır. Aynı Cloud NFGW kaynak modeli ve kural yapısı kullanılarak durum bilgisi olan paket filtreleme, doğrudan proxy tabanlı yük dengeleyici veri düzleminde uygulanır.

Yük dengeleyici hedefleri

Yük dengeleyicileri hedefleyen Cloud NGFW politikaları ile sanal makine örneklerini hedefleyen politikalar arasında birkaç temel fark vardır.

Güvenlik duvarı politikası kuralları, --target-type=INTERNAL_MANAGED_LB ile birlikte yük dengeleme kuralına --target-forwarding-rules=FR_NAME yönelik referans belirtilerek tek bir yük dengeleyiciyi hedeflemek için uygulanabilir. VPC ağı bölgesindeki (bölge, politika kapsamındadır) tüm yük dengeleyici yönlendirme kurallarını hedeflemek için belirli referans atlanmalı ve yalnızca --target-type=INTERNAL_MANAGED_LB işareti kullanılmalıdır.

Kural yapılandırmasında --target-type parametresi ayarlanmamışsa kural, varsayılan olarak tüm sanal makine örneklerine otomatik olarak uygulanır ve yük dengeleyicilere uygulanmaz.

Codelab ağı

Bu Codelab'de, bir VPC ağı ve aşağıdaki kaynakların bulunduğu tek bir proje kullanılır:

  • İki bölgesel alt ağ
  • Bir bölgesel ağ güvenlik duvarı politikası
  • Üç bölgesel dahili uygulama yük dengeleyicisi
    • www Sanal makine örnek grubu arka ucu olan HTTP hizmeti
    • api Sanal makine örnek grubu arka ucu olan HTTP hizmeti
    • gcs Google API'lerine PSC NEG arka ucuyla HTTPS hizmeti
  • Çeşitli izin verme ve reddetme politikalarını test etmek için iki sanal makine örneği

figure1

Şekil 1. Codelab ağı

Yük dengeleyicileri hedefleyen güvenlik duvarı politikası kuralları, yük dengeleyici iletme kuralı kaynaklarına bağlanır. Yük dengeleyiciler, eksiksiz bir yük dengeleme hizmeti sağlamak için birlikte yapılandırılmış, ayrı ayrı tanımlanmış kaynaklardan oluşur. İletim kuralı tanımı, doğrudan kendisi için tanımlanmış belirli bir hedef proxy kaynağına referans veriyor.

figure2

Şekil 1. Yük dengeleyici kaynakları için Cloud NGFW

Cloud NGFW Essentials filtreleri, yük dengeleyici veri düzlemine programlanır ve tanımlanan hedef proxy hizmet katmanında (bir sanal makine örneği arayüzüne benzer şekilde) uygulanır. Politikaları zorunlu kılmak için aynı dağıtılmış ve tutarlı güvenlik duvarı mekanizmaları kullanılır.

3. Proje ayarlama

Projenize erişme

Bu Codelab'de tek bir Google Cloud projesi kullanılır. Yapılandırma adımlarında gcloud cli KSA ve Linux kabuk komutları kullanılır.

Google Cloud projenizin komut satırına erişerek başlayın:

Proje kimliğinizi ayarlama

gcloud config set project YOUR_PROJECT_ID_HERE

API hizmetlerini etkinleştirme

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  networksecurity.googleapis.com \
  certificatemanager.googleapis.com

Kabuk ortamı değişkenlerini ayarlama

# set your region preference
export REGION_1="us-west1"
# set your zone preference
export ZONE_1="us-west1-c"
# fetch project info and verify vars set
export PROJECT_ID=$(gcloud config list --format="value(core.project)")
export PROJECT_NO=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
echo ${REGION_1}
echo ${ZONE_1}
echo ${PROJECT_ID}
echo ${PROJECT_NO}

4. Ağ temeli

Bu bölümde aşağıdakileri içeren bir ağ temeli dağıtacaksınız:

  • Küresel VPC ağı ve bölgesel alt ağlar
  • VPC ağının güvenliğini sağlamak için bölgesel ağ güvenlik duvarı politikası
  • Sunucuların yazılım paketlerini getirmesi için Cloud Router ve Cloud NAT
  • Yük dengeleyici girişi için IP adresi rezervasyonları ve DNS kayıtları

Ağ kaynakları oluşturma

# create vpc network
gcloud compute networks create vnet-foo --subnet-mode=custom
# create subnet for clients
gcloud compute networks subnets create subnet-foo-1 \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=10.0.0.0/24 \
  --enable-private-ip-google-access
# create subnet for backend servers
gcloud compute networks subnets create subnet-foo-2 \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=172.16.0.0/24 \
  --enable-private-ip-google-access
# create proxy subnet
gcloud compute networks subnets create subnet-foo-3 \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=172.16.128.0/23

Güvenlik duvarı bileşenleri oluşturma

Burada oluşturulan temel bölgesel ağ güvenlik duvarı politikası, daha sonra yük dengeleyiciye özgü hedefler eklenirken kullanılır. Politika, yük dengeleyiciyle aynı bölgede olmalıdır.

Adres grubu oluşturma

Yük dengeleyici işlevini destekleyen kaynak durum denetimi sorgu IP aralıklarını tanımlamak için bir adres grubu oluşturarak başlayın. Yük dengeleyici arka uçlarının iyi durumda kabul edilmesi için bu aralıklara izin verilmesi gerekir. Ayrıca daha sonra yük dengeleyicileri hedefleyen güvenlik duvarı politikası kurallarıyla da kullanılır.

# create address group
gcloud network-security address-groups create uhc-probes \
  --description="health check probes" \
  --type=IPv4 \
  --capacity=42 \
  --location=${REGION_1}
# add ip ranges to address group
gcloud network-security address-groups add-items uhc-probes \
  --items=35.191.0.0/16,130.211.0.0/22 \
  --location=${REGION_1}

Güvenlik duvarı politikası oluşturma

# create fw policy
gcloud compute network-firewall-policies create fw-policy-foo-${REGION_1} \
  --description="foo fw ${REGION_1}" \
  --region=${REGION_1}
# create fw policy rule to allow in iap
gcloud compute network-firewall-policies rules create 1001 \
  --description="allow iap for ssh" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp:22 \
  --src-ip-ranges=35.235.240.0/20
# create fw policy rule to allow in health checks
gcloud compute network-firewall-policies rules create 1002 \
  --description="allow health checks to backends" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes
# create fw policy rule to allow in lb proxies
gcloud compute network-firewall-policies rules create 1003 \
  --description="allow lb proxy" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp:80,tcp:443,tcp:8080 \
  --src-ip-ranges=172.16.128.0/23
# associate fw policy to vnet
gcloud compute network-firewall-policies associations create \
  --name=fw-policy-association-foo-${REGION_1} \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --network=vnet-foo \
  --firewall-policy-region=${REGION_1}

Ağ hizmetlerini yapılandırma

Cloud Router ve NAT ağ geçidi oluşturma

# create router for nat
gcloud compute routers create cr-nat-foo \
  --network=vnet-foo \
  --asn=16550 \
  --region=${REGION_1}
# create nat gateway
gcloud compute routers nats create natgw-foo \
  --router=cr-nat-foo \
  --region=${REGION_1} \
  --auto-allocate-nat-external-ips \
  --nat-all-subnet-ip-ranges

IP adreslerini ayırtma

# reserve vip for lb www service
gcloud compute addresses create vip-foo-www \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.101
# reserve vip for lb api service
gcloud compute addresses create vip-foo-api \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.102
# reserve vip for lb gcs service
gcloud compute addresses create vip-foo-gcs \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.103

DNS kayıtları oluşturma

# create dns zone
gcloud dns managed-zones create zone-foo \
  --description="private zone for foo" \
  --dns-name=foo.com \
  --networks=vnet-foo \
  --visibility=private
# create dns record for www service
gcloud dns record-sets create www.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.101"
# create dns record for api service
gcloud dns record-sets create api.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.102"
# create dns record for gcs service
gcloud dns record-sets create gcs.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.103"

Ağ kurulumu bölümünün sonuna geldik. Şimdi yük dengeleyicileri yapılandırma bölümüne geçiyoruz.

5. Yük dengeleyici hizmetleri

Bu bölümde, üç hizmet için yük dengeleyici bileşenlerini (arka uç hizmetleri, URL eşlemeleri, hedef proxy'ler ve iletim kuralları) dağıtacaksınız:

  1. www hizmeti (ilb-foo-www) 80 bağlantı noktasında
  2. api hizmeti (ilb-foo-api) 8080 bağlantı noktasında
  3. TLS sertifikasıyla gcs hizmeti (ilb-foo-gcs) 443 numaralı bağlantı noktasında

Destekleyici arka uç kaynaklarıyla birlikte:

  1. Yönetilen örnek grubunda HTTP sunucularını çalıştıran sanal makine örnekleri
  2. Google API'leri için Private Service Connect (PSC) ağ uç noktası grubu (NEG)
  3. Google Cloud Storage (GCS) paketi

Arka uç kaynaklarını ayarlama

Sanal makine örnek grubu sunucuları oluşturma

www yük dengeleyici, 80 bağlantı noktasında dinleyen Apache web sunucusunu çalıştıran sanal makine örneği grubu arka uç sunucularını kullanır.

api yük dengeleyici, 8080 bağlantı noktasında dinleyen aynı sanal makine örneği grubunu kullanır.

# create vm startup config with http server
cat > vm-server-startup.sh << 'OEOF'
#! /bin/bash
set -e
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone | cut -d/ -f4)"
echo "www served from: $vm_hostname in zone $vm_zone on port 80" | \
tee /var/www/html/index.html
echo "Listen 8080" | tee -a /etc/apache2/ports.conf
mkdir -p /var/www/api
echo "api served from: $vm_hostname in zone $vm_zone on port 8080" | \
tee /var/www/api/index.html
tee /etc/apache2/sites-available/api.conf << EOF
<VirtualHost *:8080>
    DocumentRoot /var/www/api
</VirtualHost>
EOF
a2ensite api.conf
systemctl restart apache2
OEOF
# create managed instance group template
gcloud compute instance-templates create mig-template-foo \
  --machine-type=e2-micro \
  --network=vnet-foo \
  --region=${REGION_1} \
  --subnet=subnet-foo-2 \
  --no-address \
  --shielded-secure-boot \
  --metadata-from-file=startup-script=vm-server-startup.sh
# create regional managed instance group
gcloud compute instance-groups managed create mig-foo \
  --region=${REGION_1} \
  --size=2 \
  --template=mig-template-foo \
  --base-instance-name=service-foo
# create named ports for instance group
gcloud compute instance-groups managed set-named-ports mig-foo \
  --named-ports=www-port:80,api-port:8080 \
  --region=${REGION_1}

Depolama paketi oluşturma

gcs yük dengeleyici, Google API'leri ön ucu üzerinden Cloud Storage paketine bağlanmak için PSC NEG arka ucunu kullanır.

# create random bucket name
export BUCKET=$(openssl rand -hex 12)
echo ${BUCKET}

NOT: Kabuk oturumu kapatıldığında ortam değişkenleri kaybolur. Gelecekteki bir oturumda tamamlamak için gerekirse paket adını not edin.

# create bucket
gcloud storage buckets create gs://${BUCKET} --location=${REGION_1}
# give compute sa object admin role on bucket
gcloud storage buckets add-iam-policy-binding gs://${BUCKET} \
  --member=serviceAccount:${PROJECT_NO}-compute@developer.gserviceaccount.com \
  --role=roles/storage.objectAdmin

Sertifika oluştur

gcs yük dengeleyici, hedef HTTPS proxy'ye dağıtılan kendinden imzalı bir sertifikayla istemci HTTPS isteklerini sonlandırır.

# create cert
openssl req -x509 -newkey rsa:2048 \
  -nodes \
  -days 365 \
  -keyout foo-gcs-key.pem \
  -out foo-gcs-cert.pem \
  -subj "/CN=Foo, Inc." \
  -addext "subjectAltName=DNS:gcs.foo.com"
# upload to certificate manager
gcloud certificate-manager certificates create cert-foo-gcs \
  --private-key-file=foo-gcs-key.pem \
  --certificate-file=foo-gcs-cert.pem \
  --location=${REGION_1}

Yük dengeleyici bileşenleri oluşturma

Yük dengeleyici bileşenlerinin dağıtımını otomatikleştirmek için aşağıdaki komut dosyasını kullanın. Bu, ilgili tüm yapılandırma öğelerinde hız ve doğruluk açısından yardımcı olur.

Yük dengeleyici oluşturma komut dosyasını dağıtma

# create script file
cat > create_lbs.sh << EOF
#!/bin/bash
set -e

# --- Create load balancer for www service port 80 ---
echo "--- Creating Load Balancer for WWW Service (ilb-foo-www) on port 80 ---"

echo "ilb-foo-www: creating health check (hc-foo-www)"
gcloud compute health-checks create http hc-foo-www \
  --use-serving-port \
  --region=${REGION_1}

echo "ilb-foo-www: creating backend service (bes-foo-www)"
gcloud compute backend-services create bes-foo-www \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --port-name=www-port \
  --health-checks=hc-foo-www \
  --health-checks-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: adding managed instance group (mig-foo) to backend service (bes-foo-www)"
gcloud compute backend-services add-backend bes-foo-www \
  --balancing-mode=UTILIZATION \
  --instance-group=mig-foo \
  --instance-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: creating url map (ilb-foo-www)"
gcloud compute url-maps create ilb-foo-www \
  --default-service=bes-foo-www \
  --region=${REGION_1}

echo "ilb-foo-www: creating target http proxy (proxy-foo-www)"
gcloud compute target-http-proxies create proxy-foo-www \
  --url-map=ilb-foo-www \
  --url-map-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: creating forwarding rule (fr-foo-www)"
gcloud compute forwarding-rules create fr-foo-www \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-www \
  --ports=80 \
  --target-http-proxy=proxy-foo-www \
  --target-http-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for WWW Service (ilb-foo-www) ---"
echo

# --- Create load balancer for api service port 8080 ---
echo "--- Creating Load Balancer for API Service (ilb-foo-api) on port 8080 ---"

echo "ilb-foo-api: creating health check (hc-foo-api)"
gcloud compute health-checks create http hc-foo-api \
  --use-serving-port \
  --region=${REGION_1}

echo "ilb-foo-api: creating backend service (bes-foo-api)"
gcloud compute backend-services create bes-foo-api \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --port-name=api-port \
  --health-checks=hc-foo-api \
  --health-checks-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: adding managed instance group (mig-foo) to backend service (bes-foo-api)"
gcloud compute backend-services add-backend bes-foo-api \
  --balancing-mode=UTILIZATION \
  --instance-group=mig-foo \
  --instance-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: creating url map (ilb-foo-api)"
gcloud compute url-maps create ilb-foo-api \
  --default-service=bes-foo-api \
  --region=${REGION_1}

echo "ilb-foo-api: creating target http proxy (proxy-foo-api)"
gcloud compute target-http-proxies create proxy-foo-api \
  --url-map=ilb-foo-api \
  --url-map-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: creating forwarding rule (fr-foo-api)"
gcloud compute forwarding-rules create fr-foo-api \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-api \
  --ports=8080 \
  --target-http-proxy=proxy-foo-api \
  --target-http-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for API Service (ilb-foo-api) ---"
echo

# --- Create load balancer for gcs service port 443 ---
echo "--- Creating Load Balancer for GCS Service (ilb-foo-gcs) on port 443 ---"

echo "ilb-foo-gcs: creating network endpoint group (neg-psc-gcs)"
gcloud compute network-endpoint-groups create neg-psc-gcs \
  --network-endpoint-type=private-service-connect \
  --psc-target-service=storage.${REGION_1}.rep.googleapis.com \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating backend service (bes-foo-gcs)"
gcloud compute backend-services create bes-foo-gcs \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --region=${REGION_1}

echo "ilb-foo-gcs: adding network endpoint group (neg-psc-gcs) to backend service (bes-foo-gcs)"
gcloud compute backend-services add-backend bes-foo-gcs \
  --network-endpoint-group=neg-psc-gcs \
  --network-endpoint-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating url map (ilb-foo-gcs)"
gcloud compute url-maps create ilb-foo-gcs \
  --default-service=bes-foo-gcs \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating target https proxy (proxy-foo-gcs)"
gcloud compute target-https-proxies create proxy-foo-gcs \
  --url-map=ilb-foo-gcs \
  --url-map-region=${REGION_1} \
  --certificate-manager-certificates=cert-foo-gcs \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating forwarding rule (fr-foo-gcs)"
gcloud compute forwarding-rules create fr-foo-gcs \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-gcs \
  --ports=443 \
  --target-https-proxy=proxy-foo-gcs \
  --target-https-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for GCS Service (ilb-foo-gcs) ---"
echo

echo "All load balancers created successfully."
EOF
# make script executable
chmod +x create_lbs.sh
# run script
./create_lbs.sh

NOT: Bu komut dosyasının tamamlanması birkaç dakika sürer.

Yük dengeleyici oluşturmayı doğrulama

Yönlendirme kurallarının ve arka uç hizmetlerinin dağıtıldığını kontrol edin.

# check forwarding rules
gcloud compute forwarding-rules list
# check backend services
gcloud compute backend-services list

Yük dengeleyici kurulumu bölümü burada sona eriyor. Şimdi istemci sanal makine örneklerini yapılandırma bölümüne geçiyoruz.

6. Müşteri erişimi

Sanal makine istemci kaynakları oluşturma

Bu bölümde istemcileri dağıtacak ve uçtan uca bağlantıyı doğrulayacaksınız.

Sanal makine örnekleri oluşturma

# set variables for client ip addresses
export VM_ALLOW_IP="10.0.0.11"
export VM_DENY_IP="10.0.0.12"
echo ${VM_ALLOW_IP}
echo ${VM_DENY_IP}
# create client 1 vm
gcloud compute instances create vm-allow \
  --machine-type=e2-micro \
  --zone=${ZONE_1} \
  --subnet=subnet-foo-1 \
  --no-address \
  --private-network-ip=${VM_ALLOW_IP} \
  --scopes=cloud-platform \
  --shielded-secure-boot
# create client 2 vm
gcloud compute instances create vm-deny \
  --machine-type=e2-micro \
  --zone=${ZONE_1} \
  --subnet=subnet-foo-1 \
  --no-address \
  --private-network-ip=${VM_DENY_IP} \
  --scopes=cloud-platform \
  --shielded-secure-boot

Test temel hizmeti

vm-allow adlı müşteriden gelen test

NOT: Sanal makine örnekleri, instances create komutları verildikten kısa süre sonra IAP kullanılarak ssh üzerinden çevrimiçi hale gelir ve erişilebilir. İstek ilk denemede başarısız olursa bir süre beklemeniz gerekebilir.

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

Yük dengeleyici üzerinden Google Cloud Storage'a dosya yüklemeyi test edin.

# send request to foo gcs service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  echo 'test one on the way' > test-upload-1.txt
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k -X POST \"https://gcs.foo.com/upload/storage/v1/b/${BUCKET}/o?uploadType=media&name=test-upload-object-1.txt\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -H \"Content-Type: text/plain\" \
  --data-binary @test-upload-1.txt"

Cloud Storage API yanıtı, ağ yolunun düzgün çalıştığını onaylar.

vm-deny adlı müşteriden gelen test

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"
# send request to foo gcs service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  echo 'test two on the way' > test-upload-2.txt
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k -X POST \"https://gcs.foo.com/upload/storage/v1/b/${BUCKET}/o?uploadType=media&name=test-upload-object-2.txt\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -H \"Content-Type: text/plain\" \
  --data-binary @test-upload-2.txt"

NOT: Yük dengeleyiciyi henüz hedefleyen güvenlik duvarı kuralları olmadığından bu testler de başarılı olmalıdır.

Böylece, tüm temel kurulum bölümleri tamamlanmış oldu. Şimdi yük dengeleyici güvenlik duvarı kurallarını oluşturma bölümüne geçelim.

7. Yük dengeleyici güvenlik duvarı

Bu bölümde, yük dengeleyicileri hedefleyen güvenlik duvarı politikası kurallarını dağıtacaksınız. Yapılandırma sırası, vm-allow erişimine izin veren ve vm-deny trafiğini tüm hizmetlere engelleyen bir güvenlik duruşu oluşturacak şekilde ilerler.

Belirli trafiğin fr-foo-www adresine gitmesine izin ver

Mevcut güvenlik duvarı politikasına yeni bir güvenlik duvarı politika kuralı ekleyin fw-policy-foo-${REGION_1}

  • vm-allow IP adreslerini içeren ve vm-deny IP adreslerini hariç tutan bir kaynak IP aralığına izin verme
  • Yük dengeleyiciyi hedefleyen bir güvenlik duvarı politikası kuralında ağ türünden yararlanmak için ek bir kaynak filtresi INTRA_VPC ekleyin.

INTRA_VPC ve VPC_NETWORKS kaynak ağ türü, başka bir kaynak parametresiyle birlikte kullanıldığında yük dengeleyicileri hedefleyen güvenlik duvarı politikası kurallarında desteklenir. Değerlendirme mantığı, iki kaynak parametre arasında AND şeklindedir. Burada trafiğin izin verilmesi için INTRA_VPC ve --src-ip-ranges=${VM_ALLOW_IP}/32 ölçütlerini karşılaması gerekir.

vm-allow hedeflemeye fr-foo-www izin veren kural oluşturma

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2001 \
  --description="allow vm traffic to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-network-type=INTRA_VPC \
  --src-ip-ranges=${VM_ALLOW_IP}/32 \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

vm-allow adlı müşteriden gelen test

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"

vm-deny adlı müşteriden gelen test

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"

NOT: Bu işlem, yük dengeleyiciler için örtülü varsayılan güvenlik duvarı politikası kuralı davranışı --action=allow olduğu için başarılı olur. Bunu değiştirmek için varsayılan (her şeyi kapsayan) bir ret kuralı gerekir.

fr-foo-www için varsayılan trafiği reddetme

Yeni bir düşük öncelikli (yüksek öncelikli sayı) güvenlik duvarı politika kuralı ekleyin.

  • Herhangi bir kaynak IP adresinden gelen tüm trafiği reddetme
  • Reddetme kuralı uygulanmadan önce vm-allow ile fr-foo-www arasındaki trafiğe izin verilir.

fr-foo-www hedefleyen trafiği reddetme kuralı oluşturma

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2999 \
  --description="allow vm traffic to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=deny \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-ip-ranges=0.0.0.0/0 \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

Durum denetimleri için dikkat edilmesi gereken noktalar

Sanal makine örneklerini hedefleyen güvenlik duvarı politikası kurallarında olduğu gibi, varsayılan catchall (örtülü) girişi reddetme kuralı, yük dengeleyici arka uçlarını hedefleyen durum denetimi yoklama aralıklarından kaynaklanan trafiği engeller. Bu nedenle, giriş durum denetimi kontrol aralıklarına izin vermek için açık bir izin kuralı yapılandırıldı (1002 kuralına bakın).

ÖNEMLİ: Benzer şekilde, yük dengeleyici hedefleri için kapsamlı (açık) bir giriş reddetme kuralı oluştururken durum denetimi yoklama aralığından girişe izin vermek için daha yüksek öncelikli (daha düşük öncelikli sayı) başka bir kural oluşturulmalıdır. Bu kuralın yük dengeleyicileri hedeflemesi gerekir.

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2002 \
  --description="allow health checks to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

vm-deny adlı müşteriden gelen test

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"

Güvenlik duvarı kuralı 2999, VPC ağından kaynaklanan tüm trafiği reddettiğinden bu işlem artık başarısız olmalıdır. Daha yüksek öncelikli (daha düşük öncelikli sayı) kural 2001 yalnızca vm-allow değerini içeren bir kaynak aralığına izin veriyordu.

Ctrl+C tuşuna basarak curl işlemini durdurun.

# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

vm-deny, API hizmetine erişmeye devam edebilir. Bu işlem, güvenlik duvarı kuralı yalnızca yönlendirme kuralı fr-foo-www'ya özel olarak uygulandığı ve fr-foo-api'yi hedeflemediği için başarılı oldu.

Tüm yük dengeleyicileri hedeflemek için kuralları güncelleme

NOT: Güvenlik duvarı politikası kuralları, --target-forwarding-rules=FR_NAME atlanarak bir VPC ağındaki tüm yük dengeleyicilere uygulanabilir.

Güvenlik duvarı politikası kurallarını, artık VPC ağındaki tüm yük dengeleyici yönlendirme kuralı hedefleri için geçerli olacak şekilde değiştirin.

  1. Sanal makine trafiğine (vm-allow IP aralığı) izin vermek için tüm yönlendirme kurallarını hedefleyen yeni bir giriş izin verme kuralı (2003) oluşturun.
  2. Durum denetimi (uhc-probes adres grubu) trafiğine izin vermek için tüm yönlendirme kurallarını hedefleyen yeni bir giriş izin verme kuralı 2004 oluşturun.
  3. Diğer tüm trafik için tümünü yakalama reddetme olarak tüm yönlendirme kurallarını hedefleyen yeni bir giriş reddetme kuralı 2998 oluşturun.

Tüm yük dengeleyicileri hedeflemek için güvenlik duvarı kurallarını değiştirme

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2003 \
  --description="allow vm traffic to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp  \
  --src-ip-ranges=${VM_ALLOW_IP}/32 \
  --target-type=INTERNAL_MANAGED_LB
# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2004 \
  --description="allow health checks to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes \
  --target-type=INTERNAL_MANAGED_LB
# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2998 \
  --description="deny all vnet traffic to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=deny \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-ip-ranges=0.0.0.0/0 \
  --target-type=INTERNAL_MANAGED_LB

Açık yük dengeleme yönlendirme kurallarını hedefleyen önceki güvenlik duvarı politikası kuralları, artık VPC ağındaki tüm yönlendirme kurallarını hedefleyen kurallarla gereksiz hale geldiğinden kaldırılabilir.

# delete redundant fw policy rules
gcloud beta compute network-firewall-policies rules delete 2001 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud beta compute network-firewall-policies rules delete 2002 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud beta compute network-firewall-policies rules delete 2999 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

vm-deny adlı müşteriden gelen test

# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

fr-foo-api, --target-type=INTERNAL_MANAGED_LB ile tüm güvenlik duvarı politikası kuralları tarafından da hedeflendiğinden bu işlem artık başarısız olmalıdır.

Ctrl+C tuşuna basarak curl işlemini durdurun.

Yük dengeleyici üzerinden Google Cloud Storage'dan dosya indirmeyi test edin.

# send request to foo gcs service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k \"https://gcs.foo.com/storage/v1/b/${BUCKET}/o/test-upload-object.txt?alt=media\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -o test-download.txt"

Ctrl+C tuşuna basarak curl işlemini durdurun.

vm-allow adlı müşteriden gelen test

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"
# send request to foo gcs service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k \"https://gcs.foo.com/storage/v1/b/${BUCKET}/o/test-upload-object-1.txt?alt=media\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -o test-download-1.txt"

İndirilen içeriği doğrulama

# send request from vm
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  cat test-download-1.txt"

Yük dengeleyici hizmetlerinin tümü vm-allow için kullanılabilir ve vm-deny için başarıyla engellenir.

Test bölümü sona erdi. Şimdi de günlük kaydı işlemine kısaca göz atacağız.

8. Güvenlik duvarı kuralları kaydı

Güvenlik duvarı günlüğü biçiminde, yük dengeleyicileri (--target-type=INTERNAL_MANAGED_LB) hedefleyen kurallarla ilgili alanlar ve kayıtlar bulunur.

Günlüklerde, güvenlik duvarı politikası kuralının hedeflendiği yük dengeleyici hakkında daha fazla bilgi içeren load_balancer_details etiketli ek bir alan bulunur. Bu, güvenlik duvarı politikası kurallarında sanal makine örnekleri hedeflendiğinde InstanceDetails alan biçimine benzer.

  • load_balancer_details.forwarding_rule_name, güvenlik duvarı politika kuralının hedef iletme kuralını gösterir.
  • load_balancer_details.type, hangi proxy tabanlı yük dengeleyici türünün hedeflendiğini gösterir.
  • load_balancer_details.url_map_name, tür uygulama yük dengeleyici olduğunda kullanılan URL eşleme kaynağını günlüğe kaydeder.

Günlükleri göster

Güvenlik duvarı politikası kurallarının sonuçlarını görmek için güvenlik duvarı günlüklerini sorgulayın.

gcloud logging read \
  "logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Ffirewall \
  AND (jsonPayload.connection.src_ip=\"${VM_ALLOW_IP}\" OR jsonPayload.connection.src_ip=\"${VM_DENY_IP}\")" \
  --project=${PROJECT_ID} \
  --freshness=30m \
  --limit=50 \
  --format="table(
    timestamp:label=TIMESTAMP,
    jsonPayload.connection.src_ip:label=SRC_IP,
    jsonPayload.connection.src_port:label=SRC_PORT,
    jsonPayload.connection.dest_ip:label=DEST_IP,
    jsonPayload.connection.dest_port:label=DEST_PORT,
    jsonPayload.disposition:label=ACTION,
    jsonPayload.rule_details.priority:label=PRIORITY,
    jsonPayload.load_balancer_details.forwarding_rule_name:label=FWD_RULE
  )"

Günlük çıktısı, politika tarafından uygulanan geçerli kuralları gösterir:

  • Tüm yük dengeleyicilere yönelik tüm vm-allow trafiğine 2011 kuralı tarafından izin verilir.
  • Yük dengeleyicilere yönelik tüm trafik, 2998 kuralı tarafından reddediliyor
TIMESTAMP                       SRC_IP     SRC_PORT  DEST_IP     DEST_PORT  ACTION   PRIORITY  FWD_RULE
YYYY-MM-DDTHH:MM:SS.850967068Z  10.0.0.11  48480     10.0.0.103  443        ALLOWED  2003      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.418613380Z  10.0.0.11  37340     10.0.0.101  80         ALLOWED  2003      fr-foo-www
YYYY-MM-DDTHH:MM:SS.213234118Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.981484412Z  10.0.0.11  41738     10.0.0.101  80         ALLOWED  2003      fr-foo-www
YYYY-MM-DDTHH:MM:SS.189358071Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.061463883Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.965498098Z  10.0.0.12  53284     10.0.0.102  8080       DENIED   2998      fr-foo-api

Günlükler, Google Cloud Console'da Günlük Gezgini kullanılarak da görüntülenebilir. console.cloud.google.com/logs/query bölümüne gidin ve standart VPC güvenlik duvarı günlüğünü compute.googleapis.com/firewall kullanın.

logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Ffirewall

Günlüğe kaydetme bölümü sona erdi. Şimdi temizlik zamanı!

9. Temizleme

# delete client compute resources
gcloud -q compute instances delete vm-deny --zone=${ZONE_1}

gcloud -q compute instances delete vm-allow --zone=${ZONE_1}

# next
# delete load balancer resources for gcs
gcloud -q compute forwarding-rules delete fr-foo-gcs --region=${REGION_1}

gcloud -q compute target-https-proxies delete proxy-foo-gcs --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-gcs --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-gcs --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-gcs --region=${REGION_1}

# next
# delete load balancer resources for api
gcloud -q compute forwarding-rules delete fr-foo-api --region=${REGION_1}

gcloud -q compute target-http-proxies delete proxy-foo-api --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-api --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-api --region=${REGION_1}

gcloud -q compute health-checks delete hc-foo-api --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-api --region=${REGION_1}

# next
# delete load balancer resources for www
gcloud -q compute forwarding-rules delete fr-foo-www --region=${REGION_1}

gcloud -q compute target-http-proxies delete proxy-foo-www --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-www --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-www --region=${REGION_1}

gcloud -q compute health-checks delete hc-foo-www --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-www --region=${REGION_1}

# next
# delete service backend resources
gcloud -q storage rm --recursive gs://${BUCKET}

gcloud -q certificate-manager certificates delete cert-foo-gcs --location=${REGION_1}

gcloud -q compute network-endpoint-groups delete neg-psc-gcs --region=${REGION_1}

gcloud -q compute instance-groups managed delete mig-foo --region=${REGION_1}

gcloud -q compute instance-templates delete mig-template-foo --global

# next
# delete dns, nat, fw resources
gcloud -q dns record-sets delete gcs.foo.com --type=A --zone=zone-foo

gcloud -q dns record-sets delete api.foo.com --type=A --zone=zone-foo

gcloud -q dns record-sets delete www.foo.com --type=A --zone=zone-foo

gcloud -q dns managed-zones delete zone-foo

gcloud -q compute routers delete cr-nat-foo --region=${REGION_1}

gcloud -q compute network-firewall-policies associations delete \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --name=fw-policy-association-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud -q compute network-firewall-policies delete fw-policy-foo-${REGION_1} --region=${REGION_1}

gcloud -q network-security address-groups delete uhc-probes --location=${REGION_1}

# next
# delete network resources
gcloud -q compute networks subnets delete subnet-foo-3 --region=${REGION_1}

gcloud -q compute networks subnets delete subnet-foo-2 --region=${REGION_1}

gcloud -q compute networks subnets delete subnet-foo-1 --region=${REGION_1}

gcloud -q compute networks delete vnet-foo

# next
# delete shell variables and local files
unset PROJECT_ID REGION_1 ZONE_1 VM_ALLOW_IP VM_DENY_IP BUCKET

rm vm-server-startup.sh create_lbs.sh foo-gcs-key.pem foo-gcs-cert.pem

# end

10. Sonuç

Tebrikler! Yük dengeleyiciler için Cloud NGFW Essentials'ı başarıyla yapılandırdınız.

Bu geri bildirim formunu kullanarak yorum, soru veya düzeltme önerilerinizi iletebilirsiniz.

Teşekkürler!