Prowler for security

Phan Văn HoàngPhan Văn Hoàng
20 min read

Prowler: Open-source security tool for AWS, Google Cloud Platform ...

Setup

  1. Clone git repository

     git clone https://github.com/prowler-cloud/prowler.git
    
  2. Download docker, docker-compose

     # Download docker
     sudo apt update
     sudo apt install docker.io
     sudo systemctl start docker
     sudo systemctl enable docker
    
     # Download docker-compose
     sudo apt install docker-compose
    
  3. Update file docker-compose-dev.yml

     docker-compose up -d ERROR: The Compose file './docker-compose.yml' is invalid because: 
     services.worker-beat.env_file contains {"path": "./.env", "required": false}, 
     which is an invalid type, 
     it should be a string services.api.env_file contains {"path": ".env", "required": false},
     which is an invalid type, 
     it should be a string services.postgres.env_file contains {"path": ".env", "required": false}, 
     which is an invalid type, 
     it should be a string services.ui.env_file contains {"path": ".env", "required": false}, 
     which is an invalid type, 
     it should be a string services.valkey.env_file contains {"path": ".env", "required": false}, 
     which is an invalid type, 
     it should be a string services.worker.env_file contains {"path": ".env", "required": false},
     which is an invalid type, it should be a string
    

    Nếu bị báo lỗi trên thì thực hiện update lại file như sau:

     env_file:
           - path: ./.env
             required: false            
    
                 | |
                 | |
                 | |
                 V V
     env_file:
           - ./.env
    
  4. Sau đó chạy docker-compose

     docker-compose -f docker-compose-dev.yml up -d
    

    image.png

  5. Truy cập vào trang web <public_ip>:3000

    image copy.png

Google Cloud Platform

Compute

Check for Virtual Machine Instances with Public IP Addresses

Description: Để giảm sự tấn công, compute instance không nên để public IP, hãy cấu hình các chúng nằm sau Load balancer

Prowler Scan:

prowler gcp --check compute_instance_public_ip

image1.png

image2.png

Fix:

Terraform: Xoá access_config trong network_interface

resource 'google_compute_instance' 'default' {
    ...
    network_interface {
        ...

        -  access_config {
            -    // Ephemeral public IP
        -    }
    }
    ...
}

Command Line: Xoá public-ip trên instance

gcloud compute instances delete-access-config VM_NAME --access-config-name ACCESS_CONFIG_NAME

Result:

image3.png


Ensure That Instances Are Not Configured To Use the Default Service Account

Description: Tài khoản dịch vụ mặc định của Compute Engine được gán vai trò Editor trong dự án, cho phép quyền đọc và ghi đối với hầu hết các dịch vụ của Google Cloud. Để phòng tránh việc leo thang đặc quyền trong trường hợp máy ảo (VM) bị xâm nhập, và ngăn chặn kẻ tấn công truy cập toàn bộ dự án, bạn nên tránh sử dụng tài khoản dịch vụ mặc định.

Prowler Scan:

prowler gcp --check compute_instance_default_service_account_in_use

image2.1.png

image2.2.png

Fix:

Terraform: Sử dụng service_account khác

resource "google_compute_instance" "default" {
  name         = "test"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"
+  service_account {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
-    email  = "[PROJECT_NUMBER]-compute@developer.gserviceaccount.com"
+    email  = "SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
  }
}

Command line: Cập nhật service_account

gcloud compute instances stop INSTANCE_NAME
gcloud compute instances set-service-account INSTANCE_NAME --service-account=SERVICE_ACCOUNT
gcloud compute instances start INSTANCE_NAME

Result:

image2.3.png


Ensure that the default network does not exist

Description: Default network đã tự động tạo các firewall rules và có các cấu hình mặc định.
Khuyến nghị: Nên tạo mạng riêng của bạn và xóa default network để đảm bảo kiểm soát bảo mật và cấu hình phù hợp với nhu cầu triển khai.

Prowler Scan:

prowler gcp --check compute_network_default_in_use

image3.1.png

image3.2.png

Fix:

Terraform: Set auto_create_network = false

resource 'google_project' 'my_project' {
    ...
    auto_create_network   = false
    ...
}

Command line: Xoá network default

gcloud compute networks delete default

Result:

image3.3.png


Ensure VM Disks for Critical VMs Are Encrypted With Customer-Supplied Encryption Keys (CSEK)

