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

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

סקירה כללית

‫מאגר משאבי ענן מנתח את הסביבה Cloud de Confiance by S3NS שלכם ומתעד את כל השינויים במשאבי הענן, כמו מכונות וירטואליות, מסדי נתונים, קטגוריות אחסון, ובהקשר הזה, סודות ב-Secret Manager. השילוב בין Secret Manager לבין מאגר משאבי ענן מאפשר לכם:

  • הפעלת שאילתות: חיפוש סודות ספציפיים או זיהוי דפוסים בסודות.

  • הגדרת התראות: הגדרת מאגר משאבי ענן לשליחת התראות ל-Pub/Sub כשמתרחשים אירועים ספציפיים, כמו יצירה, שינוי או מחיקה של סודות.

  • ייצוא נתונים: ייצוא של מלאי הסודות ל-BigQuery לניתוח מעמיק וליצירת דוחות.

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

זוהי משימה מתקדמת למשתמשי Secret Manager. לפני שקוראים את הדף הזה, מומלץ לקרוא את המאמרים הבאים:

שאילתות ב-Secret Manager

כדי לנתח את הסודות באמצעות שאילתות דמויות SQL, מומלץ לייצא את הסודות ואת הגרסאות שלהם ל-BigQuery. ‫Secret Manager לא משולב עם חיפוש נכסים או עם כלי ניתוח המדיניות. השאילתות האלה משתמשות ב-Google Cloud CLI וב-BigQuery כדי לחפש את הנכסים שלכם.

מגבלות

יש מגבלה אחת בניתוח משאבים של Secret Manager באמצעות מאגר משאבי הענן:

  • מאגר משאבי הענן תומך בייצוא ובהצגת תמונות מצב רק מהחמשת השבועות האחרונים.
  • הנתונים של Secret Manager מסונכרנים עם מאגר משאבי ענן כל 7 שעות. אם הסנכרון נכשל, העדכניות מתעכבת עד לסנכרון המוצלח הבא. בתרחישי שימוש שבהם נדרש מידע בזמן אמת, צריך להריץ שאילתה ב-Secret Manager API.

מעקב אחרי שינויים בנכסים

שירות מאגר משאבי ענן עוקב אחרי עדכונים ותומך במעקב אחרי השינויים האלה. אתם יכולים להגדיר פידים לשליחת התראות לקבוצה של נושאי Pub/Sub שהוגדרו בכל פעם שמתבצע שינוי במשאבים שלכם. בנוסף, מאגר משאבי הענן תומך בהגדרת תנאים בפידים, כך שתוכלו לעקוב אחרי שינויים ספציפיים בסוגים מסוימים של נכסים. במסמכי Pub/Sub מוסבר איך להפעיל תהליכי עבודה כשמתבצעים שינויים בנכסים.

ייצוא נכסים ל-BigQuery

ייצוא הסודות והגרסאות שלהם ל-BigQuery מאפשר להריץ שאילתות דומות ל-SQL על כמויות גדולות של נתונים, ולקבל תובנות משמעותיות לגבי הנכסים שלכם. לפני שמייצאים את הנכסים, צריך לוודא שמערך הנתונים וחשבונות השירות מוגדרים בצורה נכונה.

כדי לייצא את הנכסים, מריצים את הפקודה הבאה:

gcloud

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • CONTENT_TYPE: סוג התוכן של הנכס (RESOURCE).
  • PROJECT_ID: מזהה הפרויקט שמכיל את הסודות שרוצים לנתח.
  • SNAPSHOT_TIME: השעה שבה יצולמו תמונות ה-snapshot של המשאבים. התאריך הזה יכול להיות בין השעה הנוכחית לבין תאריך שחל לפני 5 שבועות.
  • BIGQUERY_PROJECT_ID: מזהה הפרויקט שבו נמצאת הטבלה ב-BigQuery.
  • DATASET_ID: המזהה של מערך הנתונים ב-BigQuery.
  • TABLE_NAME: הטבלה שאליה מייצאים את המטא-נתונים. אם הוא לא קיים, הוא נוצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud asset export \
  --content-type=CONTENT_TYPE \
  --project=PROJECT_ID \
  --snapshot-time=SNAPSHOT_TIME \
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
  --output-bigquery-force

‏Windows (PowerShell)

