שאילתות SQL לתובנות אבטחה

אתם יכולים להריץ שאילתות SQL סטנדרטיות של BigQuery בדף Observability Analytics כדי לצבור ולנתח את יומני הביקורת של Cloud Logging. ניתוח של יומני הביקורת עוזר לכם לעקוב אחרי פעילויות אדמין, לעקוב אחרי הגישה לנתונים ולזהות הפרות מדיניות או פעילות חשודה במשאביGoogle Cloud .

מידע על יומני ביקורת

יש ארבעה סוגים של יומני ביקורת שאפשר לכתוב באמצעות שירותי Google Cloud:

  • יומני ביקורת של פעילות אדמין: יומני ביקורת של פעילות אדמין מתעדים קריאות ל-API או פעולות אחרות שמשנות את ההגדרות או את המטא-נתונים של המשאבים. היומנים האלה תמיד נכתבים, ואי אפשר להגדיר, להחריג או להשבית אותם.

  • יומני ביקורת של Data Access: יומני ביקורת של Data Access מתעדים קריאות ל-API שקוראות את ההגדרות או את המטא-נתונים של משאבים, וגם קריאות ל-API שמונעות על ידי משתמשים ויוצרות, משנות או קוראות נתוני משאבים שסופקו על ידי משתמשים. מכיוון שהגישה לנתונים היא פעולה נפוצה ב-API, היומנים האלה מושבתים כברירת מחדל (למעט ב-BigQuery).

  • יומני ביקורת של אירועי מערכת: יומני הביקורת של אירועי מערכת מכילים רשומות ביומן של פעולות ב-Google Cloud שמשנות את ההגדרות של המשאבים. היומנים האלה נוצרים על ידי מערכות Google, ולא על ידי פעולות של משתמשים. אי אפשר להגדיר, להחריג או להשבית את יומני הביקורת System Event.

  • יומני ביקורת של דחיית מדיניות: יומני ביקורת של דחיית מדיניות מתועדים כששירות של Google Cloud דוחה גישה למשתמש או לחשבון שירות בגלל הפרת מדיניות אבטחה. אי אפשר להשבית את היומנים האלה, אבל אפשר להשתמש במסנני החרגה כדי למנוע את האחסון שלהם ב-Logging.

מידע נוסף על יומני ביקורת זמין במאמר סקירה כללית על יומני ביקורת. לרשימה של שירותים שמשולבים עם יומני ביקורת, קראו את המאמר שירותיGoogle Cloud עם יומני ביקורת.

שימוש ביומני ביקורת כדי לזהות הפרות מדיניות או פעילות חשודה

אתם יכולים להשתמש ביומני הביקורת כדי לזהות הפרות מדיניות או פעילות חשודה:

  • כדי לזהות הרחבת הרשאות פוטנציאלית באמצעות ניהול זהויות והרשאות גישה (IAM), או התחמקות מהגנה על ידי השבתת הרישום ביומן, אתם יכולים להשתמש ביומני הביקורת של פעילות אדמין. במאמר שינויים שבוצעו בהגדרות של Logging תוכלו למצוא שאילתה לדוגמה שמזהה את התרחיש הזה.

  • כדי לזהות שימוש לרעה בממשקי API או בנתונים שמתארחים בשירותים כמו Cloud Storage או BigQuery, אתם יכולים להשתמש ביומני הביקורת של הגישה לנתונים. במאמר זיהוי שימוש גבוה ב-API על ידי חשבון משתמש מופיעה שאילתה לדוגמה שמזהה את התרחיש הזה.

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

לפני שמתחילים

  • מוודאים שיש לכם Google Cloud פרויקט, תיקייה או ארגון שיוצרים יומני ביקורת.

  • מוודאים שיש לכם גישה לתצוגה של קטגוריית היומנים שאליה מנותבים יומני הביקורת. כדי להשתמש ב-Observability Analytics, צריך לשדרג את קטגוריית היומנים. במאמר הגדרת קטגוריות של יומנים מוסבר איך יוצרים קטגוריית יומנים שמשודרגת לשימוש ב-Observability Analytics.

  • כדי לקבל את ההרשאות שדרושות ליצירת כיורים ולצפייה ביומנים, צריך לבקש מהאדמין את התפקידים הבאים ב-IAM:

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

    יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

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

  • כדי להשתמש בשאילתות שבמסמך הזה בדף Observability Analytics:

    1. נכנסים לדף Observability Analytics במסוף Google Cloud :

      כניסה לדף Observability Analytics

      אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה עם כותרת המשנה Logging.

    2. מזהים את שם הטבלה של תצוגת היומן שרוצים לשלוח אליה שאילתה.

      כדי לזהות את השם, עוברים לרשימה Log views, מאתרים את תצוגת היומן ובוחרים באפשרות Query. החלונית Query מאוכלסת בשאילתת ברירת מחדל, שכוללת את שם הטבלה של תצוגת היומן שעליה נשלחת השאילתה. שם הטבלה הוא בפורמט project_ID.region.bucket_ID.view_ID.

      למידע נוסף על הגישה לשאילתת ברירת המחדל, ראו שליחת שאילתה לתצוגת יומן.

    3. מחליפים את VIEW בשם הטבלה של תצוגת היומן שרוצים לשלוח אליה שאילתה, ואז מעתיקים את השאילתה.

    4. מדביקים את השאילתה בחלונית Query ולוחצים על Run query.

שאילתות לדוגמה

בקטע הזה מופיעות שאילתות SQL לדוגמה לשליחת שאילתות ליומני ביקורת.

שינויים בהגדרות הרישום ביומן

כדי לזהות מתי יומני הביקורת מושבתים או מתי מתבצעים שינויים בהגדרות ברירת המחדל של Logging, שולחים שאילתה ליומני הביקורת של פעילות האדמין:

SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `VIEW`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

זיהוי הפעולות הנפוצות ביותר שבוצעו בחודש האחרון

כדי לזהות אילו פעולות בוצעו הכי הרבה ב-30 הימים האחרונים, שולחים שאילתה לכל יומני הביקורת:

SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM
  `VIEW`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

השאילתה הקודמת מחפשת בכל יומני הביקורת ב-30 הימים האחרונים, ומחזירה את 100 הפעולות שבוצעו הכי הרבה פעמים עם מידע על method_name, service_name, סוג המשאב ומונה של הפעולות שבוצעו.

זיהוי תפקידים שהוקצו בחשבון שירות

כדי לזהות התחזות לחשבון שירות או תפקידים שניתנו בחשבונות שירות, שולחים שאילתה ליומני הביקורת של פעילות האדמין:

SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `VIEW`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

השאילתה הקודמת מחפשת יומני ביקורת שמתעדים תפקידים שמוקצים לחשבון משתמש בחשבון שירות. התפקיד "יצירת אסימונים בחשבון שירות" מאפשר לחשבון המשתמש להתחזות לחשבון השירות. השאילתה גם מציינת טווח זמן של שבעת הימים האחרונים, ולא כוללת מקבלי מענקים שאושרו (%@example.com).

זיהוי שימוש גבוה ב-API על ידי חשבון משתמש

כדי לזהות שימוש גבוה באופן חריג ב-API על ידי חשבון משתמש, שולחים שאילתה לכל יומני הביקורת:

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `VIEW`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

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

  • מונה של הפעולות שבוצעו.
  • הממוצע המחושב של הפעולות שבוצעו ביום.
  • הפעולות הספציפיות שבוצעו.

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