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

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

כדי לאסוף נתונים בהתאמה אישית, מגדירים outputFilePath במדיניות מערכת ההפעלה. זהו הנתיב המקומי במכונה הווירטואלית שבו סקריפט המדיניות כותב טקסט מותאם אישית או פלט JSON. VM Manager קורא את הפלט מהנתיב הזה ומאחסן אותו בדוח הקצאת מדיניות מערכת ההפעלה. אחר כך תוכלו לייצא את הדוחות האלה ל-BigQuery באמצעות Cloud Asset Inventory כדי לשלוח שאילתות על התוצאות בכל מכונות ה-VM.

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

התפקידים הנדרשים

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

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

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

ההרשאות הנדרשות

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

  • cloudasset.assets.exportOSInventories
  • cloudasset.assets.exportResource
  • bigquery.datasets.get
  • bigquery.tables.create
  • bigquery.tables.update
  • bigquery.tables.get
  • bigquery.jobs.create

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

דוגמאות למדיניות מערכת ההפעלה

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

כדי לאסוף נתונים מותאמים אישית, צריך להגדיר מדיניות של מערכת הפעלה עם משאב exec שכולל את המקטעים הבאים:

  • ‫validate: בדיקה אם המכונה הווירטואלית תואמת למצב שנבחר. במדיניות לדוגמה הבאה, הסקריפט validate יוצא עם הקוד 101 כדי לציין שהמשאב לא תואם למצב שנבחר. קוד היציאה הזה מפעיל את הסקריפט enforce בכל הערכה.
  • ‫enforce: מציין את השדה outputFilePath, מריץ את הפקודה המותאמת אישית, כותב את הפלט לנתיב שצוין ויוצא עם קוד 100 כדי לציין שהאכיפה הצליחה.

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

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

id: return-kernel-version-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.txt
          script: uname -r > policy-output.txt && exit 100

מדיניות מערכת הפעלה שמפיקה קובץ JSON

הפלט של מדיניות מערכת ההפעלה לדוגמה הבאה הוא אובייקט JSON שמכיל את השם של מערכת ההפעלה ואת גרסת הליבה:

id: return-kernel-version-js-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version-js
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.json
          script: |-
            k=$(uname -r)
            o=$(uname -a)
            echo "{ \"name\": \""$o"\", \"kernel\": \""$k"\" }" > policy-output.json
            exit 100

ייצוא נתונים של VM Manager ל-BigQuery

אחרי ש-VM Manager אוכף את מדיניות מערכת ההפעלה, מאגר משאבי הענן אוסף את רשימת מערכות ההפעלה שנוצרה ואת דוחות ההקצאה של מדיניות מערכת ההפעלה בכל הארגון. כשמייצאים את הנתונים האלה ל-BigQuery באמצעות הדגל --per-asset-type, מאגר משאבי ענן יוצר טבלה נפרדת לכל סוג נכס. הטבלה שנוצרת <prefix>_osconfig_googleapis_com_OSPolicyAssignmentReport מאחסנת את הפלט של המדיניות המותאמת אישית ואת הודעות השגיאה בנוגע לאכיפה.

כדי לייצא את מלאי מערכות ההפעלה ונתוני המשאבים ל-BigQuery, צריך לבצע את השלבים הבאים:

  1. כדי לזהות את מזהה הארגון, מריצים את הפקודה הבאה:

    gcloud projects get-ancestors PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

  2. כדי לייצא את נתוני מלאי מערכות ההפעלה שנאספים על ידי VM Manager ממופעי מכונות וירטואליות, מריצים את הפקודה הבאה:

    gcloud asset export \
        --content-type=os-inventory \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"
    

    מחליפים את ה-placeholders הבאים בערכים שלכם:

    • ‫ORGANIZATION_ID: מזהה הארגון.
    • ‫BQ_PROJECT_ID: המזהה של הפרויקט שמכיל את מערך הנתונים שלכם ב-BigQuery.
    • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, cai_exp).
  3. כדי לייצא את המטא-נתונים של המשאב – כולל דוחות הקצאה של מדיניות מערכת ההפעלה – ל-BigQuery, מריצים את הפקודה הבאה:

    gcloud asset export \
        --content-type=resource \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"
    

    מחליפים את ה-placeholders הבאים בערכים שלכם:

    • ‫ORGANIZATION_ID: מזהה הארגון.
    • ‫BQ_PROJECT_ID: המזהה של הפרויקט שמכיל את מערך הנתונים שלכם ב-BigQuery.
    • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, cai_exp).

    בסיום הייצוא, מאגר משאבי ענן יוצר את הטבלה res_osconfig_googleapis_com_OSPolicyAssignmentReport במערך הנתונים ב-BigQuery. מידע נוסף זמין במאמר בנושא ייצוא תמונת מצב של נכס.

