הגדרת מדיניות הארגון

מדיניות הארגון מאפשרת לכם שליטה מרוכזת ופרוגרמטית על המשאבים של הארגון. כאדמינים של מדיניות הארגון, אתם יכולים להגדיר כללי מדיניות בכל הארגון כדי ליהנות מהיתרונות הבאים:

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

ב-Google Distributed Cloud (GDC)‎ עם air gap אין ממשק משתמש של מסוף או CLI ייעודי ליצירה ולניהול של כללי מדיניות של הארגון. לצורך כך, אתם צריכים להשתמש ב-API של Kubernetes או ב-CLI של kubectl.

ההבדלים בין ניהול זהויות והרשאות גישה (IAM) לבין בקרת גישה מבוססת-תפקיד (RBAC)

ניהול זהויות והרשאות גישה (IAM) וכללי מדיניות של הארגון משמשים כפונקציות משלימות של גישה ופיקוח:

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

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

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

בקשת תפקידים ב-IAM

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

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

הכנת הסביבה

הגדרת מדיניות

אפשר להגדיר שני סוגים של מדיניות ארגונית ב-GDC:

  • מדיניות שירות מוגבל (GDCHRestrictedService): מגבילה את השירותים שאפשר להשתמש בהם או לשנות אותם באשכול.
  • מדיניות של בקרת גישה שמבוססת על מאפיינים (GDCHRestrictByAttributes): מגבילה את הגישה למשאבים באשכול על סמך מאפייני נושא שממופים מספק הזהויות.

הגדרת מדיניות שירות מוגבלת

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

‫GDCHRestrictedService תומך בפעולות CREATE,‏ UPDATE ו-DELETE. כדי להגביל את פעולות הקריאה של GET ו-LIST, משתמשים בקישורי תפקידים ב-IAM כדי לתת גישה ולבטל אותה.

הגדרת מדיניות שירות מוגבלת:

  1. מגדירים את המניפסט של המדיניות:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        disabledOperations:
          - DISABLED_OPERATION
    

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

    • ‫POLICY_NAME: השם של מדיניות הארגון.

    • ‫API_GROUP: קבוצת ה-API של השירות שרוצים להגביל, כמו שמופיע בטבלת השירותים הנתמכים בהמשך.

    • ‫KIND: סוג המשאב שרוצים להגביל, כפי שמופיע בטבלת השירותים הנתמכים הבאה.

    • ‫DISABLED_OPERATION: קבוצות הפעולות שהמדיניות הזו חוסמת. הערכים המותרים הם CREATE,‏ UPDATE ו-DELETE. ערך ברירת המחדל של השדה disabledOperations הוא *. כדי להשבית שירות לחלוטין, צריך לציין את CREATE, UPDATE ו-DELETE (ולציין את כל הסוגים שלו).

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

    המדיניות GDCHRestrictedService תומכת בקבוצת המשנה הבאה של שירותים ב-GDC:

    Service קבוצת API kinds
    Marketplace marketplace.gdc.goog MarketplaceService
    Vertex AI Workbench aiplatform.gdc.goog Notebook
    Database Service - Postgres postgresql.dbadmin.gdc.goog
    • DBCluster
    • BackupPlan
    • Import
    • Restore
    Transfer Appliance system.gpc.gke.io TransferApplianceRequest
    גיבוי backup.gdc.goog BackupRepositoryManager
    ‫Dataproc Container for Spark (שירות Marketplace) sparkoperator.k8s.io SparkApplication

    אם שירות מסוים מציג כמה סוגים בטבלה (כמו Database Service), אתם יכולים לציין רק את הסוגים הספציפיים שאתם רוצים להגביל. לדוגמה, אתם יכולים לחסום פעולות של Restore ולאפשר פעולות של DBCluster.

    בדוגמה הבאה, העדכונים מוגבלים לשירותי Marketplace:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: no-update-to-marketplace-service
    spec:
      match:
        kinds:
        - apiGroups:
          - "marketplace.gdc.goog"
          kinds:
          - MarketplaceService
      parameters:
        disabledOperations:
          - "UPDATE"
    
  2. מחילים את המדיניות באמצעות ה-CLI של kubectl:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

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

    • ‫CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול שבו רוצים להחיל את המדיניות
    • ‫POLICY_NAME: השם של קובץ מדיניות הארגון

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

