בדף הזה מוסבר איך לכתוב קוד להגדרת מודול בהתאמה אישית באמצעות Common Expression Language (CEL) ו-YAML.
משתמשים ב-Google Cloud CLI כדי להעלות את ההגדרות של המודולים המותאמים אישית ל-Security Health Analytics.
בקובץ YAML, הגדרה של מודול בהתאמה אישית מורכבת מקבוצה מובנית של מאפיינים שמשמשים להגדרת הרכיבים הבאים של מודול בהתאמה אישית ב-Security Health Analytics:
- המשאבים לסריקה.
- לוגיקת הזיהוי שבה יש להשתמש.
- המידע שצריך לספק לצוותי האבטחה כדי שהם יוכלו להבין, לתעדף ולפתור במהירות את הבעיה שזוהתה.
המאפיינים הספציפיים שנדרשים ואלה שאופציונליים בהגדרת YAML מוסברים במאמר שלבי קידוד.
איך להימנע מיצירת גלאים מיותרים
כדי לשלוט בנפח החיפוש, מומלץ להימנע מיצירה והפעלה של מודולים שמכילים פונקציונליות מיותרת.
לדוגמה, אם יוצרים מודול מותאם אישית שבודק אם מפתחות ההצפנה לא הוחלפו אחרי 30 יום, כדאי להשבית את הגלאי המובנה של Security Health Analytics KMS_KEY_NOT_ROTATED, כי הבדיקה שלו, שמשתמשת בערך של 90 יום, תהיה מיותרת.
מידע נוסף על השבתת גלאים זמין במאמר הפעלה והשבתה של גלאים.
שלבי התכנות
אתם מקודדים את ההגדרה של מודול בהתאמה אישית עבור Security Health Analytics כסדרה של מאפייני YAML, שחלקם מכילים ביטויי CEL.
כדי לקודד מודול הגדרה בהתאמה אישית:
יוצרים קובץ טקסט עם סיומת שם הקובץ
yaml.בקובץ הטקסט, יוצרים מאפיין
resource_selectorומציינים סוג משאב אחד עד חמישה סוגי משאבים שהמודול המותאם אישית יסרוק. אי אפשר לציין סוג משאב יותר מפעם אחת בהגדרה של מודול בהתאמה אישית. לדוגמה:resource_selector: resource_types: ‐ cloudkms.googleapis.com/CryptoKey
סוגי המשאבים שאתם מציינים צריכים להיות נתמכים על ידי Security Command Center. רשימה של סוגי המשאבים הנתמכים זמינה במאמר סוגי משאבים נתמכים.
יוצרים מאפיין
predicateומציינים ביטוי CEL אחד או יותר שבודקים מאפיינים של סוגי המשאבים שצריך לסרוק. כל המאפיינים שמופיעים בביטויי ה-CEL צריכים להיות קיימים בהגדרת ה-API של כל סוג משאב שמצוין בקטעresource_selector.Google Cloud כדי להפעיל ממצא, הביטוי צריך להחזיר את הערךTRUE. לדוגמה, בביטוי הבא, רק ערכיrotationPeriodשגדולים מ-2592000sמפעילים ממצא.predicate: expression: resource.rotationPeriod > duration("2592000s")כדי לקבל עזרה בכתיבת ביטויי CEL, אפשר לעיין במקורות המידע הבאים:
- סוגי המשאבים שנתמכים. לוחצים על כל משאב כדי לראות את המאפיינים שאפשר להשתמש בהם בביטויי CEL.
- כתיבת ביטויי CEL.
- הפניה למאפיינים של משאבים ומדיניות במודולים בהתאמה אישית.
יוצרים מאפיין
descriptionשמסביר את הפגיעות או את ההגדרה השגויה שהמודול המותאם אישית מזהה. ההסבר הזה מופיע בכל מופע של ממצא כדי לעזור לחוקרים להבין את הבעיה שזוהתה. הטקסט צריך להיות מוקף במירכאות. לדוגמה:description: "The rotation period of the identified cryptokey resource exceeds 30 days, the maximum rotation period that our security guidelines allow."
יצירת נכס
recommendationשמסביר איך לפתור את הבעיה שזוהתה. ב-CLI של gcloud צריך להוסיף תו בריחה לפני תווים מסוימים, כמו מרכאות. בדוגמה הבאה מוצג שימוש בלוכסן כדי לבטל את המשמעות של כל קבוצת גרשיים:recommendation: "To fix this issue go to https://console.cloud.google.com/security/kms. Click the key-ring that contains the key. Click the key. Click \"Edit rotation period\". Then set the rotation period to at most 30 days."אם יוצרים או מעדכנים מודול בהתאמה אישית באמצעותGoogle Cloud המסוף, לא צריך להשתמש בתווי escape.
יוצרים מאפיין
severityומציינים את רמת החומרה שמוגדרת כברירת מחדל לממצאים שנוצרים על ידי המודול הזה. הערכים הנפוצים במאפייןseverityהםLOW,MEDIUM,HIGHו-CRITICAL. לדוגמה,severity: MEDIUM
אפשר גם ליצור נכס
custom_outputולציין פרטים נוספים שיוחזרו עם כל ממצא. מציינים את המידע שרוצים להחזיר כצמד אחד או יותר של שם-ערך. אפשר להחזיר את הערך של מאפיין של המשאב שנסרק או מחרוזת מילולית. צריך לציין את המאפיינים בתבניתresource.PROPERTY_NAME. מחרוזות ליטרליות צריכות להיות מוקפות במירכאות. בדוגמה הבאה מוצגת הגדרה שלcustom_outputשמחזירה גם ערך מאפיין, הערך שלrotationPeriodבמשאבCryptoKeyשנסרק, וגם מחרוזת טקסט,"Excessive rotation period for CryptoKey":custom_output: properties: - name: duration value_expression: expression: resource.rotationPeriod - name: note value_expression: expression: "'Excessive rotation period for CryptoKey'"שומרים את הקובץ במיקום שאפשר לגשת אליו באמצעות ה-CLI של gcloud.
מעלים את ההגדרה ל-Security Health Analytics באמצעות הפקודה הבאה:
gcloud scc custom-modules sha create \ --organization=organizations/ORGANIZATION_ID \ --display-name="MODULE_DISPLAY_NAME" \ --enablement-state="ENABLED" \ --custom-config-from-file=DEFINITION_FILE_NAME.yamlמחליפים את הערכים הבאים:
ORGANIZATION_IDבמזהה של הארגון ברמה העליונה של המודול המותאם אישית, או מחליפים את הדגל--organizationבאחד מהערכים--foldersאו--projectומציינים את המזהה של התיקייה או הפרויקט ברמה העליונה.MODULE_DISPLAY_NAMEעם שם שיוצג כקטגוריית הממצאים כשהמודול המותאם אישית מחזיר ממצאים. השם צריך להיות באורך של 1 עד 128 תווים, להתחיל באות קטנה ולהכיל רק תווים אלפאנומריים או קווים תחתונים.-
DEFINITION_FILE_NAMEמחליפים בנתיב ובשם הקובץ של קובץ ה-YAML שמכיל את ההגדרה של המודול בהתאמה אישית.
מידע נוסף על עבודה עם מודולים מותאמים אישית של Security Health Analytics זמין במאמר שימוש במודולים מותאמים אישית של Security Health Analytics.
סריקת זמני האחזור של מודולים חדשים בהתאמה אישית
יצירת מודול בהתאמה אישית לא מפעילה סריקה חדשה.
הכלי Security Health Analytics לא מתחיל להשתמש במודול חדש בהתאמה אישית עד שאחד מהתנאים הבאים מתקיים:
- הסריקה הראשונה של קבוצת קבצים אחרי שיוצרים את המודול בהתאמה אישית. בהתאם למועד שבו יוצרים מודול מותאם אישית בלוח הזמנים של סריקת האצווה, יכול להיות שתצטרכו להמתין עד 24 שעות לפני שמערכת Security Health Analytics תתחיל להשתמש במודול המותאם אישית.
- שינוי במשאב יעד מפעיל סריקה בזמן אמת.
דוגמה להגדרה של מודול בהתאמה אישית
בדוגמה הבאה מוצגת הגדרה מלאה של מודול בהתאמה אישית שמפעיל ממצא אם הערך של המאפיין rotationPeriod של משאב cloudkms.googleapis.com/CryptoKey גדול מ-2,592,000 שניות (30 ימים). בדוגמה מוחזרים שני ערכים אופציונליים בקטע custom_output: הערך של resource.rotationPeriod והערה כמחרוזת טקסט.
בדוגמה, שימו לב לרכיבים הבאים:
- סוג הנכס או המשאב שרוצים לבדוק מפורט בקטע
resource_selectorשמתחת לresource_types. - הבדיקה שהמודול מבצע במשאבים, לוגיקת הזיהוי שלו, מוגדרת בקטע
predicateשלפניו מופיעexpression. - שני מאפייני מקור מותאמים אישית,
durationו-violation, מוגדרים בקטעcustom_output. - ההסבר על הבעיה שזוהתה מצוין במאפיין
description. - ההנחיות לפתרון הבעיה שזוהתה מפורטות במאפיין
recommendation. בגלל שמופיעים גרשיים בהנחיות, צריך להוסיף לפני כל גרשיים תו בריחה של קו נטוי הפוך.
severity: HIGH
description: "Regular key rotation helps provide protection against
compromised keys, and limits the number of encrypted messages available
to cryptanalysis for a specific key version."
recommendation: "To fix this issue go to
https://console.cloud.google.com/security/kms. Click the key-ring that
contains the key. Click the key. Click \"Edit rotation period\". Then
set the rotation period to at most 30 days."
resource_selector:
resource_types:
- cloudkms.googleapis.com/CryptoKey
predicate:
expression: resource.rotationPeriod > duration("2592000s")
custom_output:
properties:
- name: duration
value_expression:
expression: resource.rotationPeriod
- name: violation
value_expression:
expression:
"'Excessive rotation period for CryptoKey'"
הפניה למאפייני משאבים ומדיניות במודולים בהתאמה אישית
לא משנה באיזו שיטה תשתמשו כדי ליצור מודול מותאם אישית – באמצעות Google Cloud המסוף או באמצעות כתיבת ההגדרה בעצמכם – תצטרכו להיות מסוגלים לחפש את המאפיינים שאפשר להעריך במודול המותאם אישית. בנוסף, צריך לדעת איך להפנות למאפיינים האלה בהגדרה של מודול בהתאמה אישית.
איתור המאפיינים של משאב או מדיניות
המאפיינים של משאב Google Cloud מוגדרים בהגדרת ה-API של המשאב. כדי לראות את ההגדרה הזו, לוחצים על שם המשאב בסוגי משאבים נתמכים.
אפשר למצוא את המאפיינים של מדיניות במסמכי ההפניה של IAM API. למידע על מאפיינים של מדיניות, אפשר לעיין במאמר בנושא מדיניות.
הפניה למאפיין משאב בהגדרת מודול בהתאמה אישית
כשיוצרים מודול בהתאמה אישית, כל ההפניות הישירות למאפיין של משאב שנסרק חייבות להתחיל ב-resource, ואחריו כל מאפייני ההורה ולבסוף מאפיין היעד. המאפיינים מופרדים באמצעות נקודה, בסימון נקודות בסגנון JSON.
אלה דוגמאות למאפייני משאבים ולדרכים לאחזור שלהם:
-
resourceName: מאחסן את השם המלא של משאב במאגר משאבי הענן, לדוגמה,//cloudresourcemanager.googleapis.com/projects/296605646631. resource.rotationPeriod: כאשרrotationPeriodהוא מאפיין שלresource.resource.metadata.name: כאשרnameהוא נכס משנה שלmetadata, שהוא נכס משנה שלresource.
הפניה למאפיינים של מדיניות IAM
אפשר ליצור ביטויי CEL שמעריכים את מדיניות IAM של משאב על ידי הפניה למאפייני מדיניות IAM של המשאב. המאפיינים היחידים שזמינים הם קישורים ותפקידים בתוך קישורים.
כשמפנים למאפיינים של מדיניות IAM, policy הוא המאפיין ברמה העליונה.
אלה דוגמאות למאפיינים של מדיניות IAM ואיך אפשר לאחזר אותם:
-
policy.bindings, כאשרbindingsהוא מאפיין שלpolicy. -
policy.version, כאשרversionהוא מאפיין שלpolicy.
דוגמאות נוספות זמינות במאמר דוגמאות לביטויי CEL.
כתיבת ביטויי CEL
כשיוצרים מודול בהתאמה אישית, משתמשים בביטויי CEL כדי להעריך את המאפיינים של המשאב שנסרק. אופציונלי: אפשר גם להשתמש בביטויי CEL כדי להגדיר זוגות מותאמים אישית של name-value שמחזירים מידע נוסף עם הממצאים.
בין אם אתם יוצרים מודול בהתאמה אישית במסוף Google Cloud או כותבים בעצמכם את ההגדרה של המודול בהתאמה אישית בקובץ YAML, ביטויי ה-CEL שאתם מגדירים הם זהים.
ביטויי CEL ללוגיקת זיהוי
אתם מקודדים את לוגיקת הזיהוי של מודול בהתאמה אישית באמצעות ביטויי CEL עם אופרטורים רגילים של CEL כדי להעריך את המאפיינים של המשאבים שנסרקו.
הביטויים יכולים להיות בדיקות פשוטות של ערך יחיד, או ביטויים מורכבים יותר שבודקים כמה ערכים או תנאים. בכל מקרה, הביטוי צריך להחזיר ערך בוליאני true כדי להפעיל את הממצא.
אם יוצרים מודול בהתאמה אישית במסוף Google Cloud , צריך לכתוב את הביטויים האלה בכלי לעריכת ביטויים בדף הגדרת מודול.
אם אתם מקודדים מודול בהתאמה אישית בקובץ YAML, אתם מוסיפים את הביטויים האלה במאפיין predicate.
בין אם משתמשים במסוף Google Cloud או בקובץ YAML, ביטויי CEL שמעריכים מאפייני משאבים צריכים לעמוד בכללים הבאים:
- המאפיינים שאתם מציינים בביטוי CEL צריכים להיות מאפיינים של המשאב שנסרק, כפי שמוגדר בהגדרת ה-API של סוג המשאב.
אם מודול מותאם אישית מעריך כמה סוגים של משאבים, המאפיינים שאתם מציינים בביטויי CEL צריכים להיות משותפים לכל סוג משאב שהמודול המותאם אישית מעריך.
לדוגמה, אם מגדירים מודול מותאם אישית בשם
invalid_cryptokeyשבודק שני סוגי משאבים:cloudkms.googleapis.com/CryptoKeyו-cloudkms.googleapis.com/CryptoKeyVersion, אפשר לכתוב את הביטוי הבא, כי שני סוגי המשאביםCryptoKeyו-CryptoKeyVersionכוללים את המאפייןname:predicate: resource.name.matches("projects/project1/locations/us-central1/keyRings/keyring1/cryptoKeys/.*")עם זאת, אי אפשר לציין את הביטוי הבא במודול המותאם אישית
invalid_cryptokeyכי המאפייניםimportTimeו-rotationPeriodשהביטוי מעריך לא משותפים בין שני סוגי המשאבים:predicate: resource.importTime >= timestamp("2022-10-02T15:01:23Z") || resource.rotationPeriod > duration("2592000s")כל הערכים מסוג enum בביטוי CEL צריכים להיות מיוצגים כמחרוזות. לדוגמה, הביטוי הבא הוא ביטוי תקין עבור סוג המשאב
cloudkms.googleapis.com/CryptoKeyVersion:resource.state = "PENDING_GENERATION"
התוצאה של ביטויי ה-CEL שאתם מגדירים במאפיין
predicateחייבת להיות בוליאנית. ממצא מופעל רק אם התוצאה היאtrue.
מידע נוסף על CEL זמין במאמרים הבאים:
דוגמאות לביטויי CEL
בטבלה הבאה מפורטות כמה ביטויי CEL שאפשר להשתמש בהם כדי להעריך מאפייני משאבים. אפשר להשתמש בשניהם בGoogle Cloud מסוף ובקבצים של הגדרות מודולים מותאמים אישית בפורמט YAML.
| סוג המשאב | הסבר | ביטוי CEL |
|---|---|---|
| כל משאב עם מדיניות IAM | בדיקת מדיניות IAM כדי לזהות חברים מחוץ לדומיין | !policy.bindings.all(binding, binding.members.all(m ,!m.endsWith('@gmail.com'))) |
cloudkms.googleapis.com/CryptoKey |
בדיקה של רוטציית מפתחות ב-Cloud KMS | has(resource.rotationPeriod) && resource.rotationPeriod > duration('60h') |
| כמה סוגי משאבים עם מדיניות אחת | בדיקה אם שם המשאב מתחיל ב-dev או ב-devAccess
בהתאם לסוג המשאב |
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/PROJECT_ID/regions/
REGION/disks/devAccess')) || (resource.type ==
'compute.googleapis.com/Instance ' &&
resource.name.startsWith('projects/PROJECT_ID/zones/REGION/instances/dev-')) |
compute.googleapis.com/Network |
כלל של ענן וירטואלי פרטי (VPC) לצורך התאמה בין רשתות שכנות | resource.selfLink.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default') || resource.peerings.exists(p, p.network.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/shared$')) |
cloudfunctions.googleapis.com/CloudFunction |
איך מאפשרים רק תעבורת נתונים נכנסת פנימית לפונקציית Cloud Run | has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY') |
compute.googleapis.com/Instance |
שם המשאב תואם לתבנית | resource.name.matches('^gcp-vm-(linux|windows)-v\\d+$') |
serviceusage.googleapis.com/Service |
אפשר להפעיל רק ממשקי API שקשורים לאחסון | resource.state == 'ENABLED' && !( resource.name.matches('storage-api.googleapis.com') || resource.name.matches('bigquery-json.googleapis.com') || resource.name.matches('bigquery.googleapis.com') || resource.name.matches('sql-component.googleapis.com') || resource.name.matches('spanner.googleapis.com'))
|
sqladmin.googleapis.com/Instance
|
מותרות רק כתובות IP ציבוריות שמופיעות ברשימת ההיתרים | (resource.instanceType == 'CLOUD_SQL_INSTANCE' && resource.backendType == 'SECOND_GEN' && resource.settings.ipConfiguration.ipv4Enabled ) && !(resource.ipAddresses.all(ip, ip.type != 'PRIMARY' || ip.ipAddress.matches('IP_ADDRESS'))))
|
dataproc.googleapis.com/Cluster |
בודקים אם מזהי הפרויקטים באשכול Managed Service for Apache Spark מכילים את מחרוזות המשנה testing או development | has(resource.projectId) && resource.projectId.contains('testing') || resource.projectId.contains('development') |
ביטויי CEL למאפיינים מותאמים אישית של ממצאים
אם רוצים להחזיר מידע נוסף עם כל ממצא שאפשר להשתמש בו בשאילתות חיפוש, אפשר להגדיר עד עשרה מאפיינים מותאמים אישית שיוחזרו עם הממצאים שנוצרו על ידי המודולים המותאמים אישית.
המאפיינים המותאמים אישית מופיעים במאפייני המקור של הממצא בקובץ ה-JSON שלו ובכרטיסייה Source properties (מאפייני המקור) בפרטי הממצא במסוףGoogle Cloud .
אתם מגדירים מאפיינים מותאמים אישית כצמדים של name-value.
אם יוצרים מודול מותאם אישית ב Google Cloud מסוף,
מגדירים את זוגות name-value בקטע Custom finding properties בדף Define finding details.
אם אתם מקודדים מודול בהתאמה אישית בקובץ YAML, אתם מציינים את זוגות name-value
כ-properties במאפיין custom_output.
לא משנה אם אתם משתמשים במסוף Google Cloud או בקובץ YAML, הכללים הבאים חלים:
- מציינים את הערך
nameכמחרוזת טקסט ללא סימני מירכאות. מציינים את
valueכאחת מהאפשרויות הבאות:כדי להחזיר את הערך של מאפיין, מציינים את המאפיין בפורמט הבא:
RESOURCE_TYPE.PROPERTY.PROPERTY_TO_RETURN
בדוגמה:
-
RESOURCE_TYPEיכול להיותresourceאוpolicy. PROPERTYנכס ראשי אחד או יותר של הנכס שמכיל את הערך שרוצים להחזיר.
PROPERTY_TO_RETURNהוא הנכס שמכיל את הערך שרוצים להחזיר.כדי להחזיר מחרוזת טקסט, מקיפים את המחרוזת במירכאות.
בדוגמה הבאה מוצגים שני זוגות של name-value שמוגדרים בצורה תקינה בקובץ YAML מתחת ל-custom_output:
custom_output:
properties:
- name: duration
value_expression:
expression: resource.name
- name: property_with_text
value_expression:
expression: "'Note content'"המאמרים הבאים
כדי לבדוק, לשלוח, לראות ולעדכן מודולים בהתאמה אישית, אפשר לעיין בדפים הבאים:
- כדי לבדוק מודולים מותאמים אישית, אפשר לעיין במאמר בדיקת מודולים מותאמים אישית ב-Security Health Analytics.
- במאמר יצירה וניהול של מודולים בהתאמה אישית ב-Security Health Analytics מוסבר איך מעלים, מציגים ומעדכנים מודולים בהתאמה אישית.