權限提升:AlloyDB 權限過度授予

本文說明 Security Command Center 中的威脅發現項目類型。威脅偵測工具偵測到雲端資源中可能存在威脅時,就會產生威脅發現項目。如需可用威脅發現項目的完整清單,請參閱威脅發現項目索引

總覽

已將 AlloyDB for PostgreSQL 資料庫的所有權限 (或資料庫中的所有函式或程序) 授予一或多個資料庫使用者。

Event Threat Detection 是這項發現項目的來源。

回應方式

如要回應這項發現項目,請按照下列步驟操作:

步驟 1:查看調查結果詳細資料

  1. 按照「查看發現項目」一文的說明,開啟Privilege Escalation: AlloyDB Over-Privileged Grant發現項目。
  2. 在調查結果詳細資料面板的「摘要」分頁中,查看下列各節的資訊:

    • 偵測到的內容,尤其是下列欄位:
      • 資料庫顯示名稱:受影響的 AlloyDB for PostgreSQL 執行個體中的資料庫名稱。
      • 資料庫使用者名稱:授予過多權限的 PostgreSQL 使用者。
      • 資料庫查詢:執行 PostgreSQL 查詢,授予權限。
      • 資料庫權限擁有者:獲得過於寬泛權限的權限擁有者。
    • 受影響的資源,尤其是下列欄位:
      • 資源完整名稱:受影響的 AlloyDB for PostgreSQL 執行個體資源名稱。
      • 父項完整名稱:AlloyDB for PostgreSQL 執行個體的資源名稱。
      • 專案完整名稱:包含 AlloyDB for PostgreSQL 執行個體的專案。 Google Cloud
    • 相關連結,尤其是下列欄位:
      • Cloud Logging URI:記錄項目連結。
      • MITRE ATT&CK 方法:連結至 MITRE ATT&CK 文件。
  3. 如要查看發現項目的完整 JSON,請按一下「JSON」分頁標籤。

步驟 2:查看資料庫權限

  1. 連線至 AlloyDB for PostgreSQL 執行個體
  2. 列出並顯示下列項目的存取權限
    • 資料庫。使用 \l\list 中繼指令,然後檢查「資料庫顯示名稱」 (來自步驟 1) 中列出的資料庫有哪些權限。
    • 函式或程序。使用 \df 中繼指令,並檢查在「資料庫顯示名稱」 (來自步驟 1) 中列出的資料庫內,函式或程序已指派哪些權限。

步驟 3:檢查記錄

  1. 在 Google Cloud 控制台中,按一下「Cloud Logging URI」 (來自步驟 1) 中的連結,前往「Logs Explorer」。 「記錄檔瀏覽器」頁面會顯示與相關 Cloud SQL 執行個體有關的所有記錄。
  2. 在「記錄檔探索工具」中,使用下列篩選條件檢查 PostgreSQL pgaudit 記錄,其中會記錄對資料庫執行的查詢:
    • protoPayload.request.database="var class="edit">database"

步驟 4:研究攻擊和應變方法

  1. 查看這類發現項目的 MITRE ATT&CK 架構項目: 有效帳戶:預設帳戶
  2. 如要判斷是否需要採取其他補救措施,請將調查結果與 MITRE 研究結合。

步驟 5:實作回應

下列應變計畫可能適用於這項發現,但也可能影響作業。 請仔細評估調查期間收集到的資訊,找出解決問題的最佳方式。

  • 請與具有過度授權的執行個體擁有者聯絡。
  • 在調查完成前,請考慮撤銷「資料庫受讓人」中列出的所有受讓者權限。
  • 如要限制資料庫的存取權 (來自步驟 1 的「資料庫顯示名稱」),請從受讓人 (來自步驟 1 的「資料庫受讓人」) 撤銷不必要的權限。

發現項目 JSON 範例

以下是發現項目 JSON 的範例。

{
    "finding": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
      "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
      "resource_name": "//alloydb.googleapis.com/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER/instances/INSTANCE_NAME",
      "state": "ACTIVE",
      "category": "Privilege Escalation: AlloyDB Over-Privileged Grant",
      "sourceProperties": {
        "sourceId": {
          "projectNumber": "PROJECT_NUMBER",
          "customerOrganizationNumber": "ORGANIZATION_ID"
        },
        "detectionCategory": {
          "ruleName": "alloydb_user_granted_all_permissions",
        },
        "detectionPriority": "LOW",
        "affectedResources": [
          {
            "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"
          },
          {
            "gcpResourceName": "//alloydb.googleapis.com/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER/instances/INSTANCE_NAME"
          }
        ],
        "evidence": [{
          "sourceLogId": {
            "projectId": "PROJECT_ID",
            "resourceContainer": "projects/PROJECT_ID",
            "timestamp": {
              "seconds": "0",
              "nanos": 0.0
            },
            "insertId": "INSERT_ID"
          }
        }],
        "findingId": "FINDING_ID",
        "contextUris": {
          "mitreUri": {
            "displayName": "MITRE Link",
            "url": "https://attack.mitre.org/techniques/T1078/001/"
          },
          "cloudLoggingQueryUri": [{
            "displayName": "Cloud Logging Query Link",
            "url": "LOGGING_LINK"
          }]
        }
      },
      "eventTime": "EVENT_TIMESTAMP",
      "createTime": "CREATE_TIMESTAMP",
      "severity": "LOW",
      "workflowState": "NEW",
      "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
      "mute": "UNDEFINED",
      "findingClass": "THREAT",
      "mitreAttack": {
          "primaryTactic": "PRIVILEGE_ESCALATION",
          "primaryTechniques": [
            "VALID_ACCOUNTS"
          ],
          "additionalTactics": [
            "PERSISTENCE"
          ],
          "additionalTechniques": [
            "ACCOUNT_MANIPULATION"
          ]
        },
      "database": {
        "displayName": "DATABASE_NAME",
        "userName": "USER_NAME",
        "query": "QUERY",
        "grantees": [GRANTEE],
      },
      "access": {
        "serviceName": "alloydb.googleapis.com",
        "methodName": "alloydb.instances.query"
      }
    },
    "resource": {
      "name": "//alloydb.googleapis.com/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER/instances/INSTANCE_NAME",
      "displayName": "projects/PROJECT_ID/locations/REGION/clusters/CLUSTER/instances/INSTANCE_NAME",
      "type": "google.alloydb.Instance",
      "cloudProvider": "GOOGLE_CLOUD_PLATFORM",
      "service": "alloydb.googleapis.com",
      "location": "REGION",
      "gcpMetadata": {
        "project": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
        "projectDisplayName": "PROJECT_ID",
        "parent": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
        "parentDisplayName": "PROJECT_ID",
        "folders": [
          {
            "resourceFolder": "//cloudresourcemanager.googleapis.com/folders/FOLDER_NUMBER",
            "resourceFolderDisplayName": FOLDER_NAME
          }
        ],
        "organization": "organizations/ORGANIZATION_ID"
      },
      "resourcePath": {
        "nodes": [
          {
            "nodeType": "GCP_PROJECT",
            "id": "projects/PROJECT_NUMBER",
            "displayName": "PROJECT_ID"
          },
          {
            "nodeType": "GCP_FOLDER",
            "id": "folders/FOLDER_NUMBER",
            "displayName": "FOLDER_NAME"
          },
          {
            "nodeType": "GCP_ORGANIZATION",
            "id": "organizations/ORGANIZATION_ID"
          }
        ]
      },
      "resourcePathString": "organizations/ORGANIZATION_ID/folders/FOLDER_NUMBER/projects/PROJECT_NUMBER"
    }
}

後續步驟