gcloud asset export `
  --content-type=CONTENT_TYPE `
  --project=PROJECT_ID `
  --snapshot-time=SNAPSHOT_TIME `
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME `
  --output-bigquery-force

Windows‏ (cmd.exe)

gcloud asset export ^
  --content-type=CONTENT_TYPE ^
  --project=PROJECT_ID ^
  --snapshot-time=SNAPSHOT_TIME ^
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME ^
  --output-bigquery-force

מידע נוסף זמין במאמר בנושא ייצוא ל-BigQuery.

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

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

סודות אזוריים שנוצרו בשבועיים האחרונים

חיפוש סודות (והמאפיינים שלהם) שנוספו לארגון שלכם בשבועיים האחרונים.

BigQuery

  SELECT name, FROM BIGQUERY_TABLE
  WHERE asset_type='secretmanager.googleapis.com/Secret' AND
    resource.location <> "global" AND
    DATE(JSON_VALUE(resource.data, '$.createTime')) > DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK);
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.createTime>-P2W"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

פנינים נסתרות באזור מסוים

חיפוש כל הסודות שמאוחסנים במיקום ספציפי, כמו us-central1.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location = "us-central1";
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
       --asset-types='secretmanager.googleapis.com/Secret' \
       --snapshot-time=$NOW \
       --content-type='resource' \
       --filter=&quot;resource.location = LOCATION AND resource.data.createTime>-P2W"
  

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: המזהה של הפרויקט שמכיל את הסודות שרוצים לנתח
  • LOCATION: המיקום של הסודות ב- Cloud de Confiance by S3NS

גרסאות אזוריות של סודות שנוצרו לפני יותר מ-180 ימים

מציגים את כל הגרסאות של הסודות שנוצרו לפני יותר מ-180 ימים.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      DATE(JSON_VALUE(resource<.data, '$.createTime'))  DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY) AND
      JSON_VALUE(resource.data, '$.state') = "ENABLED";
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.createTime < P6M AND resource.data.state = ENABLED"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים ללא הגדרת CMEK

הצגת רשימה של כל הסודות שלא מוצפנים באמצעות מפתחות הצפנה בניהול הלקוח (CMEK):

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") IS NOT NULL;
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = NULL) AND resource.data.state=ENABLED"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים עם CMEK מוגדר

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

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") IS NOT NULL;
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.customerManagedEncryption != NULL"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים מוצפנים באמצעות CMEK ספציפי

חיפוש סודות שמוצפנים באמצעות CMEK ספציפי.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME;
  

מחליפים את מה שכתוב בשדות הבאים:

  • BIGQUERY_TABLE: הנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במסמך הזה.

  • KMS_KEY_NAME: המזהה של המפתח או מזהה מוגדר במלואו של המפתח

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud beta asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.customerManagedEncryption.kmsKeyName=KMS_KEY_NAME"
  

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: המזהה של הפרויקט שמכיל את הסודות שרוצים לנתח
  • KMS_KEY_NAME: המזהה של המפתח או מזהה מוגדר במלואו של המפתח

גרסאות אזוריות של סודות ללא הגדרת CMEK

חיפוש כל הגרסאות המופעלות של סודות שלא מוצפנות באמצעות CMEK.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyVersionName") IS NULL AND
      JSON_VALUE(resource.data, "$.state") = "ENABLED";
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = NULL) AND resource.data.state=ENABLED"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

גרסאות אזוריות של סודות שמוצפנות באמצעות CMEK ספציפי

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

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyVersionName") = KMS_KEY_VERSION_NAME AND
      JSON_VALUE(resource.data, "$.state") = "ENABLED";
  

מחליפים את מה שכתוב בשדות הבאים:

  • BIGQUERY_TABLE: הנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במסמך הזה.

  • KMS_KEY_VERSION_NAME: מספר הגרסה של המפתח ב-Cloud Key Management Service

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = KMS_KEY_VERSION_NAME) AND resource.data.state=ENABLED"
  

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: המזהה של הפרויקט שמכיל את הסודות שרוצים לנתח
  • KMS_KEY_VERSION_NAME: המזהה של גרסת המפתח

סודות אזוריים שלא הוגדר להם סבב

חיפוש כל הסודות שלא מוגדר להם תזמון רוטציה.

BigQuery

    SELECT name FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      JSON_EXTRACT(resource.data, '$.rotation') IS NULL;
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.rotation = NULL"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים עם תקופת רוטציה ספציפית

כדי למצוא את כל הסודות שמתוזמנים לרוטציה בתדירות של פחות מפעם אחת ב-90 יום:

BigQuery

    SELECT *
    FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      CAST(
        TRIM(
          JSON_VALUE(JSON_EXTRACT(resource.data, "$.rotation.rotationPeriod")),"s")
        AS INT64)
    < 86400 * 90 #Rotation period in seconds (86400s in 1 day * 90 days)
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  ROTATION_PERIOD_SECONDS=$((90 * 24 * 60 * 60))
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.rotation != null AND resource.data.rotation.rotationPeriod <= ${ROTATION_PERIOD_SECONDS}s"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים שתוקפם יפוג ב-30 הימים הבאים

הצגת רשימה של סודות שתוקפם יפוג ב-30 הימים הבאים.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      DATE(JSON_VALUE(resource<.data, '$.expireTime'))  DATE_ADD(CURRENT_DATE(), INTERVAL 30 DAY);
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.expireTime < PD30"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

סודות אזוריים עם נושא Pub/Sub מוגדר

רשימה של כל הסודות שהוגדר להם לפחות נושא אחד ב-Pub/Sub.

BigQuery

    SELECT name, ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) AS topics_count,
    FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) > 0
  

מחליפים את BIGQUERY_TABLE בנתיב המלא לטבלת BigQuery שאליה ייצאתם את כל הנכסים בקטע ייצוא נכסים ל-BigQuery במאמר הזה.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.topics != NULL"
  

מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את הסודות שרוצים לנתח.

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