הרצת שאילתות בנתוני מדיניות של מערכת הפעלה בהתאמה אישית ב-BigQuery

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

כדי להריץ שאילתה ב-BigQuery:

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים אחת משאילתות ה-SQL הבאות:

    • פלט של טקסט השאילתה:

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

      SELECT
        resource.data.instance as instance,
        ANY_VALUE(
          SAFE_CONVERT_BYTES_TO_STRING(FROM_BASE64(REPLACE(REPLACE(
            resource_compliances.execResourceOutput.enforcementOutput
            , '-', '+'), '_', '/')))
          HAVING MAX updateTime) as compliance_results
      FROM
        `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
        UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
        UNNEST(resource_compliances.configSteps) as config_steps
      WHERE
        resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-policy"
        AND resource_compliances.osPolicyResourceId = "return-kernel-version"
        AND config_steps.type = "VALIDATION"
      GROUP BY
        instance
      

      מחליפים את DATASET_ID במזהה של מערך הנתונים ב-BigQuery (לדוגמה, cai_exp).

      הפלט של השאילתה אמור להיראות כך:

      instance compliance_results
      ubuntu-1 5.15.0-1036-gcp
      ubuntu-2 5.15.0-1044-gcp
      rhel9-1 5.14.0-162.18.1.el9_1.x86_64
    • פלט JSON של שאילתה:

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

      WITH compliance_history AS (
        SELECT
          updateTime,
          resource.data.instance,
          SAFE_CONVERT_BYTES_TO_STRING(
            FROM_BASE64(
              REPLACE(
                REPLACE(
                  resource_compliances.execResourceOutput.enforcementOutput, '-', '+'
                ), '_', '/'
              )
            )
          ) as compliance_results
        FROM
          `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
          UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
          UNNEST(resource_compliances.configSteps) as config_steps
        WHERE
          resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-js-policy"
          AND resource_compliances.osPolicyResourceId = "return-kernel-version-js"
          AND config_steps.type = "VALIDATION"
      ),
      compliance_latest AS (
        SELECT
          instance,
          ANY_VALUE(compliance_results HAVING MAX updateTime) as compliance_results
        FROM compliance_history
        GROUP BY instance
      )
      SELECT
        instance,
        JSON_EXTRACT_SCALAR(compliance_results, "$.name") as os_name,
        JSON_EXTRACT_SCALAR(compliance_results, "$.kernel") as kernel_version
      FROM compliance_latest
      

      מחליפים את DATASET_ID במזהה של מערך הנתונים ב-BigQuery (לדוגמה, cai_exp).

      הפלט של השאילתה אמור להיראות כך:

      instance os_name kernel_version
      ubuntu-1 Linux ubuntu-1 5.15.0-1036-gcp #39-Ubuntu SMP 5.15.0-1036-gcp
      rhel9-1 Linux rhel9-1 5.14.0-162.18.1.el9_1.x86_64 #1 SMP 5.14.0-162.18.1.el9_1.x86_64
  3. כדי להריץ את השאילתה, לוחצים על Run.

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

בדיקת הודעות שגיאה שקשורות לאכיפה

אם משאב של מדיניות מערכת ההפעלה נכשל באימות או באכיפה, VM Manager מתעד את הודעת השגיאה בשדה configSteps.errorMessage של הטבלה res_osconfig_googleapis_com_OSPolicyAssignmentReport. אפשר להריץ שאילתות על השדה הזה ב-BigQuery כדי לפתור בעיות שקשורות לביצוע מדיניות בארגון.

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

SELECT
  resource.data.instance AS instance,
  resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId AS policy_id,
  resource_compliances.osPolicyResourceId AS resource_id,
  config_steps.type AS step_type,
  ANY_VALUE(config_steps.errorMessage HAVING MAX updateTime) AS error_message
FROM
  `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
  UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) AS resource_compliances,
  UNNEST(resource_compliances.configSteps) AS config_steps
WHERE
  config_steps.errorMessage IS NOT NULL
  AND config_steps.errorMessage != ""
GROUP BY
  instance,
  policy_id,
  resource_id,
  step_type

מחליפים את DATASET_ID במזהה של מערך הנתונים ב-BigQuery (לדוגמה, cai_exp).

הפלט של השאילתה אמור להיראות כך:

instance policy_id resource_id step_type error_message
ubuntu-2 return-kernel-version-policy return-kernel-version DESIRED_STATE_ENFORCEMENT Error running enforce script: exit status 1

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

מידע נוסף על ניהול מדיניות מערכת הפעלה וניתוח נתוני תאימות זמין במקורות המידע הבאים: