Skip to content

Dry-Run Mode — Test Trước Khi Enforce

Tại sao dry-run mode là bắt buộc trong production

VPC SC là một cơ chế default deny — khi enforce, mọi cross-perimeter access không được authorize đều bị block. Trong một tổ chức lớn với hàng chục projects và hàng trăm service accounts, không ai có thể biết chắc chắn ngay từ đầu danh sách đầy đủ mọi cross-perimeter dependency cần được authorize.

Nếu bật enforce ngay lập tức mà không có bước test, một trong hai điều sẽ xảy ra:

  1. Bạn block một luồng không biết, gây outage cho production service
  2. Bạn viết quá nhiều ingress/egress rules để "an toàn" — vô hiệu hóa VPC SC

Dry-run mode giải quyết vấn đề này: nó chạy tất cả VPC SC logic như bình thường, log mọi violation, nhưng không block request nào. Đây là cách để khám phá tất cả cross-perimeter dependencies thực tế trong production trước khi chuyển sang enforce.

Internal Model: Cơ Chế Dry-Run

Shadow enforcement

Trong dry-run mode, VPC SC thực hiện full policy evaluation — kiểm tra perimeter membership, access levels, ingress/egress rules — nhưng thay vì trả về DENY response, nó:

  1. Cho phép request tiếp tục xử lý như không có VPC SC
  2. Ghi vào Cloud Audit Logs một "would-be violation" entry

Điều này có nghĩa: từ góc nhìn của application, không có gì thay đổi. Nhưng từ góc nhìn của security team, bạn có full visibility vào mọi cross-perimeter access pattern.

Request bên ngoài → Cloud Storage trong perimeter

        ├── [Dry-Run Mode]
        │   ├── Evaluate policy: VIOLATION (request không được authorize)
        │   ├── Log violation vào Cloud Audit Logs (Policy Denied log)
        │   └── ALLOW request tiếp tục (không block)

        └── [Enforce Mode]
            ├── Evaluate policy: VIOLATION
            └── DENY request (HTTP 403)

Perimeter-level dry-run vs. service-level dry-run

VPC SC hỗ trợ dry-run mode ở hai cấp độ:

Perimeter dry-run: Toàn bộ perimeter chạy ở dry-run mode. Tất cả services trong perimeter đều không bị enforce.

yaml
# Terraform: perimeter ở dry-run mode
resource "google_access_context_manager_service_perimeter" "my_perimeter" {
  name   = "accessPolicies/123/servicePerimeters/my_perimeter"
  title  = "My Perimeter"
  # use_explicit_dry_run_spec = true khi có cả spec và status
  use_explicit_dry_run_spec = true

  # Enforced configuration (nếu có)
  status {
    restricted_services = []
    resources = []
  }

  # Dry-run configuration (separate từ enforced)
  spec {
    restricted_services = [
      "storage.googleapis.com",
      "bigquery.googleapis.com",
    ]
    resources = [
      "projects/my-project-id",
    ]
    ingress_policies = []
    egress_policies  = []
  }
}

Partial dry-run: Một số services được enforce, một số khác trong dry-run. Điều này cho phép rollout từng service một — ví dụ enforce BigQuery trước, sau đó tiếp tục với Cloud Storage.

Audit Log Format cho Dry-Run Violations

Dry-run violations xuất hiện trong Cloud Audit Logs dưới dạng "Policy Denied" log entries, nhưng với một field đặc biệt để phân biệt với real denials:

json
{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "PERMISSION_DENIED"
    },
    "serviceName": "storage.googleapis.com",
    "methodName": "google.storage.v1.Storage.GetObject",
    "resourceName": "projects/_/buckets/my-protected-bucket/objects/sensitive-file",
    "metadata": {
      "@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata",
      "vpcServiceControlsUniqueId": "ABCDEF123456",     // Unique violation ID
      "resourceNames": ["projects/123456789"],
      "violationReason": "NO_MATCHING_ACCESS_LEVEL",    // Lý do violation
      // Field quan trọng nhất cho dry-run:
      "dryRun": true                                     // true = dry-run, false = real enforce
    }
  },
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "storage.googleapis.com",
      "method": "google.storage.v1.Storage.GetObject"
    }
  },
  "severity": "ERROR",
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fpolicy"
}

Field dryRun: true là cách phân biệt dry-run log với actual violation log. Cả hai đều xuất hiện trong cùng log type cloudaudit.googleapis.com/policy.

violationReason — Hiểu nguyên nhân vi phạm

Đây là field quan trọng nhất để phân tích violations:

violationReasonÝ nghĩa
NO_MATCHING_ACCESS_LEVELRequest không match bất kỳ access level nào được attach vào perimeter
NETWORK_NOT_IN_SAME_SERVICE_PERIMETERClient network và target project không trong cùng perimeter
RESOURCES_NOT_IN_SAME_SERVICE_PERIMETERRequest liên quan đến resources trong cả hai phía perimeter
SERVICE_NOT_ALLOWED_FROM_VPCVPC network client cố gọi service không được include trong perimeter
NO_MATCHING_INGRESS_SOURCEKhông có ingress rule nào match nguồn của request
NO_MATCHING_EGRESS_TARGETKhông có egress rule nào match đích của request

