איסוף יומני ביקורת של NetApp Console (לשעבר BlueXP)
במאמר הזה מוסבר איך להטמיע יומני ביקורת של NetApp Console (לשעבר BlueXP) ב-Google Security Operations באמצעות Google Cloud Storage V2.
NetApp Console היא מישור בקרה מאוחד לניהול שירותי אחסון ונתונים היברידיים מרובי עננים בסביבות מקומיות ובענן. שירות הביקורת מתעד פעולות שבוצעו על ידי שירותי Console, כולל כתובות IP שמקורן, סביבות עבודה, סוכני Console שנעשה בהם שימוש ונתוני טלמטריה אחרים שמועילים לניתוח משפטי ולדרישות תאימות.
לפני שמתחילים
חשוב לוודא שמתקיימות דרישות הסף הבאות:
- מכונה של Google SecOps
- פרויקט GCP עם ממשקי Cloud Storage, Cloud Run, Pub/Sub ו-Cloud Scheduler API מופעלים
- הרשאות ליצירה ולניהול של קטגוריות ב-GCS
- הרשאות לניהול מדיניות IAM בקטגוריות GCS
- הרשאות ליצירת שירותי Cloud Run, נושאי Pub/Sub ומשימות ב-Cloud Scheduler
- הרשאת אדמין למסוף NetApp עם הרשאות ליצירת חשבונות שירות
- מספר החשבון ב-NetApp Console
הגדרת גישה ל-API של NetApp Console
כדי לאפשר ל-Google SecOps לאחזר יומני ביקורת, צריך ליצור חשבון שירות עם הרשאות מתאימות וליצור פרטי כניסה ל-API.
איך מאתרים את מזהה החשבון
- בדפדפן, עוברים אל NetApp Console.
- נכנסים באמצעות פרטי הכניסה למסוף NetApp או לאתר התמיכה של NetApp.
- לוחצים על התפריט הנפתח חשבון בחלק העליון של הדף.
- לוחצים על ניהול החשבון בחשבון שנבחר.
בקטע סקירה כללית, מעתיקים את הערך של מזהה החשבון.
יצירה של חשבון שירות
- במסוף NetApp, עוברים אל Administration > Identity and access (ניהול > זהות וגישה).
- לוחצים על חברים.
- לוחצים על הוספת חבר.
- בשדה Member Type, בוחרים באפשרות Service account.
- מזינים שם לחשבון השירות (לדוגמה,
Google SecOps Integration). משאירים את התיבה Use private key JWT authentication (שימוש באימות JWT של מפתח פרטי) לא מסומנת כדי להשתמש באימות של סוד הלקוח.
בקטע Select an organization, folder, or project (בחירת ארגון, תיקייה או פרויקט), בוחרים את הארגון.
בקטע קטגוריה, בוחרים באפשרות ארגון.
בשדה Role (תפקיד), בוחרים באפשרות Organization viewer (צפייה בארגון).
לוחצים על הוספה.
תיעוד פרטי הכניסה ל-API
אחרי שיוצרים את חשבון השירות, נפתחת תיבת דו-שיח עם פרטי הכניסה:
- Client ID: מזהה הלקוח הייחודי שלכם (לדוגמה,
TvPPs4SeM5smEElsGmdDUznljhN3YY8s) - Client Secret: מפתח ה-API Secret
- מורידים או מעתיקים את מזהה הלקוח ואת סוד הלקוח למקום מאובטח.
- לוחצים על Close.
אימות ההרשאות
כדי לוודא שלחשבון השירות יש את ההרשאות הנדרשות:
- נכנסים למסוף NetApp.
- עוברים אל ניהול > זהויות וגישה.
- לוחצים על משתתפים.
- מאתרים את חשבון השירות שיצרתם ומוודאים שיש לו את התפקיד צפייה בארגון.
- אם התפקיד לא מוקצה, לוחצים על שם חשבון השירות ומעדכנים את התפקיד לOrganization viewer.
בדיקת הגישה ל-API
לפני שממשיכים בשילוב, חשוב לבדוק את פרטי הכניסה:
# Replace with your actual credentials CLIENT_ID="your-client-id" CLIENT_SECRET="your-client-secret" ACCOUNT_ID="your-account-id" # Obtain access token TOKEN=$(curl -s -X POST "https://netapp-cloud-account.auth0.com/oauth/token" \ -H "Content-Type: application/json" \ -d '{ "grant_type": "client_credentials", "client_id": "'"${CLIENT_ID}"'", "client_secret": "'"${CLIENT_SECRET}"'", "audience": "https://api.cloud.netapp.com" }' | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") # Test audit API access curl -s -H "Authorization: Bearer ${TOKEN}" \ "https://cloudmanager.cloud.netapp.com/audit/${ACCOUNT_ID}?offset=0" \ | python3 -m json.tool
תגובה מוצלחת מחזירה אובייקט JSON שמכיל רשומות ביקורת של החשבון שצוין.
יצירת קטגוריה של Google Cloud Storage
- נכנסים למסוף Google Cloud.
- בוחרים פרויקט או יוצרים פרויקט חדש.
- בתפריט הניווט, עוברים אל Cloud Storage > Buckets.
- לוחצים על Create bucket.
ממלאים את פרטי ההגדרה הבאים:
הגדרה ערך Name your bucket (שם הקטגוריה) מזינים שם ייחודי גלובלית (לדוגמה, netapp-bluexp-audit-logs)סוג המיקום בוחרים לפי הצרכים (אזור, שני אזורים, מספר אזורים) Location בוחרים את המיקום (לדוגמה, us-central1).סוג האחסון (storage class) רגיל (מומלץ ליומנים שצריך לגשת אליהם לעיתים קרובות) בקרת גישה אחידה (מומלץ) כלי הגנה אופציונלי: הפעלת ניהול גרסאות של אובייקטים או מדיניות שמירת נתונים לוחצים על יצירה.
יצירת חשבון שירות לפונקציית Cloud Run
- במסוף GCP, עוברים אל IAM & Admin > Service Accounts.
- לוחצים על Create Service Account.
- מספקים את פרטי ההגדרה הבאים:
- שם חשבון השירות: מזינים
netapp-bluexp-collector-sa - תיאור חשבון השירות: מזינים
Service account for Cloud Run function to collect NetApp Console audit logs
- שם חשבון השירות: מזינים
- לוחצים על יצירה והמשך.
- בקטע Grant this service account access to project (מתן גישה של חשבון השירות הזה לפרויקט), מוסיפים את התפקידים הבאים:
- לוחצים על בחירת תפקיד.
- מחפשים את Storage Object Admin ולוחצים עליו.
- לוחצים על + הוספת תפקיד.
- מחפשים את האפשרות Cloud Run Invoker (הפעלת שירותים ב-Cloud Run) ולוחצים עליה.
- לוחצים על + הוספת תפקיד נוסף.
- מחפשים את האפשרות Cloud Functions Invoker (הפעלת פונקציות של Cloud Functions) ולוחצים עליה.
- לוחצים על Continue.
- לוחצים על סיום.
מתן הרשאות IAM בקטגוריית GCS
- עוברים אל Cloud Storage > Buckets (קטגוריות).
- לוחצים על שם הקטגוריה (
netapp-bluexp-audit-logs). - עוברים לכרטיסייה Permissions.
- לוחצים על הענקת גישה.
- מזינים את פרטי ההגדרה הבאים:
- הוספת ישויות מורשות: מזינים את כתובת האימייל בחשבון של חשבון השירות (
netapp-bluexp-collector-sa@PROJECT_ID.iam.gserviceaccount.com) - הקצאת תפקידים: בוחרים באפשרות אדמין של אובייקטים באחסון.
- הוספת ישויות מורשות: מזינים את כתובת האימייל בחשבון של חשבון השירות (
- לוחצים על Save.
יצירת נושא Pub/Sub
- במסוף GCP, עוברים אל Pub/Sub > Topics.
- לוחצים על יצירת נושא.
- מספקים את פרטי ההגדרה הבאים:
- מזהה הנושא: מזינים
netapp-bluexp-audit-trigger - השארת ההגדרות האחרות כברירת מחדל
- מזהה הנושא: מזינים
- לוחצים על יצירה.
יצירת פונקציית Cloud Run לאיסוף יומנים
הפונקציה Cloud Run תופעל על ידי הודעות Pub/Sub מ-Cloud Scheduler כדי לאחזר יומני ביקורת מ-NetApp Console Audit API ולכתוב אותם ב-GCS.
- במסוף GCP, נכנסים ל-Cloud Run.
- לוחצים על יצירת שירות.
- בוחרים באפשרות Function (שימוש בעורך ישיר ליצירת פונקציה).
בקטע Configure, מזינים את פרטי ההגדרה הבאים:
הגדרה ערך שם השירות netapp-bluexp-collectorאזור בוחרים אזור שתואם ל-GCS Bucket (לדוגמה, us-central1)זמן ריצה בוחרים באפשרות Python 3.12 ואילך. בקטע טריגר (אופציונלי):
- לוחצים על + הוספת טריגר.
- בוחרים באפשרות Cloud Pub/Sub.
- בקטע Select a Cloud Pub/Sub topic, בוחרים באפשרות
netapp-bluexp-audit-trigger. - לוחצים על Save.
בקטע Authentication:
- לוחצים על דרישת אימות.
- בודקים את ניהול זהויות והרשאות גישה (IAM).
גוללים למטה ומרחיבים את Containers, Networking, Security (מאגרי תגים, רשתות, אבטחה).
עוברים לכרטיסייה אבטחה:
- חשבון שירות: בוחרים באפשרות
netapp-bluexp-collector-sa
- חשבון שירות: בוחרים באפשרות
עוברים לכרטיסייה מאגרי תגים:
- לוחצים על Variables & Secrets (משתנים וסודות).
- לוחצים על + הוספת משתנה לכל משתנה סביבתי:
שם משתנה ערך לדוגמה תיאור GCS_BUCKETnetapp-bluexp-audit-logsשם קטגוריית GCS GCS_PREFIXnetapp-bluexp-auditקידומת לקובצי יומן STATE_KEYnetapp-bluexp-audit/state.jsonנתיב קובץ תמונת מצב NETAPP_CLIENT_IDyour-client-idמזהה הלקוח של חשבון השירות ב-NetApp Console NETAPP_CLIENT_SECRETyour-client-secretסוד הלקוח של חשבון השירות ב-NetApp Console NETAPP_ACCOUNT_IDaccount-AbCdEfGhמספר החשבון ב-NetApp Console MAX_RECORDS5000מספר הרשומות המקסימלי בכל הפעלה LOOKBACK_HOURS24תקופת המבט לאחור הראשונית בקטע Variables & Secrets, גוללים למטה אל Requests:
- זמן קצוב לתפוגת בקשה: מזינים
600שניות (10 דקות)
- זמן קצוב לתפוגת בקשה: מזינים
עוברים לכרטיסייה הגדרות:
- בקטע Resources:
- זיכרון: בוחרים באפשרות 512MiB או יותר
- מעבד (CPU): בוחרים באפשרות 1.
- בקטע Resources:
בקטע Revision scaling:
- מספר מינימלי של מופעים: מזינים
0 - Maximum number of instances: מזינים
100
- מספר מינימלי של מופעים: מזינים
לוחצים על יצירה.
ממתינים ליצירת השירות (1-2 דקות).
אחרי שיוצרים את השירות, עורך הקוד המוטבע נפתח באופן אוטומטי.
הוספת קוד פונקציה
- מזינים main בשדה Entry point.
בעורך הקוד המוטבע, יוצרים שני קבצים:
- main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone, timedelta import time http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) storage_client = storage.Client() GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'netapp-bluexp-audit') STATE_KEY = os.environ.get('STATE_KEY', 'netapp-bluexp-audit/state.json') NETAPP_CLIENT_ID = os.environ.get('NETAPP_CLIENT_ID') NETAPP_CLIENT_SECRET = os.environ.get('NETAPP_CLIENT_SECRET') NETAPP_ACCOUNT_ID = os.environ.get('NETAPP_ACCOUNT_ID') MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '5000')) LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24')) TOKEN_URL = 'https://netapp-cloud-account.auth0.com/oauth/token' API_BASE = 'https://cloudmanager.cloud.netapp.com' AUDIENCE = 'https://api.cloud.netapp.com' def to_unix_millis(dt): if dt.tzinfo is None: dt = dt.replace(tzinfo=timezone.utc) dt = dt.astimezone(timezone.utc) return int(dt.timestamp() * 1000) def parse_datetime(value): if value.endswith('Z'): value = value[:-1] + '+00:00' return datetime.fromisoformat(value) def get_access_token(): body = json.dumps({ 'grant_type': 'client_credentials', 'client_id': NETAPP_CLIENT_ID, 'client_secret': NETAPP_CLIENT_SECRET, 'audience': AUDIENCE, }).encode('utf-8') response = http.request( 'POST', TOKEN_URL, body=body, headers={'Content-Type': 'application/json'} ) if response.status != 200: raise Exception( f"Token request failed: {response.status} - " f"{response.data.decode('utf-8')}" ) data = json.loads(response.data.decode('utf-8')) token = data.get('access_token') if not token: raise Exception('No access_token in token response') print('Successfully obtained NetApp Console access token') return token @functions_framework.cloud_event def main(cloud_event): if not all([GCS_BUCKET, NETAPP_CLIENT_ID, NETAPP_CLIENT_SECRET, NETAPP_ACCOUNT_ID]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) state = load_state(bucket) now = datetime.now(timezone.utc) if isinstance(state, dict) and state.get('last_event_time'): try: last_val = state['last_event_time'] if last_val.endswith('Z'): last_val = last_val[:-1] + '+00:00' last_time = datetime.fromisoformat(last_val) last_time = last_time - timedelta(minutes=2) except Exception as e: print(f'Warning: Could not parse last_event_time: {e}') last_time = now - timedelta(hours=LOOKBACK_HOURS) else: last_time = now - timedelta(hours=LOOKBACK_HOURS) print(f'Fetching audit logs from {last_time.isoformat()} to {now.isoformat()}') token = get_access_token() records, newest_time = fetch_audit_logs(token, last_time, now) if not records: print('No new audit records found.') save_state(bucket, now.isoformat()) return timestamp = now.strftime('%Y%m%d_%H%M%S') object_key = f'{GCS_PREFIX}/netapp_bluexp_audit_{timestamp}.ndjson' blob = bucket.blob(object_key) ndjson = '\n'.join( [json.dumps(r, ensure_ascii=False, default=str) for r in records] ) + '\n' blob.upload_from_string(ndjson, content_type='application/x-ndjson') print(f'Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}') save_state(bucket, newest_time if newest_time else now.isoformat()) print(f'Successfully processed {len(records)} audit records') except Exception as e: print(f'Error processing audit logs: {str(e)}') raise def fetch_audit_logs(token, start_time, end_time): endpoint = f'{API_BASE}/audit/{NETAPP_ACCOUNT_ID}' headers = { 'Authorization': f'Bearer {token}', 'Accept': 'application/json', 'User-Agent': 'GoogleSecOps-NetAppBlueXPCollector/1.0', } start_millis = to_unix_millis(start_time) end_millis = to_unix_millis(end_time) records = [] newest_time = None offset = 0 page_num = 0 backoff = 1.0 while True: page_num += 1 if len(records) >= MAX_RECORDS: print(f'Reached max_records limit ({MAX_RECORDS})') break url = ( f'{endpoint}' f'?fromLastModified={start_millis}' f'&toLastModified={end_millis}' f'&offset={offset}' ) try: response = http.request('GET', url, headers=headers) if response.status == 429: retry_after = int(response.headers.get('Retry-After', str(int(backoff)))) print(f'Rate limited (429). Retrying after {retry_after}s...') time.sleep(retry_after) backoff = min(backoff * 2, 30.0) continue backoff = 1.0 if response.status != 200: print(f'HTTP Error: {response.status}') response_text = response.data.decode('utf-8') print(f'Response body: {response_text}') return [], None data = json.loads(response.data.decode('utf-8')) page_results = data.get('auditEntries', []) if not page_results: print('No more results (empty page)') break print(f'Page {page_num}: Retrieved {len(page_results)} audit records') records.extend(page_results) for entry in page_results: try: last_modified = entry.get('lastModified') if last_modified: entry_dt = datetime.fromtimestamp( last_modified / 1000, tz=timezone.utc ) entry_time = entry_dt.isoformat() if newest_time is None or parse_datetime(entry_time) > parse_datetime(newest_time): newest_time = entry_time except Exception as e: print(f'Warning: Could not parse entry time: {e}') count = data.get('count', len(page_results)) if count < 100: print(f'Reached last page (count={count})') break offset += count except Exception as e: print(f'Error fetching audit logs: {e}') return [], None print(f'Retrieved {len(records)} total audit records from {page_num} pages') return records, newest_time def load_state(bucket): try: blob = bucket.blob(STATE_KEY) if blob.exists(): return json.loads(blob.download_as_text()) except Exception as e: print(f'Warning: Could not load state: {e}') return {} def save_state(bucket, last_event_time_iso): try: state = { 'last_event_time': last_event_time_iso, 'last_run': datetime.now(timezone.utc).isoformat(), } blob = bucket.blob(STATE_KEY) blob.upload_from_string( json.dumps(state, indent=2), content_type='application/json' ) print(f'Saved state: last_event_time={last_event_time_iso}') except Exception as e: print(f'Warning: Could not save state: {e}')- requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0לוחצים על Deploy כדי לשמור ולפרוס את הפונקציה.
ממתינים לסיום הפריסה (2-3 דקות).
יצירת משימה ב-Cloud Scheduler
Cloud Scheduler יפרסם הודעות בנושא Pub/Sub במרווחי זמן קבועים, ויפעיל את הפונקציה של Cloud Run.
- במסוף GCP, עוברים אל Cloud Scheduler.
- לוחצים על Create Job (יצירת משימה).
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך שם netapp-bluexp-collector-hourlyאזור בחירה באותו אזור כמו פונקציית Cloud Run תדירות 0 * * * *(כל שעה, בשעה עגולה)אזור זמן בחירת אזור זמן (מומלץ לבחור UTC) סוג הטירגוט Pub/Sub נושא בחירת netapp-bluexp-audit-triggerגוף ההודעה {}(אובייקט JSON ריק)לוחצים על יצירה.
אפשרויות לתדירות התזמון
בחירת התדירות בהתאם לנפח היומן ולדרישות זמן האחזור:
| תדירות | ביטוי Cron | תרחיש לדוגמה |
|---|---|---|
| כל 5 דקות | */5 * * * * |
נפח גבוה, זמן אחזור קצר |
| כל 15 דקות | */15 * * * * |
נפח חיפושים בינוני |
| כל שעה | 0 * * * * |
רגיל (מומלץ) |
| כל 6 שעות | 0 */6 * * * |
נפח נמוך, עיבוד באצווה |
| יומי | 0 0 * * * |
איסוף נתונים היסטוריים |
בדיקת השילוב
- במסוף Cloud Scheduler, מאתרים את המשימה (
netapp-bluexp-collector-hourly). - לוחצים על Force run כדי להפעיל את המשימה באופן ידני.
- מחכים כמה שניות.
- עוברים אל Cloud Run > Services.
- לוחצים על
netapp-bluexp-collector. - לוחצים על הכרטיסייה Logs.
מוודאים שהפונקציה בוצעה בהצלחה. מחפשים:
Fetching audit logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00 Successfully obtained NetApp Console access token Page 1: Retrieved X audit records Wrote X records to gs://netapp-bluexp-audit-logs/netapp-bluexp-audit/netapp_bluexp_audit_YYYYMMDD_HHMMSS.ndjson Successfully processed X audit recordsנכנסים לדף Cloud Storage > Buckets.
לוחצים על
netapp-bluexp-audit-logs.עוברים לתיקייה
netapp-bluexp-audit/.מוודאים שנוצר קובץ
.ndjsonחדש עם חותמת הזמן הנוכחית.
אם מופיעות שגיאות ביומנים:
- HTTP 401: צריך לוודא שמשתני הסביבה
NETAPP_CLIENT_IDו-NETAPP_CLIENT_SECRETנכונים - HTTP 403: מוודאים שלחשבון השירות יש את התפקיד Organization viewer ב-NetApp Console.
- HTTP 429: הגבלת קצב של יצירת בקשות – הפונקציה תנסה שוב באופן אוטומטי עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff)
- משתני סביבה חסרים: מוודאים שכל המשתנים הנדרשים מוגדרים בפונקציית Cloud Run.
אחזור של חשבון השירות של Google SecOps
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- לוחצים על Configure a single feed (הגדרת פיד יחיד).
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
NetApp Console Audit Logs). - בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
- בוחרים באפשרות NetApp Console (לשעבר BlueXP) בתור סוג היומן.
לוחצים על קבלת חשבון שירות. תוצג כתובת האימייל בחשבון שירות ייחודי, לדוגמה:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comמעתיקים את כתובת האימייל הזו לשימוש בשלב הבא.
לוחצים על הבא.
מציינים ערכים לפרמטרים הבאים של הקלט:
כתובת ה-URL של קטגוריית האחסון: מזינים את ה-URI של קטגוריית GCS עם נתיב הקידומת:
gs://netapp-bluexp-audit-logs/netapp-bluexp-audit/
אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם:
- אף פעם: לא נמחקים קבצים אחרי ההעברה (מומלץ לבדיקות).
- מחיקת קבצים שהועברו: מחיקת קבצים אחרי שהם הועברו בהצלחה.
מחיקת קבצים שהועברו וספריות ריקות: מחיקת קבצים וספריות ריקות אחרי שההעברה מסתיימת בהצלחה.
הגיל המקסימלי של הקובץ: כולל קבצים ששונו במספר הימים האחרון (ברירת המחדל היא 180 ימים)
מרחב השמות של הנכס: מרחב השמות של הנכס
תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
לוחצים על הבא.
בודקים את הגדרות הפיד החדש במסך סיום ולוחצים על שליחה.
הענקת הרשאות IAM לחשבון השירות של Google SecOps
- נכנסים לדף Cloud Storage > Buckets.
- לוחצים על
netapp-bluexp-audit-logs. - עוברים לכרטיסייה Permissions.
- לוחצים על הענקת גישה.
- מספקים את פרטי ההגדרה הבאים:
- Add principals (הוספת ישויות מורשות): מדביקים את כתובת האימייל בחשבון של חשבון השירות של Google SecOps
- הקצאת תפקידים: בוחרים באפשרות צפייה באובייקטים באחסון.
לוחצים על Save.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| endTime | additional.fields | התוויות מכל אחד מהם ימוזגו אם הוא לא ריק |
| responseData | additional.fields | |
| weHash | additional.fields | |
| wePublicId | additional.fields | |
| hasFailedRecord | additional.fields | |
| פעולה | additional.fields | |
| שירות | additional.fields | |
| hasRecords | additional.fields | |
| workspaceId | additional.fields | |
| lastModified | additional.fields | |
| startTime | additional.fields | |
| agentName | metadata.event_type | הערך הוא STATUS_UPDATE אם agentName לא ריק, אחרת GENERIC_EVENT |
| agentId | metadata.product_deployment_id | הערך מועתק ישירות אם הוא לא ריק |
| requestId | metadata.product_log_id | הערך מועתק ישירות אם הוא לא ריק |
| network | network | שינוי השם באופן ישיר אם הוא לא ריק |
| agentName | principal.asset.hostname | הערך מועתק ישירות אם הוא לא ריק |
| fileName | principal.file.names | אם הוא לא ריק, הוא ימוזג |
| agentName | principal.hostname | הערך מועתק ישירות אם הוא לא ריק |
| accountId | principal.resource.id | הערך מועתק ישירות אם הוא לא ריק |
| resourceName | principal.resource.name | הערך מועתק ישירות אם הוא לא ריק |
| accountId | principal.resource.product_object_id | הערך מ-accountId אם הוא לא ריק, אחרת הערך מ-resourceId אם הוא לא ריק |
| resourceId | principal.resource.product_object_id | |
| principalId | principal.user.userid | הערך מועתק ישירות אם הוא לא ריק |
| סטטוס | security_result.action | הגדרה ל-ALLOW אם הסטטוס הוא =~ (?i)SUCCESS, הגדרה ל-BLOCK אם הסטטוס הוא FAILURE או UNSUCCESSFUL_ATTEMPT |
| סטטוס | security_result.action_details | הערך מועתק ישירות אם הוא לא ריק |
| יעד | יעד | שינוי השם באופן ישיר אם הוא לא ריק |
יומן שינויים
צפייה ביומן השינויים של כלי הניתוח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.