איסוף יומני ביקורת של Slack
במאמר הזה מוסבר איך להטמיע יומני ביקורת של Slack ב-Google Security Operations באמצעות פונקציות Google Cloud Run או Amazon S3 עם AWS Lambda.
יומני הביקורת של Slack מספקים תיעוד מפורט של אירועים שקשורים לאבטחה בארגון שלכם ב-Slack Enterprise Grid. בעזרת Audit Logs API אפשר לעקוב אחרי פעולות של משתמשים, כמו התחברות, הורדת קבצים, התקנת אפליקציות ושינויים אדמיניסטרטיביים, למטרות תאימות וניטור לצורכי אבטחה.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מכונה של Google SecOps.
תוכנית Slack Enterprise Grid עם גישת בעלים לארגון.
גישה מיוחדת לאחד מהבאים:
- Google Cloud (לאפשרות 1: פונקציות Cloud Run ו-Cloud Scheduler), או
- AWS (לאפשרות 2: S3, IAM, Lambda, EventBridge).
איסוף פרטי הכניסה ל-Slack
יצירת אפליקציית Slack
ה-API של יומני הביקורת ב-Slack דורש טוקן OAuth של משתמש עם היקף auditlogs:read. צריך לקבל את הטוקן הזה על ידי התקנת אפליקציה ברמת הארגון ב-Enterprise Grid, ולא ברמת סביבת העבודה.
- נכנסים ל-Slack בתור הבעלים של הארגון ב-Enterprise Grid.
- נכנסים לדף האפליקציות של Slack API.
- לוחצים על יצירת אפליקציה חדשה.
- בוחרים באפשרות מאפס.
- מספקים את פרטי ההגדרה הבאים:
- שם האפליקציה: מזינים שם תיאורי (לדוגמה,
Google SecOps Audit Integration). - בחירת סביבת עבודה לפיתוח האפליקציה: בוחרים את סביבת העבודה של Slack לפיתוח (כל סביבת עבודה בארגון).
- שם האפליקציה: מזינים שם תיאורי (לדוגמה,
- לחצו על Create App.
הגדרת היקפי ההרשאות של OAuth
- בדף ההגדרות של האפליקציה, בוחרים באפשרות OAuth & Permissions (הרשאות ו-OAuth) מתוך תפריט הניווט הימני.
- עוברים לקטע היקפים.
- בקטע User Token Scopes (לא Bot Token Scopes), לוחצים על Add an OAuth Scope.
- מוסיפים את היקף ההרשאות הבא:
auditlogs:read— ההיקף הזה מאפשר גישה ל-Audit Logs API של הארגון ב-Enterprise Grid.
- בקטע Bot Token Scopes, לוחצים על Add an OAuth Scope.
- מוסיפים את ההיקף הבא:
users:read— קיים כדי שיהיה אפשר להתקין את האפליקציה ברמת הארגון.
התקנת האפליקציה בארגון ב-Enterprise
Audit Logs API קורא אירועים מכל הארגון ב-Enterprise, ולכן צריך להתקין את האפליקציה ברמת הארגון ולא בסביבת עבודה אחת. ב-Slack יש שתי דרכים לעשות את זה. שתי השיטות יוצרות את אותו טוקן OAuth של משתמש ברמת הארגון. משתמשים באחת מהן.
אפשרות א': התקנה מהגדרות האפליקציה (אפליקציה ברמת הארגון)
זהו הנתיב מתוך הדף Developing apps for Enterprise orgs של Slack. היא לא צריכה כתובת URL להפניה אוטומטית, לא הפצה ציבורית ולא שירות אינטרנט.
- בדף ההגדרות של האפליקציה, בתפריט הניווט הימני, בוחרים באפשרות אפליקציות ברמת הארגון.
- לוחצים על הבעת הסכמה.
בהודעת האישור, לוחצים על כן, אני רוצה להצטרף.
נכנסים בתור הבעלים של הארגון ב-Enterprise.
בסרגל הניווט הימני, לוחצים על OAuth & Permissions (OAuth והרשאות).
לוחצים על Install to Organization (התקנה בארגון).
בודקים את ההרשאות הנדרשות במסך האישור ולוחצים על אישור.
אפשרות ב': הפצה ציבורית וכתובת URL שניתן לשתף
זה הנתיב מדף Audit Logs API של Slack. הפעלת ההפצה הציבורית לא מוסיפה את האפליקציה ל-Slack Marketplace, אלא רק מאפשרת להתקין אותה מחוץ לסביבת העבודה לפיתוח.
- בדף ההגדרות של האפליקציה, בוחרים באפשרות OAuth & Permissions (OAuth והרשאות) בתפריט הניווט הימני.
בקטע כתובות URL להפניה אוטומטית, לוחצים על הוספת כתובת URL חדשה להפניה אוטומטית, מזינים כתובת URL, לוחצים על הוספה ואז על שמירת כתובות ה-URL.
בתפריט הניווט הימני, לוחצים על ניהול ההפצה.
בקטע שיתוף האפליקציה עם סביבות עבודה אחרות, מוודאים שבכל ארבעת הקטעים של רשימת המשימות מופיע סימן וי ירוק. אם מופיע סימן X אדום ליד קטע מסוים, מרחיבים אותו ומשלימים את הפעולה הנדרשת.
מסמנים את תיבת הסימון בדקתי והסרתי מידע שמוטמע בקוד.
לוחצים על הפעלת הפצה ציבורית.
נכנסים בתור הבעלים של הארגון ב-Enterprise.
בקטע Share Your App with Your Workspace, מעתיקים את Sharable URL ופותחים אותה בדפדפן.
במסך ההתקנה, פותחים את התפריט הנפתח בפינה השמאלית העליונה ובוחרים באפשרות Enterprise organization, ולא בסביבת עבודה ספציפית.
בודקים את ההרשאות הנדרשות ולוחצים על אישור.
אחזור פרטי הכניסה
- בסיום ההתקנה, חוזרים לדף OAuth & Permissions.
- בקטע OAuth Tokens, מאתרים את User OAuth Token.
- האסימון מתחיל ב-
xoxp-. לוחצים על העתקה ושומרים את האסימון הזה בצורה מאובטחת.
חשוב: זהו ה-
SLACK_ADMIN_TOKENשל פונקציית Cloud Run או פונקציית Lambda. מאחסנים אותו באופן מאובטח. הוא מספק גישת קריאה לכל יומני הביקורת בארגון Enterprise Grid.רושמים את מזהה הארגון:
- פותחים את Slack בדפדפן אינטרנט באמצעות כתובת ה-URL של הארגון (לדוגמה,
acmeinc.enterprise.slack.com). - אחרי שהדף נטען, קוראים את כתובת ה-URL. הפורמט הוא
https://app.slack.com/client/EXXXXXXX/CXXXXXXX. - מעתיקים את המחרוזת שמתחילה ב-
E. זהו מזהה הארגון.
- פותחים את Slack בדפדפן אינטרנט באמצעות כתובת ה-URL של הארגון (לדוגמה,
אימות ההרשאות
כדי לוודא שלאפליקציה יש את ההרשאות הנדרשות:
- נכנסים לדף האפליקציות של Slack API.
- בוחרים את האפליקציה הרצויה.
- בתפריט הניווט הימני, לוחצים על OAuth & Permissions (הרשאות ו-OAuth).
- בקטע OAuth Tokens (טוקנים של OAuth), מוודאים שמוצג User OAuth Token (טוקן OAuth של משתמש) (מתחיל ב-
xoxp-). - בקטע Scopes, מוודאים שהערך
auditlogs:readמופיע בקטע User Token Scopes.
בדיקת הגישה ל-API
לפני שממשיכים בתהליך השילוב, בודקים את הטוקן:
SLACK_TOKEN="xoxp-your-token-here" curl -H "Authorization: Bearer $SLACK_TOKEN" \ "https://api.slack.com/audit/v1/logs?limit=1"
תגובה מוצלחת מכילה מערך entries עם אירועים ביומן הביקורת. אם מופיעה השגיאה invalid_auth או missing_scope, צריך לבדוק את האסימון ואת ההיקפים.
אפשרות 1: הגדרת ייצוא של יומני ביקורת של Slack באמצעות פונקציות Google Cloud Run
באפשרות הזו משתמשים בפונקציות של Google Cloud Run וב-Cloud Scheduler כדי לאסוף יומני ביקורת של Slack ולהטמיע אותם ישירות ב-Google SecOps באמצעות סקריפטים להטמעה של Google SecOps.
לפני שמתחילים (אפשרות 1)
ודאו שאתם עומדים בדרישות המוקדמות הנוספות הבאות:
- פרויקט ב- Google Cloud שבו מופעלים ממשקי ה-API הבאים:
- Cloud Run Admin API
- Eventarc API
- Pub/Sub API
- Cloud Scheduler API
- Secret Manager API
- הרשאות ליצירת פונקציות Cloud Run, נושאי Pub/Sub, טריגרים של Eventarc, משימות של Cloud Scheduler וסודות ב-Secret Manager.
- קובץ JSON של חשבון שירות ב-Google SecOps.
קבלת חשבון השירות של Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agents (הגדרות SIEM > סוכני איסוף).
- לוחצים על Download כדי להוריד את קובץ האימות להטמעת נתונים.
- שומרים את קובץ ה-JSON בצורה מאובטחת. תעלו את הקובץ הזה כסוד ב-Google Secret Manager.
הכנת קוד הפונקציה
מורידים את קובצי הפריסה ממאגר GitHub של Google SecOps ingestion-scripts:
- מתיקיית
slack, מורידים את:.env.ymlmain.pyrequirements.txt
מתיקיית הבסיס של המאגר, מורידים את כל הספרייה
commonעם כל הקבצים שלה.ספריית הפריסה צריכה להיות במבנה הבא:
``` deployment_directory/ ├── common/ │ ├── __init__.py │ ├── auth.py │ ├── env_constants.py │ ├── ingest.py │ ├── status.py │ └── utils.py ├── .env.yml ├── main.py └── requirements.txt ```
הגדרת סודות ב-Google Secret Manager
אחסון פרטי כניסה רגישים ב-Secret Manager כדי שפונקציית Cloud Run תוכל לגשת אליהם בצורה מאובטחת.
יצירת סוד לחשבון השירות של Google SecOps
- במסוףGoogle Cloud , עוברים אל Security > Secret Manager.
- לוחצים על Create Secret.
- מספקים את פרטי ההגדרה הבאים:
- Name: מזינים
chronicle-service-account. - Secret value: מדביקים את כל התוכן של קובץ ה-JSON של חשבון השירות של Google SecOps.
- Name: מזינים
- לוחצים על Create Secret.
מעתיקים את שם המשאב של הסוד. הפורמט הוא:
projects/PROJECT_ID/secrets/chronicle-service-account/versions/latest
יצירת סוד לטוקן של Slack
- בדף Secret Manager, לוחצים על Create Secret.
- מזינים את פרטי ההגדרה הבאים:
- שם: מזינים
slack-admin-token. - ערך סודי: מדביקים את טוקן ה-OAuth של משתמש Slack (מתחיל ב-
xoxp-).
- שם: מזינים
- לוחצים על Create Secret.
מעתיקים את שם המשאב של הסוד. הפורמט הוא:
projects/PROJECT_ID/secrets/slack-admin-token/versions/latest
הגדרת משתני סביבה
פותחים את הקובץ
.env.ymlבספריית הפריסה ומגדירים את משתני הסביבה:CHRONICLE_CUSTOMER_ID: "<your-chronicle-customer-id>" CHRONICLE_REGION: "us" CHRONICLE_SERVICE_ACCOUNT: "projects/<PROJECT_ID>/secrets/chronicle-service-account/versions/latest" CHRONICLE_NAMESPACE: "" POLL_INTERVAL: "5" SLACK_ADMIN_TOKEN: "projects/<PROJECT_ID>/secrets/slack-admin-token/versions/latest"מחליפים את מה שכתוב בשדות הבאים:
-
<your-chronicle-customer-id>: מספר הלקוח שלכם ב-Google SecOps. -
<PROJECT_ID>: מזהה הפרויקט ב- Google Cloud . -
CHRONICLE_REGION: האזור שלכם ב-Google SecOps. ערכים חוקיים:us, asia-northeast1, asia-south1, asia-southeast1, australia-southeast1, europe, europe-west2, europe-west3, europe-west6, europe-west9, europe-west12, me-central1, me-central2, me-west1, northamerica-northeast2, southamerica-east1. -
POLL_INTERVAL: מרווח התדירות (בדקות) שבו הפונקציה מופעלת. המשך הזה חייב להיות זהה למרווח הזמן של המשימה ב-Cloud Scheduler.
-
שומרים את קובץ ה-
.env.yml.
יוצרים נושא Pub/Sub
Cloud Scheduler מפעיל את פונקציית Cloud Run דרך נושא Pub/Sub.
- במסוף GCP, עוברים אל Pub/Sub > Topics.
- לוחצים על Create topic.
- בשדה Topic ID, מזינים את הערך
slack-audit-trigger. - לוחצים על יצירה.
פריסת פונקציית Cloud Run
פותחים חלון של Terminal או Cloud Shell במסוף Google Cloud . עוברים לספריית הפריסה ומריצים את הפקודה הבאה:
gcloud run deploy slack-audit-to-chronicle \ --source . \ --function main \ --base-image google-22/python312 \ --region <REGION> \ --service-account <SERVICE_ACCOUNT_EMAIL> \ --env-vars-file .env.yml \ --memory 512Mi \ --timeout 540 \ --max-instances 1 \ --no-allow-unauthenticated- מחליפים את
<REGION>באזור (לדוגמה,us-central1) ואת<SERVICE_ACCOUNT_EMAIL>בכתובת האימייל של חשבון השירות שבו רוצים להשתמש בפונקציית Cloud Run.
- מחליפים את
יוצרים את הטריגר של Pub/Sub לפונקציה:
gcloud eventarc triggers create slack-audit-trigger \ --location <REGION> \ --destination-run-service slack-audit-to-chronicle \ --destination-run-region <REGION> \ --event-filters "type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic projects/<PROJECT_ID>/topics/slack-audit-trigger \ --service-account <SERVICE_ACCOUNT_EMAIL>- מחליפים את
<PROJECT_ID>במזהה הפרויקט ב- Google Cloud .
- מחליפים את
מחכים עד שהפריסה תסתיים.
הגדרת Cloud Scheduler
- במסוף GCP, נכנסים לדף Cloud Scheduler > Create job.
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך שם slack-audit-schedulerאזור בוחרים את אותו אזור שבו פרסתם את פונקציית Cloud Run. תדירות */5 * * * *(כל 5 דקות, בהתאם לערךPOLL_INTERVAL)אזור זמן בחירת אזור זמן (מומלץ לבחור ב-UTC) לוחצים על Continue.
בקטע Configure the execution (הגדרת ההפעלה):
- Target type: בוחרים באפשרות Pub/Sub.
- נושא: בוחרים באפשרות
slack-audit-trigger. - גוף ההודעה: מזינים
run.
לוחצים על יצירה.
אפשרויות לתדירות התזמון
בוחרים את התדירות בהתאם לנפח היומן ולדרישות לגבי זמן האחזור:
| תדירות | ביטוי Cron | תרחיש לדוגמה |
|---|---|---|
| כל 5 דקות | */5 * * * * |
רגיל (מומלץ) |
| כל 15 דקות | */15 * * * * |
נפח חיפושים בינוני |
| כל שעה | 0 * * * * |
נפח החיפושים נמוך |
בדיקת השילוב (אפשרות 1)
- במסוף Cloud Scheduler, מאתרים את המשימה (
slack-audit-scheduler). - לוחצים על Force run כדי להפעיל את המשימה באופן ידני.
- מחכים כמה שניות.
- עוברים אל Cloud Run.
- לוחצים על שם השירות (
slack-audit-to-chronicle). - לוחצים על הכרטיסייה Logs.
מוודאים שהפונקציה בוצעה בהצלחה. מחפשים:
Retrieving the Slack Audit logs since: YYYY-MM-DDTHH:MM:SSZ Processing logs... Retrieved X audit logs from the API call Logs processed successfully.
אפשרות 2: הגדרת ייצוא של יומני ביקורת של Slack באמצעות AWS S3
באפשרות הזו, משתמשים ב-AWS Lambda כדי לאסוף את יומני הביקורת של Slack ולאחסן אותם ב-Amazon S3, ואז מגדירים פיד של Google SecOps כדי להטמיע את היומנים.
לפני שמתחילים (אפשרות 2)
ודאו שאתם עומדים בדרישות המוקדמות הנוספות הבאות:
- חשבון AWS עם הרשאות ליצור קטגוריות S3, משתמשים/תפקידים/כללי מדיניות של IAM, פונקציות Lambda וכללי EventBridge.
יצירת קטגוריה ב-Amazon S3
- יוצרים קטגוריה ב-Amazon S3 לפי ההוראות במדריך למשתמש Creating a bucket.
- שומרים את שם הקטגוריה ואת האזור שלה לעיון בעתיד (לדוגמה,
slack-audit-logs).
הגדרת מדיניות ותפקידים ב-IAM להעלאות ל-S3
- בכרטיסייה JSON ב-AWS Console, עוברים אל IAM > Policies > Create policy >.
מעתיקים ומדביקים את המדיניות הבאה. אם השתמשתם בשם אחר לקטגוריה, מחליפים את
slack-audit-logs:{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::slack-audit-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::slack-audit-logs/slack-audit-state.json" } ] }לוחצים על הבא.
מזינים את שם המדיניות
SlackAuditS3Policy.לוחצים על יצירת מדיניות.
עוברים אל IAM > Roles > Create role > AWS service > Lambda.
מצרפים את המדיניות החדשה שנוצרה
SlackAuditS3Policy.נותנים לתפקיד את השם
SlackAuditToS3Roleולוחצים על יצירת תפקיד.
יצירת פונקציית Lambda
- ב-AWS Console, עוברים אל Lambda > Functions > Create function.
- לוחצים על יצירה מאפס.
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך שם slack_audit_to_s3זמן ריצה Python 3.13 ארכיטקטורה x86_64 תפקיד ההרצה SlackAuditToS3Roleלוחצים על Create function.
אחרי שיוצרים את הפונקציה, פותחים את הכרטיסייה Code, מוחקים את ה-stub ומדביקים את הקוד הבא (
slack_audit_to_s3.py).#!/usr/bin/env python3 # Lambda: Pull Slack Audit Logs (Enterprise Grid) to S3 (JSONL format) import os, json, time, urllib.parse from urllib.request import Request, urlopen from urllib.error import HTTPError, URLError import boto3 BASE_URL = "https://api.slack.com/audit/v1/logs" TOKEN = os.environ["SLACK_AUDIT_TOKEN"] BUCKET = os.environ["S3_BUCKET"] PREFIX = os.environ.get("S3_PREFIX", "slack/audit/") STATE_KEY = os.environ.get("STATE_KEY", "slack-audit-state.json") LIMIT = int(os.environ.get("LIMIT", "200")) MAX_PAGES = int(os.environ.get("MAX_PAGES", "20")) LOOKBACK_SEC = int(os.environ.get("LOOKBACK_SECONDS", "3600")) HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60")) HTTP_RETRIES = int(os.environ.get("HTTP_RETRIES", "3")) RETRY_AFTER_DEFAULT = int(os.environ.get("RETRY_AFTER_DEFAULT", "2")) # Optional server-side filters (comma-separated 'action' values) ACTIONS = os.environ.get("ACTIONS", "").strip() s3 = boto3.client("s3") def _get_state() -> dict: try: obj = s3.get_object(Bucket=BUCKET, Key=STATE_KEY) st = json.loads(obj["Body"].read() or b"{}") return {"cursor": st.get("cursor")} except Exception: return {"cursor": None} def _put_state(state: dict) -> None: body = json.dumps(state, separators=(",", ":")).encode("utf-8") s3.put_object( Bucket=BUCKET, Key=STATE_KEY, Body=body, ContentType="application/json" ) def _http_get(params: dict) -> dict: qs = urllib.parse.urlencode(params, doseq=True) url = f"{BASE_URL}?{qs}" if qs else BASE_URL req = Request(url, method="GET") req.add_header("Authorization", f"Bearer {TOKEN}") req.add_header("Accept", "application/json") attempt = 0 while True: try: with urlopen(req, timeout=HTTP_TIMEOUT) as r: return json.loads(r.read().decode("utf-8")) except HTTPError as e: # Respect Retry-After on 429/5xx if e.code in (429, 500, 502, 503, 504) and attempt < HTTP_RETRIES: retry_after = 0 try: retry_after = int( e.headers.get("Retry-After", RETRY_AFTER_DEFAULT) ) except Exception: retry_after = RETRY_AFTER_DEFAULT time.sleep(max(1, retry_after)) attempt += 1 continue raise except URLError: if attempt < HTTP_RETRIES: time.sleep(RETRY_AFTER_DEFAULT) attempt += 1 continue raise def _write_page(data: dict, page_idx: int) -> str: """Extract entries from Slack API response and write as JSONL.""" entries = data.get("entries") or [] if not entries: return None lines = [json.dumps(entry, separators=(",", ":")) for entry in entries] body = "\n".join(lines).encode("utf-8") ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime()) key = f"{PREFIX}{ts}-slack-audit-p{page_idx:05d}.json" s3.put_object( Bucket=BUCKET, Key=key, Body=body, ContentType="application/json" ) return key def lambda_handler(event=None, context=None): state = _get_state() cursor = state.get("cursor") params = {"limit": LIMIT} if ACTIONS: params["action"] = [a.strip() for a in ACTIONS.split(",") if a.strip()] if cursor: params["cursor"] = cursor else: # First run (or reset): fetch a recent window by time params["oldest"] = int(time.time()) - LOOKBACK_SEC pages = 0 total = 0 last_cursor = None while pages < MAX_PAGES: data = _http_get(params) _write_page(data, pages) entries = data.get("entries") or [] total += len(entries) # Cursor for next page meta = data.get("response_metadata") or {} next_cursor = meta.get("next_cursor") or data.get("next_cursor") if next_cursor: params = {"limit": LIMIT, "cursor": next_cursor} if ACTIONS: params["action"] = [ a.strip() for a in ACTIONS.split(",") if a.strip() ] last_cursor = next_cursor pages += 1 continue break if last_cursor: _put_state({"cursor": last_cursor}) return { "ok": True, "pages": pages + (1 if total or last_cursor else 0), "entries": total, "cursor": last_cursor, } if __name__ == "__main__": print(lambda_handler())
הגדרת משתני סביבה ב-Lambda
- עוברים אל Configuration > Environment variables > Edit > Add environment variable.
מזינים את משתני הסביבה הבאים ומחליפים את הערכים בערכים שלכם:
מפתח ערך לדוגמה SLACK_AUDIT_TOKENxoxp-...(אסימון משתמש ברמת הארגון עםauditlogs:read)S3_BUCKETslack-audit-logsS3_PREFIXslack/audit/STATE_KEYslack-audit-state.jsonLIMIT200MAX_PAGES20LOOKBACK_SECONDS3600HTTP_TIMEOUT60HTTP_RETRIES3RETRY_AFTER_DEFAULT2ACTIONS(אופציונלי, מסנן פעולות מופרד בפסיקים) לוחצים על Save.
בוחרים את הכרטיסייה Configuration. בחלונית General configuration לוחצים על Edit.
משנים את הערך של Timeout ל-
5 minutes(300 שניות) ולוחצים על Save.
יצירת לוח זמנים של EventBridge
- עוברים אל Amazon EventBridge > Scheduler > Create schedule (מתזמן > יצירת תזמון).
- מזינים את פרטי ההגדרה הבאים:
- שם: מזינים
slack-audit-1h. - לו"ז חזרה: בוחרים באפשרות לו"ז מבוסס-תעריף.
- ביטוי תעריף: מזינים
1 hours. - חלון זמן גמיש: בוחרים באפשרות מושבת.
- שם: מזינים
- לוחצים על הבא.
- בוחרים יעד:
- Target API (ממשק ה-API לטירגוט): בוחרים באפשרות AWS Lambda Invoke.
- פונקציית Lambda: בוחרים באפשרות
slack_audit_to_s3.
- לוחצים על הבא.
- לוחצים על הבא (מדלגים על הגדרות אופציונליות).
- בודקים את הפרטים ולוחצים על יצירת לוח זמנים.
(אופציונלי) יצירת משתמש IAM לקריאה בלבד ב-Google SecOps
- עוברים אל AWS Console > IAM > Users > Create user (מסוף AWS > IAM > משתמשים > יצירת משתמש).
- מזינים את פרטי ההגדרה הבאים:
- שם משתמש: מזינים
secops-reader. - סוג גישה: בוחרים באפשרות גישה פרוגרמטית.
- שם משתמש: מזינים
- לוחצים על הבא.
- בוחרים באפשרות Attach policies directly.
לוחצים על יצירת מדיניות. בכרטיסייה JSON, מדביקים את הקוד הבא:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::slack-audit-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::slack-audit-logs" } ] }לוחצים על הבא.
מזינים את שם המדיניות
secops-reader-policy.לוחצים על יצירת מדיניות.
חוזרים לדף ליצירת משתמשים, מרעננים את רשימת כללי המדיניות ובוחרים באפשרות
secops-reader-policy.לוחצים על הבא.
לוחצים על יצירת משתמש.
בוחרים את המשתמש שנוצר
secops-reader.עוברים אל Security credentials > Access keys > Create access key (פרטי כניסה לאבטחה > מפתחות גישה > יצירת מפתח גישה).
בוחרים באפשרות שירות של צד שלישי.
לוחצים על הבא.
לוחצים על יצירת מפתח גישה.
לוחצים על הורדת קובץ CSV כדי לשמור את פרטי הכניסה.
הגדרת פיד ב-Google SecOps כדי להטמיע יומני ביקורת של Slack
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- לוחצים על Configure a single feed (הגדרת פיד יחיד).
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Slack Audit Logs). - בוחרים באפשרות Amazon S3 V2 בתור סוג המקור.
- בוחרים באפשרות ביקורת Slack בתור סוג היומן.
- לוחצים על הבא.
מציינים ערכים לפרמטרים הבאים של הקלט:
S3 URI: מזינים את ה-URI של קטגוריית S3 עם נתיב הקידומת:
``` s3://slack-audit-logs/slack/audit/ ``` Replace `slack-audit-logs` with your actual S3 bucket name.אפשרות מחיקת המקור: בוחרים את אפשרות המחיקה הרצויה.
גיל מקסימלי של קובץ: כולל קבצים ששונו במספר הימים האחרונים. ברירת המחדל היא 180 ימים.
Access Key ID: מזהה מפתח הגישה של המשתמש עם גישה לקטגוריית S3 (ממשתמש
secops-readerIdentity and Access Management (IAM)).מפתח גישה סודי: מפתח סודי של משתמש עם גישה לקטגוריית S3 (ממשתמש ה-IAM של
secops-reader).מרחב השמות של הנכס: מרחב השמות של הנכס.
תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה.
לוחצים על הבא.
בודקים את הגדרות הפיד החדש במסך סיום ולוחצים על שליחה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
action |
metadata.product_event_type |
ממופה ישירות מהשדה action |
actor.type |
principal.labels |
ממופה ישירות באמצעות המקש actor.type |
actor.user.email |
principal.user.email_addresses |
מיפוי ישיר |
actor.user.id |
principal.user.product_object_id |
מיפוי ישיר |
actor.user.id |
principal.user.userid |
מיפוי ישיר |
actor.user.name |
principal.user.user_display_name |
מיפוי ישיר |
actor.user.team |
principal.user.group_identifiers |
מיפוי ישיר |
context.ip_address |
principal.ip |
מיפוי ישיר |
context.location.domain |
about.resource.attribute.labels |
ממופה ישירות באמצעות המקש context.location.domain |
context.location.id |
about.resource.id |
מיפוי ישיר |
context.location.name |
about.resource.name |
מיפוי ישיר |
context.location.name |
about.resource.attribute.labels |
ממופה ישירות עם המפתח context.location.name |
context.location.type |
about.resource.resource_subtype |
מיפוי ישיר |
context.session_id |
network.session_id |
מיפוי ישיר |
context.ua |
network.http.user_agent |
מיפוי ישיר |
context.ua |
network.http.parsed_user_agent |
סוכן משתמש שנותח, שנגזר מהשדה context.ua |
country |
principal.location.country_or_region |
מיפוי ישיר |
date_create |
metadata.event_timestamp.seconds |
חותמת זמן של תקופת זמן המערכת שהומרה לאובייקט חותמת זמן |
details.inviter.email |
target.user.email_addresses |
מיפוי ישיר |
details.inviter.id |
target.user.product_object_id |
מיפוי ישיר |
details.inviter.name |
target.user.user_display_name |
מיפוי ישיר |
details.inviter.team |
target.user.group_identifiers |
מיפוי ישיר |
details.reason |
security_result.description |
ממופה ישירות. אם מדובר במערך, הערכים מחוברים באמצעות פסיקים |
details.type |
about.resource.attribute.labels |
ממופה ישירות באמצעות המקש details.type |
details.type |
security_result.summary |
מיפוי ישיר |
entity.app.id |
target.resource.id |
מיפוי ישיר |
entity.app.name |
target.resource.name |
מיפוי ישיר |
entity.channel.id |
target.resource.id |
מיפוי ישיר |
entity.channel.name |
target.resource.name |
מיפוי ישיר |
entity.channel.privacy |
target.resource.attribute.labels |
ממופה ישירות באמצעות המקש entity.channel.privacy |
entity.file.filetype |
target.resource.attribute.labels |
ממופה ישירות באמצעות המקש entity.file.filetype |
entity.file.id |
target.resource.id |
מיפוי ישיר |
entity.file.name |
target.resource.name |
מיפוי ישיר |
entity.file.title |
target.resource.attribute.labels |
ממופה ישירות עם המפתח entity.file.title |
entity.huddle.date_end |
about.resource.attribute.labels |
ממופה ישירות עם המפתח entity.huddle.date_end |
entity.huddle.date_start |
about.resource.attribute.labels |
ממופה ישירות עם המפתח entity.huddle.date_start |
entity.huddle.id |
about.resource.attribute.labels |
ממופה ישירות באמצעות המקש entity.huddle.id |
entity.huddle.participants.0 |
about.resource.attribute.labels |
ממופה ישירות באמצעות המקש entity.huddle.participants.0 |
entity.huddle.participants.1 |
about.resource.attribute.labels |
ממופה ישירות עם המפתח entity.huddle.participants.1 |
entity.type |
target.resource.resource_subtype |
מיפוי ישיר |
entity.user.email |
target.user.email_addresses |
מיפוי ישיר |
entity.user.id |
target.user.product_object_id |
מיפוי ישיר |
entity.user.name |
target.user.user_display_name |
מיפוי ישיר |
entity.user.team |
target.user.group_identifiers |
מיפוי ישיר |
entity.workflow.id |
target.resource.id |
מיפוי ישיר |
entity.workflow.name |
target.resource.name |
מיפוי ישיר |
id |
metadata.product_log_id |
מיפוי ישיר |
ip |
principal.ip |
מיפוי ישיר |
user_agent |
network.http.user_agent |
מיפוי ישיר |
user_id |
principal.user.product_object_id |
מיפוי ישיר |
username |
principal.user.product_object_id |
מיפוי ישיר |
metadata.event_type |
ברירת המחדל היא USER_COMMUNICATION; הערך מוגדר כ-USER_CREATION אם הפעולה היא user_created, כ-USER_LOGIN אם הפעולה היא user_login או user_login_failed, כ-USER_LOGOUT אם הפעולה היא user_logout, כ-USER_RESOURCE_ACCESS אם הפעולה תואמת ל-file_, כ-USER_RESOURCE_UPDATE_PERMISSIONS אם הפעולה תואמת ל-app_, ל-private_, ל-public_ או ל-auth_policy_, כ-USER_CHANGE_PERMISSIONS אם הפעולה תואמת ל-pref, ל-legal_hold_, ל-workflow_, ל-channel_, ל-user_deactivated, ל-user_reactivated, ל-role_change_ או ל-user_channel_ |
|
metadata.log_type |
מקודד באופן קשיח ל-SLACK_AUDIT |
|
metadata.product_name |
הגדרה ל-Enterprise Grid אם date_create קיים, אחרת ל-Audit Logs אם user_id קיים |
|
metadata.vendor_name |
הוזן קוד קשיח ל-Slack |
|
extensions.auth.mechanism |
מקודד באופן קשיח ל-REMOTE |
|
extensions.auth.type |
הערך שמוגדר הוא SSO אם הפעולה מכילה user_login או user_logout, אחרת MACHINE |
|
security_result.action |
ברירת המחדל היא ALLOW. אם הפעולה היא user_login_failed, הערך שמוגדר הוא BLOCK. |
|
target.application |
הערך הוא Slack אם date_create קיים, אחרת SLACK אם user_id קיים |
יומן שינויים
צפייה ביומן השינויים של המנתח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.