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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • כדי להשתמש בשאילתות שבמסמך הזה בדף Log Analytics, פועלים לפי השלבים הבאים:

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

      מעבר אל Log Analytics

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

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

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

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

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

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

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

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

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

כדי לזהות מתי יומני הביקורת מושבתים או מתי מתבצעים שינויים בהגדרות ברירת המחדל של הרישום ביומן, צריך להריץ שאילתה ביומני הביקורת Admin Activity:

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 גדול מהממוצע הנע בתוספת של שלוש פעמים סטיית התקן, השאילתה מציגה את המידע הבא:

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

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