Description: Theo mặc định, GCP mã hóa toàn bộ dữ liệu bằng khóa mã hóa do GCP sở hữu.Nên tự quản lý encryption keys cho các VM disks nhằm tăng cường kiểm soátgiám sát bảo mật trong môi trường triển khai của bạn.

Prowler Scan:

prowler gcp --check compute_instance_encryption_with_csek_enabled

image4.1.png

image4.2.png

Fix:

Terraform: Set disk_encryption_key_raw' cho instances

resource 'google_compute_instance' 'default' {
    ...
    boot_disk {
        disk_encryption_key_raw = ENCRYPTION_KEY
    }
}

Command line:

gcloud compute disks create DISK_NAME --csek-key-file FILE_NAME.json

Result:

image4.3.png


Ensure “Block Project-Wide SSH Keys” Is Enabled for VM Instances

Description: Project-wide SSH keys được sử dụng trong phần metadata của Google Cloud. Các khóa này cho phép đăng nhập SSH vào tất cả VM instance trong dự án. Việc sử dụng khóa SSH cấp dự án giúp đơn giản hóa việc quản lý khóa, tuy nhiên nếu bị xâm phạm, sẽ gây ra rủi ro bảo mật nghiêm trọng, ảnh hưởng đến tất cả các instance trong dự án.
Solution: Nên sử dụng khóa SSH riêng cho từng instance (Instance-specific SSH keys) để giảm thiểu tấn công trong trường hợp khóa bị lộ hoặc bị khai thác trái phép.

Prowler Scan:

prowler gcp --check compute_instance_block_project_wide_ssh_keys_disabled

image5.1.png

Fix:

Terraform: Cập nhật block-project-ssh-keys = true

resource 'google_compute_instance' 'default' {
    ..
    metadata = {
        block-project-ssh-keys = true
    }
    ..
}

Command line:

gcloud compute instances add-metadata INSTANCE_NAME --metadata block-project-ssh-keys=TRUE 
--zone ZONE_OF_INSTANCE

Result:

image5.2.png


Enable VPC Flow Logs for VPC Subnets

Description: VPC Flow Logs là một tính năng cho phép bạn ghi lại thông tin về lưu lượng truy cập IP đến và đi từ các network interfaces trong các VPC Subnets (mạng con VPC) của bạn. Sau khi bạn đã tạo một flow log, bạn có thể xem và truy xuất dữ liệu của nó trong Cloud Logging.

Solution: Việc bật Flow Logs cho mọi VPC subnet quan trọng đối với doanh nghiệp là điều được khuyến nghị. Flow Logs cung cấp khả năng hiển thị vào lưu lượng mạng cho từng VM (máy ảo) bên trong subnet và có thể được sử dụng để phát hiện lưu lượng bất thường hoặc cung cấp thông tin chi tiết trong các security workflows

Prowler Scan:

prowler gcp --check compute_subnet_flow_logs_enabled

Fix:

Terraform:

resource 'google_compute_subnetwork' 'subnetwork' {
    ...
    log_config {
        aggregation_interval = 'INTERVAL_10_MIN'
        flow_sampling        = 0.5
        metadata             = 'INCLUDE_ALL_METADATA'
    }
}

Command line:

gcloud compute networks subnets update [SUBNET_NAME] --region [REGION] 
    --enable-flow-logs --logging-aggregation-interval=interval-5-sec
    --logging-flow-sampling=1 --logging-metadata=include-all

Result:


Enable Cloud DNS Logging for VPC Networks

Description: Cloud DNS Logging ghi lại các truy vấn từ các máy chủ tên (name servers) trong VPC của bạn vào Cloud logging. Các truy vấn được ghi lại có thể đến từ các máy ảo Compute Engine, các container GKE hoặc các tài nguyên GCP khác được cấp phát trong VPC.Không thể chỉ dựa vào địa chỉ IP từ VPC flow logs, đặc biệt là khi xét đến việc sử dụng IP động của tài nguyên đám mây, định tuyến máy chủ ảo HTTP (HTTP virtual host routing) và các công nghệ khác có thể che giấu tên miền DNS mà client sử dụng khỏi địa chỉ IP.