Query violations trong Cloud Logging

bash
# Query tất cả VPC SC violations (dry-run và real) trong 24 giờ qua
gcloud logging read \
  'protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"' \
  --project=my-project \
  --freshness=24h \
  --format=json

# Chỉ query dry-run violations
gcloud logging read \
  'protoPayload.metadata.dryRun=true AND
   protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"' \
  --project=my-project \
  --freshness=24h

# Group theo service và violation reason để phân tích pattern
# (Dùng BigQuery Log Sink để analysis tốt hơn)

Workflow Triển Khai An Toàn với Dry-Run

Đây là workflow đã được kiểm chứng trong production:

Giai đoạn 1: Thiết lập dry-run perimeter

bash
# Tạo perimeter với toàn bộ resources cần bảo vệ, nhưng ở dry-run mode
gcloud access-context-manager perimeters dry-run create MY_PERIMETER \
  --policy=POLICY_ID \
  --title="Production Data Perimeter" \
  --resources=projects/123456789 \
  --restricted-services=storage.googleapis.com,bigquery.googleapis.com \
  --ingress-policies=ingress_policies.yaml \
  --egress-policies=egress_policies.yaml

Giai đoạn 2: Theo dõi violations 1-2 tuần

Thiết lập monitoring và alerting cho violations trong dry-run mode. Một tuần thường đủ để capture các workflows định kỳ (weekly batch jobs, monthly reports).

Tạo BigQuery Log Sink để analysis dễ hơn:

bash
# Tạo log sink cho VPC SC violations vào BigQuery
gcloud logging sinks create vpc-sc-violations-sink \
  bigquery.googleapis.com/projects/my-project/datasets/vpc_sc_violations \
  --log-filter='protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"' \
  --project=my-project

Giai đoạn 3: Phân tích violations và cập nhật rules

Với data từ BigQuery, identify pattern:

  • Service accounts nào đang cần cross-perimeter access?
  • Projects nào cần được thêm vào perimeter?
  • Services nào đang bị impact?

Cập nhật ingress/egress rules để cover các legitimate use cases.

Giai đoạn 4: Enforce từng service một

Thay vì chuyển toàn bộ perimeter sang enforce mode cùng lúc, enforce từng service một:

bash
# Bắt đầu enforce BigQuery, giữ Cloud Storage ở dry-run
gcloud access-context-manager perimeters update MY_PERIMETER \
  --policy=POLICY_ID \
  --add-restricted-services=bigquery.googleapis.com

# Sau khi confirm BigQuery hoạt động tốt (1-2 ngày), enforce Cloud Storage
gcloud access-context-manager perimeters update MY_PERIMETER \
  --policy=POLICY_ID \
  --add-restricted-services=storage.googleapis.com

Giai đoạn 5: Full enforce và continuous monitoring

Sau khi enforce toàn bộ, tiếp tục monitor violations (giờ là real denials). Thiết lập alerting cho bất kỳ violation nào sau khi đã stable — có thể là dấu hiệu của unauthorized access attempt hay một dependency mới chưa được document.

Dry-Run Mode cho Organization Policies

Organization Policies cũng hỗ trợ dry-run mode, tương tự VPC SC nhưng qua một mechanism khác.

Khi tạo org policy, bạn có thể set dryRunSpec thay vì spec:

yaml
# org-policy-dry-run.yaml
name: projects/my-project/policies/compute.vmExternalIpAccess
dryRunSpec:
  rules:
    - denyAll: "TRUE"

Apply org policy dry-run:

bash
gcloud org-policies set-policy org-policy-dry-run.yaml

Violations của org policy dry-run cũng xuất hiện trong Cloud Audit Logs, dưới log type cloudaudit.googleapis.com/policy, với violation details trong protoPayload.metadata.

Chuyển từ Dry-Run sang Enforced

bash
# Đối với toàn bộ perimeter:
gcloud access-context-manager perimeters dry-run enforce MY_PERIMETER \
  --policy=POLICY_ID

# Kiểm tra trạng thái sau khi enforce:
gcloud access-context-manager perimeters describe MY_PERIMETER \
  --policy=POLICY_ID

Sau khi enforce, tiếp tục monitor. Nếu có unexpected denials, có thể:

  1. Quickly thêm ingress/egress rule mới
  2. Hoặc temporary revert về dry-run mode cho service bị ảnh hưởng trong khi điều tra

Kết Hợp Dry-Run với Policy Analyzer

Trước khi đưa ra quyết định cuối cùng về ingress/egress rules, dùng Policy Analyzer để simulate:

bash
# Kiểm tra xem một request cụ thể có bị block không
gcloud access-context-manager policies analyze \
  --organization=ORGANIZATION_ID \
  --resource=//storage.googleapis.com/projects/_/buckets/my-bucket \
  --caller-ip=203.0.113.50

Policy Analyzer cho phép bạn test policy effect mà không cần actual request — đặc biệt hữu ích khi điều tra violations đã xảy ra trong past.

References