העברה לא מורשית: הענקת הרשאות יתר ב-Cloud SQL

במסמך הזה מתואר סוג של ממצא איום ב-Security Command Center. ממצאי האיומים נוצרים על ידי מזהי איומים כשהם מזהים איום פוטנציאלי במשאבי הענן שלכם. רשימה מלאה של ממצאי האיומים הזמינים מופיעה באינדקס של ממצאי האיומים.

סקירה כללית

כל ההרשאות במסד נתונים של PostgreSQL (או כל הפונקציות או הפרוצדורות במסד נתונים) הוענקו למשתמש אחד או יותר במסד הנתונים.

המקור של הממצא הזה הוא Event Threat Detection.

איך מגיבים

כדי להגיב לממצא הזה:

שלב 1: בדיקת פרטי הממצא

  1. פותחים את הממצא Exfiltration: Cloud SQL Over-Privileged Grant כמו שמתואר בקטע בדיקת הממצאים.
  2. בכרטיסייה Summary (סיכום) בחלונית הפרטים של הממצא, בודקים את המידע בקטעים הבאים:

    • מה זוהה, במיוחד השדות הבאים:
      • השם המוצג של מסד הנתונים: השם של מסד הנתונים במכונת Cloud SQL PostgreSQL שהושפע.
      • שם המשתמש במסד הנתונים: המשתמש ב-PostgreSQL שהעניק הרשאות עודפות.
      • שאילתת מסד נתונים: שאילתת PostgreSQL שהופעלה והעניקה את ההרשאות.
      • מקבלים של הרשאות במסד הנתונים: מקבלי ההרשאות הרחבות מדי.
    • מקור המידע שהושפע, במיוחד השדות הבאים:
      • השם המלא של המשאב: שם המשאב של מופע Cloud SQL PostgreSQL שהושפע.
      • השם המלא של ההורה: שם המשאב של מופע Cloud SQL PostgreSQL.
      • השם המלא של הפרויקט: הפרויקט Google Cloud שכולל את המכונה של Cloud SQL PostgreSQL.
    • קישורים רלוונטיים, במיוחד השדות הבאים:
      • ‫Cloud Logging URI: קישור לרשומות ב-Logging.
      • שיטת MITRE ATT&CK: קישור למסמכי התיעוד של MITRE ATT&CK.
      • ממצאים קשורים: קישורים לממצאים קשורים.
  3. כדי לראות את ה-JSON המלא של הממצא, לוחצים על הכרטיסייה JSON.

שלב 2: בדיקת ההרשאות במסד הנתונים

  1. מתחברים למסד הנתונים של PostgreSQL.
  2. רשימה והצגה של הרשאות גישה לפריטים הבאים:
    • מסדי נתונים. משתמשים בפקודת המטא \l או \list ובודקים אילו הרשאות הוקצו למסד הנתונים שמופיע בשם המוצג של מסד הנתונים (משלב 1).
    • פונקציות או פרוצדורות. משתמשים בפקודת המטא \df ובודקים אילו הרשאות הוקצו לפונקציות או לפרוצדורות במסד הנתונים שמפורט בשם התצוגה של מסד הנתונים (משלב 1).

שלב 3: בדיקת היומנים

  1. במסוף Google Cloud , לוחצים על הקישור ב-Cloud Logging URI (משלב 1) כדי לעבור אל Logs Explorer. הדף Logs Explorer כולל את כל היומנים שקשורים למופע הרלוונטי של Cloud SQL.
  2. בכלי Logs Explorer, בודקים את היומנים של PostgreSQL pgaudit, שמתעדים שאילתות שהופעלו במסד הנתונים, באמצעות המסננים הבאים:
    • protoPayload.request.database="var class="edit">database"

שלב 4: מחקר על שיטות תקיפה ותגובה

  1. כדאי לעיין בערך של מסגרת MITRE ATT&CK לגבי סוג הממצא הזה: Exfiltration Over Web Service (העברה לא מורשית של נתונים דרך שירות אינטרנט).
  2. כדי לקבוע אם יש צורך בפעולות נוספות לתיקון הבעיה, כדאי לשלב את תוצאות הבדיקה עם מחקר של MITRE.

שלב 5: הטמעת התגובה

תוכנית התגובה הבאה עשויה להתאים לממצא הזה, אבל היא עלולה גם להשפיע על הפעולות. חשוב לבדוק בקפידה את המידע שאספתם במהלך הבדיקה כדי להבין מהי הדרך הטובה ביותר לפתור את הבעיות.

  • פונים לבעלים של המופע עם ההרשאות המוגזמות.
  • מומלץ לבטל את כל ההרשאות של מקבלי ההרשאות שמפורטים במקבלים של הרשאות למסד הנתונים עד לסיום הבדיקה.
  • כדי להגביל את הגישה למסד הנתונים (מתוך Database display name של Step 1), צריך לבטל הרשאות לא נחוצות מהמענקים (מתוך Database grantees של Step 1).

דוגמה למציאת JSON

הנה דוגמה ל-JSON של הממצא.

{
    "finding": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
      "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
      "resource_name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
      "state": "ACTIVE",
      "category": "Exfiltration: CloudSQL Over-Privileged Grant",
      "sourceProperties": {
        "sourceId": {
          "projectNumber": "PROJECT_NUMBER",
          "customerOrganizationNumber": "ORGANIZATION_ID"
        },
        "detectionCategory": {
          "ruleName": "cloudsql_exfil",
          "subRuleName": "user_granted_all_permissions"
        },
        "detectionPriority": "LOW",
        "affectedResources": [
          {
            "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"
          },
          {
            "gcpResourceName": "//cloudsql.googleapis.com/projects/PROJECT_ID/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/T1567/002/"
          },
          "cloudLoggingQueryUri": [{
            "displayName": "Cloud Logging Query Link",
            "url": "LOGGING_LINK"
          }],
          "relatedFindingUri": {
            "displayName": "Related CloudSQL Exfiltration findings",
            "url": "RELATED_FINDINGS_LINK"
          }
        }
      },
      "eventTime": "2022-01-19T21:36:07.901Z",
      "createTime": "2022-01-19T21:36:08.695Z",
      "severity": "LOW",
      "workflowState": "NEW",
      "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
      "mute": "UNDEFINED",
      "findingClass": "THREAT",
      "mitreAttack": {
        "primaryTactic": "EXFILTRATION",
        "primaryTechniques": ["EXFILTRATION_OVER_WEB_SERVICE"]
      },
      "database": {
        "displayName": "DATABASE_NAME",
        "userName": "USER_NAME",
        "query": "QUERY",
        "grantees": [GRANTEE],
      },
      "access": {
        "serviceName": "cloudsql.googleapis.com",
        "methodName": "cloudsql.instances.query"
      }
    },
    "resource": {
      "name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
      "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
      "projectDisplayName": "PROJECT_ID",
      "parentName": "//cloudsql.googleapis.com/projects/PROJECT_NUMBER",
      "parentDisplayName": "PROJECT_ID",
      "type": "google.cloud.sql.Instance",
      "folders": [{
        "resourceFolder": "//cloudresourcemanager.googleapis.com/folders/FOLDER_NUMBER",
        "resourceFolderDisplayName": "FOLDER_ID"
      }],
      "displayName": "INSTANCE_NAME"
    }
}

המאמרים הבאים