Solution: Cloud DNS Logging cung cấp khả năng quan sát các tên miền DNS được client trong VPC yêu cầu. Các nhật ký này có thể được giám sát để phát hiện các tên miền bất thường và đánh giá dựa trên thông tin tình báo về mối đe dọa (threat intelligence).

Prowler Scan:

prowler gcp --check compute_network_dns_logging_enabled

Fix:

Terraform:

resource "google_dns_policy" "LOGGING_POLICY" {
    project                   = "PROJECT-ID"
    name                      = "POLICY_NAME"

    enable_logging = true

    networks {
        network_url = data.google_compute_network.network-1.id
    }
}

Command line:

# List all VPC
gcloud compute networks list 
    --format="table[box,title='All VPC Networks'](name:label='VPC Network Name')"

# Add new DNS Policy
gcloud dns policies create enable-dns-logging --enable-logging 
    --description="Enable DNS Logging" --networks=VPC_NETWORK_NAME

# Update
gcloud dns policies update POLICY_NAME --enable-logging --networks=VPC_NETWORK_NAME

Result:


Ensure Os Login Is Enabled for a Project

Description: Việc bật osLogin đảm bảo rằng các khóa SSH dùng để kết nối tới các phiên bản máy chủ được ánh xạ với người dùng IAM. Khi thu hồi quyền truy cập của một người dùng IAM, toàn bộ các khóa SSH liên kết với người dùng đó cũng sẽ bị thu hồi.

Solution: Cơ chế này hỗ trợ quản lý cặp khóa SSH một cách tập trung và tự động, rất hữu ích trong các tình huống như phản ứng với việc khóa SSH bị xâm phạm hoặc thu hồi quyền truy cập của người dùng bên ngoài, bên thứ ba hoặc nhà cung cấp.

Prowler Scan:

prowler gcp --check compute_project_os_login_enabled

Fix:

Terraform:

resource 'google_compute_project_metadata' 'default' {
    ..
    metadata = {
        enable-oslogin = true
    }
    ..
}

Command line:

gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE

Result:


Logging

Ensure That the Log Metric Filter and Alerts Exist for Audit Configuration Changes.

Description: Các dịch vụ của Google Cloud Platform ghi lại các log nhằm trả lời các câu hỏi: “ai đã làm gì, ở đâu?” và “khi nào” trong các dự án GCP. Cloud Audit Logging lưu trữ thông tin bao gồm: danh tính của người gọi API, thời điểm thực hiện cuộc gọi API, địa chỉ IP nguồn của người gọi, các tham số yêu cầu (request parameters), và các phần tử phản hồi (response elements) được trả về bởi các dịch vụ GCP. Nhật ký kiểm toán cung cấp lịch sử các cuộc gọi API của GCP đối với một tài khoản, bao gồm cả các cuộc gọi thực hiện qua giao diện điều khiển (console), bộ SDK, công cụ dòng lệnh (CLI), và các dịch vụ GCP khác.

Solution: Việc cấu hình bộ lọc chỉ số (metric filter) và cảnh báo cho các thay đổi audit config giúp đảm bảo trạng thái audit config được duy trì ở mức khuyến nghị, từ đó đảm bảo mọi hoạt động trong dự án đều có thể được audit tại bất kỳ thời điểm nào.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_audit_configuration_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_log_metrics" {
  name        = "my_custom_metric"
  filter      = "protoPayload.methodName=\"SetIamPolicy\" AND 
                 protoPayload.serviceData.policyDelta.auditConfigDeltas:*"
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_policy" {
  display_name = "My Alert Policy"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter     = "metric.type=\"logging.googleapis.com/user/my_custom_metric\" AND 
                    resource.type=\"global\""
      duration   = "0s"
      comparison = "COMPARISON_GT"
    }
  }
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for Custom Role Changes

Description: Google Cloud IAM cung cấp các vai trò được định nghĩa sẵn (predefined roles) nhằm phân quyền truy cập chi tiết đến từng tài nguyên cụ thể trên nền tảng Google Cloud Platform, đồng thời ngăn chặn truy cập trái phép đến các tài nguyên khác. Tuy nhiên, để đáp ứng các yêu cầu đặc thù của từng tổ chức, Cloud IAM cũng cho phép tạo vai trò tùy chỉnh (custom roles).