סוג המדיניות GDCHRestrictByAttributes מאפשר ליצור כללי מדיניות של ABAC כדי להגביל את הגישה למשאבים על סמך מאפייני הנושא. לדוגמה, אתם יכולים להשתמש בסוג המדיניות הזה כדי להגביל את פעולות הכתיבה או השינוי בקטגוריות האחסון, כך שרק משתמשים או חשבונות שירות עם מאפייני זהות ספציפיים (כמו citizenship=USA או citizenship=UK) יוכלו לבצע אותן.

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

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

  1. יוצרים קובץ JSON לתיקון כדי למפות מאפייני זהות בהתאמה אישית למשאב IdentityProviderConfig:

    cat <<EOF > attributeMapping-patch.json
    {
      "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]"
    }
    EOF
    

    מחליפים את CUSTOM_ATTRIBUTE בשם של מאפיין הזהות שרוצים למפות, למשל citizenship.

  2. מתקנים את המשאב IdentityProviderConfig במרחב השמות platform:

    kubectl --kubeconfig CLUSTER_KUBECONFIG patch \
        IdentityProviderConfig IDENTITY_PROVIDER_CONFIG_NAME \
        -n platform --type=json \
        -p '[{"op":"add","path":"/spec/oidc/attributeMapping", "value": '"$(cat attributeMapping-patch.json)"'}]'
    

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

    • ‫CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול שבו נמצא ספק הזהויות
    • ‫IDENTITY_PROVIDER_CONFIG_NAME: השם של המשאב ב-IdentityProviderConfig
  3. מגדירים את המניפסט של המדיניות:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        attributes:
          - CUSTOM_ATTRIBUTE
        attributeValues:
          - ALLOWED_ATTRIBUTE_VALUE
    

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

    • ‫POLICY_NAME: השם של מדיניות הארגון.

    • ‫API_GROUP: קבוצת ה-API של המשאבים שרוצים להגביל, למשל object.gdc.goog.

    • ‫KIND: סוג המשאב שרוצים להגביל, למשל Bucket.

    • ‫CUSTOM_ATTRIBUTE: מאפיין הנושא בהתאמה אישית שממופה מספק הזהויות, כמו citizenship.

    • ‫ALLOWED_ATTRIBUTE_VALUE: הערך המותר למאפיין המותאם אישית, למשל USA. בקשות מנושאים שהמאפיין שלהם לא תואם לאחד מהערכים המותרים יידחו.

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

    בדוגמה הבאה, רק נושאים עם המאפיין citizenship=USA או citizenship=UK יכולים לשנות משאבים מסוג Bucket במרחב השמות project-foo:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: restrict-by-citizenship
    spec:
      match:
        scope: Namespaced
        kinds:
          - apiGroups:
              - "object.gdc.goog"
            kinds:
              - Bucket
        namespaces:
          - project-foo
      parameters:
        attributes:
          - "citizenship"
        attributeValues:
          - "USA"
          - "UK"
    
  4. מחילים את המדיניות באמצעות ה-CLI של kubectl:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

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

    • ‫CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול שבו רוצים להחיל את המדיניות
    • ‫POLICY_NAME: השם של קובץ מדיניות הארגון

הגדרת ההיקף של מדיניות הארגון בתוך אשכול

כשמגדירים מדיניות ארגונית, צריך להחליט אם היא תשפיע על כל מרחבי השמות, רק על מרחבי שמות ספציפיים או על כל מרחבי השמות חוץ מרשימה נתונה. כדי לעשות את זה, משתמשים בשילוב של הפרמטרים .spec.match.excludedNamespaces,‏ .spec.match.namespaceSelector,‏ .spec.match.namespaces ו-.spec.match.scope בהגדרת המדיניות.

מידע נוסף על הפרמטרים האלה זמין בקטע התאמה למדיניות הארגון. לדוגמה, כדי לאפשר יצירה של מסדי נתונים רק במרחבי שמות עם התווית owner: dba-team, יוצרים את המדיניות הבאה:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: db-restricted-to-dbas
spec:
  match:
    scope: Namespaced
    namespaceSelector:
      matchExpressions:
      # We are restricting the use of the service in namespaces that
      # don't have the owner: dba-team label
      - key: owner
        operator: NotIn
        values:
        - dba-team
    kinds:
    - apiGroups:
      - "postgresql.dbadmin.gdc.goog"
      kinds:
      - DBCluster
      - BackupPlan
      - Import
      - Restore
  parameters:
    disabledOperations:
      - "UPDATE"
      - "CREATE"
      - "DELETE"

חזרה לגרסה קודמת של מדיניות קיימת

כדי להפסיק את האכיפה של מדיניות קיימת, צריך למחוק אותה באמצעות kubectl CLI. משתמשים בקובץ kubeconfig שנותן גישה לאשכול שבו מוגדרת המדיניות, ולתפקיד ב-IAM שתואם לסוג המדיניות (למשל gdchrestrictedservice-policy-admin או gdchrestrictbyattributes-policy-admin).

מחיקה של מדיניות הארגון:

kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
    POLICY_TYPE/POLICY_NAME

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

  • ‫CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול שבו נמצאת מדיניות הארגון

  • ‫POLICY_TYPE: סוג מדיניות הארגון שרוצים למחוק, למשל GDCHRestrictedService או GDCHRestrictByAttributes

  • ‫POLICY_NAME: השם של מדיניות הארגון שרוצים למחוק

בדיקת מדיניות במצב ביקורת

אתם יכולים לבדוק מדיניות בלי לאכוף אותה. לפני שמשיקים מדיניות, כדאי לבדוק אותה כדי לוודא שהיא לא משבשת מערכות קיימות, או כדי לקבל הערכה לגבי היקף ההתנהגות. כדי להוסיף בדיקה, מוסיפים enforcementAction להגדרת המדיניות. יש שלושה ערכים אפשריים לפרמטר הזה:

  • ‫deny: המדיניות נאכפת. זוהי הגדרת ברירת המחדל.
  • ‫dryrun: הפעולה מותרת, אבל אפשר לראות שיש הפרת מדיניות גם ביומני הביקורת וגם בסטטוס המדיניות. בודקים את ההפרה באמצעות kubectl --kubeconfig CLUSTER_KUBECONFIG get POLICY_TYPE/POLICY_NAME.
  • ‫warn: זהה ל-dryrun, אבל הבדיקה גם מציגה אזהרה בתגובה לבקשה שהפעילה הפרת מדיניות.

לדוגמה, כדי לבדוק מדיניות שמשביתה את Marketplace, יוצרים את המדיניות הבאה:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: disable-marketplace-service-project-alice
spec:
  enforcementAction: warn
  match:
    kinds:
      - apiGroups: ["marketplace.gdc.goog"]
        kinds: ["MarketplaceService"]