Solution: Thiết lập bộ lọc chỉ số (metric filter) và cảnh báo (alarm) cho các hoạt động tạo, xóa và cập nhật vai trò trong hệ thống Quản lý Danh tính và Truy cập (IAM).

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_custom_role_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_custom_role_change_metric" {
  name        = "my_custom_role_change_metric"
  filter      = "resource.type=\"iam_role\" AND protoPayload.methodName =  
                \"google.iam.admin.v1.CreateRole\" OR protoPayload.methodName=
                \"google.iam.admin.v1.DeleteRole\" OR protoPayload.methodName=
                \"google.iam.admin.v1.UpdateRole\""
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_custom_role_change_policy" {
  display_name = "My Alert Policy Custom Role Change"
  combiner     = "OR"
  conditions {
    display_name = "alert_custom_role_change_policy"
    condition_threshold {
      filter     = "metric.type=\"logging.googleapis.com/user/my_custom_role_change_metric\" AND 
                    resource.type=\"global\""
      duration   = "0s"
      comparison = "COMPARISON_GT"
    }
  }
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for Cloud Storage IAM Permission Changes

Description: Việc giám sát các thay đổi quyền truy cập trên Cloud Storage Bucket có thể giúp giảm thời gian phát hiện và khắc phục các quyền không phù hợp đối với các bucket lưu trữ nhạy cảm cũng như các đối tượng bên trong bucket.

Solution: Thiết lập bộ lọc metric và cảnh báo cho các thay đổi IAM trên Cloud Storage Bucket.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_bucket_permission_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_cs_iam_permission_change_metric" {
  name        = "my_cs_iam_permission_change_metric"
  filter      = "resource.type=\"gcs_bucket\" AND protoPayload.methodName=\"storage.setIamPermissions\""
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_cs_iam_permission_change_policy" {
  display_name = "My Alert Policy CS Iam Permission Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_cs_iam_permission_change_metric\"
                         AND resource.type=\"gcs_bucket\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for VPC Network Changes

Description: Một dự án có thể chứa nhiều VPC khác nhau. Ngoài ra, cũng có thể thiết lập kết nối ngang hàng (peer connection) giữa hai VPC, cho phép lưu lượng mạng được định tuyến qua lại giữa các VPC.

Solution: Thiết lập bộ lọc metric và cảnh báo để giám sát các thay đổi trong mạng Virtual Private Cloud (VPC). Việc giám sát các thay đổi trong VPC sẽ giúp đảm bảo rằng luồng lưu lượng mạng không bị gián đoạn hoặc ảnh hưởng.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_vpc_network_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_vpc_network_change_metric" {
  name        = "my_vpc_network_change_metric"
  filter      = "resource.type=\"gce_network\" AND (protoPayload.methodName:\"compute.networks.insert\" OR protoPayload.methodName:\"compute.networks.patch\" OR protoPayload.methodName:\"compute.networks.delete\" OR protoPayload.methodName:\"compute.networks.removePeering\" OR protoPayload.methodName:\"compute.networks.addPeering\")"
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_vpc_network_change_policy" {
  display_name = "My Alert Policy VPC Network Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_vpc_network_change_metric\" AND resource.type=\"global\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
  notification_channels = [
    google_monitoring_notification_channel.email_channel.id
  ]
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for VPC Network Firewall Rule Changes

Description: Việc theo dõi các sự kiện tạo mới hoặc cập nhật quy tắc tường lửa giúp cung cấp cái nhìn sâu hơn về các thay đổi quyền truy cập mạng, đồng thời có thể rút ngắn thời gian phát hiện các hoạt động đáng ngờ.

Solution: Thiết lập bộ lọc metric và cảnh báo để giám sát các thay đổi trong quy tắc tường lửa của mạng Virtual Private Cloud (VPC).

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_vpc_firewall_rule_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_vpc_network_firewall_rule_change_metric" {
  name        = "my_vpc_network_firewall_rule_change_metric"
  filter      = "resource.type=\"gce_firewall_rule\" AND (protoPayload.methodName:\"compute.firewalls.patch\" OR protoPayload.methodName:\"compute.firewalls.insert\" OR protoPayload.methodName:\"compute.firewalls.delete\")"
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_vpc_network_firewall_rule_change_policy" {
  display_name = "My Alert Policy VPC Network Firewall Rule Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_vpc_network_firewall_rule_change_metric\" AND resource.type=\"global\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for VPC Network Route Changes

Description: Trên Google Cloud Platform (GCP), các tuyến mạng (routes) xác định đường đi của lưu lượng mạng từ một máy ảo (VM instance) đến một điểm đích khác. Điểm đích này có thể nằm trong cùng mạng VPC của tổ chức (ví dụ: một VM khác) hoặc nằm ngoài mạng đó. Mỗi tuyến bao gồm một địa chỉ đích và một điểm chuyển tiếp tiếp theo (next hop). Lưu lượng có địa chỉ IP nằm trong phạm vi đích sẽ được chuyển đến điểm next hop để truyền tải.

Solution: Khuyến nghị thiết lập bộ lọc metric và cảnh báo để giám sát các thay đổi trong bảng định tuyến của mạng Virtual Private Cloud (VPC). Việc giám sát các thay đổi trong bảng định tuyến sẽ giúp đảm bảo rằng lưu lượng mạng trong VPC luôn đi theo đúng lộ trình mong muốn.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_vpc_network_route_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_vpc_network_route_change_metric" {
  name        = "my_vpc_network_route_change_metric"
  filter      = "resource.type=\"gce_route\" AND (protoPayload.methodName:\"compute.routes.delete\" 
                 OR protoPayload.methodName:\"compute.routes.insert\")"
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_vpc_network_route_change_policy" {
  display_name = "My Alert Policy VPC Network Route Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_vpc_network_route_change_metric\"
                         AND resource.type=\"global\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
}

Result:


Ensure Log Metric Filter and Alerts Exist for Project Ownership Assignments/Changes

Description: Người dùng hoặc tài khoản dịch vụ được gán vai trò roles/Owner sẽ trở thành chủ sở hữu dự án. Chủ sở hữu dự án có toàn quyền kiểm soát đối với dự án mà vai trò đó thuộc về.

Solution: Vì chính sách IAM chứa dữ liệu kiểm soát truy cập nhạy cảm, chỉ nên cấp quyền Owner khi thành viên đó có lý do hợp lệ để quản lý IAM. Việc giới hạn số lượng người dùng có quyền quản lý IAM sẽ giúp đơn giản hóa quá trình kiểm toán khi cần thiết.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_project_ownership_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_project_ownership_change_metric" {
  name        = "my_project_ownership_change_metric"
  filter      = "(protoPayload.serviceName=\"cloudresourcemanager.googleapis.com\") AND 
                 (ProjectOwnership OR projectOwnerInvitee) OR
                 (protoPayload.serviceData.policyDelta.bindingDeltas.action=\"REMOVE\" AND
                 protoPayload.serviceData.policyDelta.bindingDeltas.role=\"roles/owner\") OR
                 (protoPayload.serviceData.policyDelta.bindingDeltas.action=\"ADD\" AND
                 protoPayload.serviceData.policyDelta.bindingDeltas.role=\"roles/owner\")"
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_project_ownership_change_policy" {
  display_name = "My Alert Policy Project Ownership Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_project_ownership_change_metric\"
                         AND resource.type=\"global\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
}

Result:


Ensure That the Log Metric Filter and Alerts Exist for SQL Instance Configuration Changes

Description: Trong dự án Google Cloud Platform (GCP), chưa có log metric filter và cảnh báo nào được thiết lập để giám sát các thay đổi cấu hình của SQL instance. Việc không giám sát các thay đổi này có thể dẫn đến việc khó phát hiện các lỗi cấu hình hoặc hành vi bất thường trên máy chủ SQL.

Solution: Nên thiết lập bộ lọc metric và cảnh báo (alarm) để giám sát các thay đổi cấu hình của SQL instance. Việc theo dõi các thay đổi này giúp giảm thời gian phát hiện và khắc phục các lỗi cấu hình trên máy chủ SQL.

Prowler Scan:

prowler gcp --check logging_log_metric_filter_and_alert_for_sql_instance_configuration_changes_enabled

Fix:

Terraform:

resource "google_logging_metric" "my_sql_instance_config_change_metric" {
  name        = "my_sql_instance_config_change_metric"
  filter      = "protoPayload.methodName=\"cloudsql.instances.update\""
  description = "..."
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

resource "google_monitoring_alert_policy" "alert_sql_instance_config_change_policy" {
  display_name = "My Alert Policy SQL Instance Configuration Change"
  combiner     = "OR"
  conditions {
    display_name = "test condition"
    condition_threshold {
      filter          = "metric.type=\"logging.googleapis.com/user/my_sql_instance_config_change_metric\"
                         AND resource.type=\"global\""
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }
}

Result:


Ensure there is at least one sink used to export copies of all the log entries

Description: Trong dự án Google Cloud Platform (GCP), không có log sink nào được cấu hình để xuất bản sao của tất cả các bản ghi nhật ký (log entries). Điều này có thể dẫn đến việc mất dữ liệu nhật ký quan trọng phục vụ kiểm toán, bảo mật hoặc phân tích sự cố.

Solution: Tạo một log sink để xuất bản sao của tất cả các bản ghi nhật ký (log entries).

Prowler Scan:

prowler gcp --check logging_sink_created

Fix:

Terraform:

resource "google_logging_project_sink" "my-sink" {
  name        = "my-gcp-sink"
  destination = "storage.googleapis.com/MY_GCP_BUCKET"
}

Command line:

gcloud logging sinks create my-gcp-sink storage.googleapis.com/MY_GCP_BUCKET

Result:


IAM

Configure Google Cloud Audit Logs to Track All Activities

Description: Đảm bảo rằng tính năng Google Cloud Audit Logs được cấu hình để theo dõi nhật ký hoạt động quản trị (Admin Activity logs) và nhật ký truy cập dữ liệu (Data Access audit logs) cho tất cả các dịch vụ và người dùng trên nền tảng Google Cloud Platform (GCP), nhằm tăng cường bảo mật truy cập tổng thể và đáp ứng các yêu cầu tuân thủ. Sau khi được cấu hình, tính năng này có thể ghi lại toàn bộ các hoạt động liên quan đến quản trị, cũng như tất cả các yêu cầu truy cập đọc và ghi đối với dữ liệu người dùng.

Prowler Scan:

prowler gcp --check iam_audit_logs_enabled

Fix:

Terraform:

resource "google_project_iam_audit_config" "project" {
  project = var.project_id
  service = "allServices"
  audit_log_config {
    log_type = "ADMIN_READ"
  }
  audit_log_config {
    log_type = "DATA_WRITE"
  }
  audit_log_config {
    log_type = "DATA_READ"
  }
}

Result:


Ensure Cloud Asset Inventory Is Enabled

Description: Đảm bảo rằng Cloud Asset Inventory đã được kích hoạt cho tất cả các dự án GCP của bạn nhằm quản lý hiệu quả lịch sử và danh mục tài nguyên đám mây. Google Cloud Asset Inventory là một dịch vụ quản lý metadata hoàn toàn do Google vận hành, cho phép bạn xem, giám sát, phân tích và khai thác thông tin chuyên sâu về các tài sản trên Google Cloud và Anthos. Cloud Asset Inventory mặc định bị vô hiệu hóa trong mỗi dự án GCP.

Prowler Scan:

prowler gcp --check iam_cloud_asset_inventory_enabled

Fix:

Terraform:

resource "google_project_service" "project" {
    project = "your-project-id"
    service = "cloudasset.googleapis.com"
}

Command line:

gcloud services enable cloudasset.googleapis.com

Result:


Ensure Service Account does not have admin privileges

Description: Đảm bảo rằng các tài khoản dịch vụ do người dùng quản lý trong Google Cloud không sử dụng các vai trò có đặc quyền (administrator), nhằm thực thi nguyên tắc phân quyền tối thiểu và ngăn chặn các thay đổi vô tình hoặc cố ý có thể dẫn đến rò rỉ hoặc mất dữ liệu. Tài khoản dịch vụ do người dùng quản lý là một danh tính mà máy ảo (VM) hoặc ứng dụng có thể sử dụng để thực hiện các yêu cầu API thay mặt bạn. Các tài khoản dịch vụ trong GCP chỉ có thể tạo, chỉnh sửa hoặc xóa tài nguyên nếu bạn cấp quyền IAM cần thiết ở cấp độ dự án hoặc tài nguyên.

Prowler Scan:

prowler gcp --check iam_sa_no_administrative_privileges

Fix:

Terraform:

resource "google_project_iam_member" "assign_custom_role_to_sa_vm" {
  project = "your-project-id"
- role    = "roles/owner","roles/editor", #admin
+ role    = "roles/CUSTOM_ROLE",
  member  = "serviceAccount:${google_service_account.sa_vm.email}"
}

Command line":

gcloud projects get-iam-policy PROJECT_ID > PATH_TO_NEWLY_CREATED_FILE
#detect the overly permissive service account and 
#delete any role containing 'admin', 'roles/owner' or 'roles/editor'
gcloud projects set-iam-policy PROJECT_ID PATH_TO_EDITED_FILE

Result:


Ensure That There Are Only GCP-Managed Service Account Keys for Each Service Account

Description: Đảm bảo rằng các tài khoản dịch vụ do người dùng quản lý trên Google Cloud Platform (GCP) đang sử dụng khóa do GCP quản lý thay vì khóa do người dùng tự quản lý để xác thực. Đối với cặp khóa do người dùng quản lý, các hoạt động liên quan đến quản lý khóa như lưu trữ, phân phối, thu hồi, khôi phục, xoay vòng khóa, cũng như bảo vệ khóa khỏi truy cập trái phép sẽ hoàn toàn do bạn chịu trách nhiệm.

Prowler Scan:

prowler gcp --check iam_sa_no_user_managed_keys

Fix:

Command line:

gcloud iam service-accounts keys delete --iam-account=SERVICE_ACCOUNT_EMAIL KEY_ID

Result:


Ensure That IAM Users Are Not Assigned the Service Account User or Service Account Token Creator Roles at Project Level

Description: Đảm bảo rằng các vai trò Service Account User và Service Account Token Creator được gán cho người dùng cụ thể đối với một tài khoản dịch vụ cụ thể trên Google Cloud Platform (GCP), thay vì gán ở cấp độ dự án, nhằm thực thi nguyên tắc quyền hạn tối thiểu (Principle of Least Privilege - POLP).

Prowler Scan:

prowler gcp --check iam_no_service_roles_at_project_level

Fix:

Terraform:

resource "google_project_iam_binding" "project"{
    project = "your-project-id"
  - role    = "roles/iam.serviceAccountUser"

    members = [
    "user:user@example.com", ]
}

resource "google_project_iam_member" "project" {
    project = "your-project-id"
  - role    = "roles/iam.serviceAccountUser"
    member  = "user:user@example.com"
}

Result:


Description: Nguyên tắc phân tách nhiệm vụ (Separation of Duties) cần được áp dụng khi phân quyền KMS. Không gán đồng thời vai trò Cloud KMS Admin với bất kỳ vai trò Encrypter/Decrypter nào. Điều này giúp ngăn chặn hành vi độc hại và tuân thủ chuẩn bảo mật.

Prowler Scan:

prowler gcp --check iam_role_kms_enforce_separation_of_duties

Fix:

Terraform: Không gán 2 quyền này cùng lúc cho 1 user

resource "google_project_iam_member" "assign_custom_role_to_sa_vm" {
  project = "your-project-id"
  role    = "roles/cloudkms.admin"
  member  = "serviceAccount:user@example.com"
}
resource "google_project_iam_member" "assign_custom_role_to_sa_vm2" {
  project = "your-project-id"
  role    = "roles/cloudkms.cryptoKeyEncrypter"
  member  = "serviceAccount:user@example.com"
}

Result:


Description: Phân tách nhiệm vụ (Separation of Duties) có nghĩa là một cá nhân không nên có đủ quyền để thực hiện một hành động độc hại. Người dùng không nên đồng thời có khả năng tạo và sử dụng tài khoản dịch vụ, vì điều này có thể dẫn đến việc truy cập vào các tài nguyên mà họ vốn dĩ không được phép truy cập.

Prowler Scan:

prowler gcp --check iam_role_sa_enforce_separation_of_duties

Fix:

Terraform: Không khai báo quyền này cùng 1 user

resource "google_project_iam_member" "assign_custom_role_to_sa_vm2" {
  project =  "your-project-id"
  role    = "roles/iam.serviceAccountAdmin"
  member  = "serviceAccount:user@example.com"
}
resource "google_project_iam_member" "assign_custom_role_to_sa_vm1" {
  project = "your-project-id"
  role    = "roles/iam.serviceAccountUser", #"roles/iam.serviceAccountTokenCreator","roles/iam.workloadIdentityUser"
  member  = "serviceAccount:user@example.com"
}

Result:


0
Subscribe to my newsletter

Read articles from Phan Văn Hoàng directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Phan Văn Hoàng
Phan Văn Hoàng