מפרט של רמת גישה בהתאמה אישית

בדף הזה מפורטים האובייקטים והמאפיינים שמשמשים ליצירת ביטויים של Common Expression Language‏ (CEL) לרמות גישה בהתאמה אישית. יש גם דוגמאות.

מידע נוסף על CEL זמין בהגדרת השפה של CEL.

Objects

‫Access Context Manager מספק ארבעה אובייקטים שמכילים מאפיינים של רמות גישה.

Objects
origin כולל מאפיינים שמזהים את המקור של הבקשה.
request.auth מכיל מאפיינים שמזהים את היבטי האימות וההרשאה של הבקשה.
request.time מכיל מאפיינים מבוססי-זמן שבהם אפשר להשתמש כדי להגביל את הגישה למשאבים על סמך השעה ביום, היום בשבוע או טווח תאריכים ספציפי.
levels כולל מאפיינים להגדרת תלות ברמות גישה אחרות.
device מכיל מאפיינים שמתארים את המכשיר שממנו נשלחה הבקשה.
api מכיל מאפיינים שקשורים לקריאה ל-API עצמה, שונים מהמשתמש, מהמכשיר או מהרשת.

מאפיינים של origin

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

מאפיינים
ip
סוג מחרוזת
תיאור

כתובת ה-IP שממנה נשלחה הבקשה. אם לא ניתן לקבוע את כתובת ה-IP, הפונקציה origin.ip מחזירה שגיאה. מומלץ להשתמש ב-inIpRange כדי לבדוק אם כתובת ה-IP של המקור נמצאת בטווח כתובות IP ספציפי, במקום לבצע השוואה של מחרוזות.

לדוגמה:

inIpRange(origin.ip, ["203.0.113.24"])

region_code
סוג מחרוזת
תיאור

קוד ISO 3166-1 alpha-2 של המדינה או האזור שמהם נשלחה הבקשה. אם לא ניתן לקבוע את קוד האזור, הערך origin.region_code יקבל שגיאה.

לדוגמה:

origin.region_code == "GB"
origin.region_code in ["US", "FR", "JP"]

מאפיינים של request.auth

בקטע הזה מפורטים המאפיינים שנתמכים באובייקט request.auth.

מאפיינים
principal
סוג מחרוזת, רשימה(מחרוזת)
תיאור

המזהה הייחודי של המשתמש ששלח את הבקשה.

הערך של request.auth.principal חייב להיות מזהה משתמש ייחודי אחד או יותר. אפשר לקבל את ה-UUID באמצעות Admin SDK Directory API.

הערך צריך להיות בפורמט הבא: https://accounts.google.com/UUID

כאשר UUID הוא ה-UUID של המשתמש.

לדוגמה:

request.auth.principal == "https://accounts.google.com/1134924314572461055"
request.auth.principal in ["https://accounts.google.com/1134924314572461055", "https://accounts.google.com/3134824314572461115"]

claims.crd_str.pwd
סוג בוליאני
תיאור

המשתמש אומת באמצעות סיסמה.

לדוגמה:

request.auth.claims.crd_str.pwd == true

claims.crd_str.push
סוג בוליאני
תיאור

המשתמש עבר אימות באמצעות התראה בנייד.

לדוגמה:

request.auth.claims.crd_str.push == true

claims.crd_str.sms
סוג בוליאני
תיאור

המשתמש עבר אימות באמצעות קוד שנשלח ב-SMS או בשיחת טלפון.

לדוגמה:

request.auth.claims.crd_str.sms == true

claims.crd_str.swk
סוג בוליאני
תיאור

באימות הדו-שלבי נעשה שימוש במפתח אבטחה בתוכנה, כמו טלפון.

לדוגמה:

request.auth.claims.crd_str.swk == true

claims.crd_str.hwk
סוג בוליאני
תיאור

אימות דו-שלבי באמצעות מפתח אבטחה פיזי, כמו מפתח האבטחה Titan של Google.

לדוגמה:

request.auth.claims.crd_str.hwk == true

claims.crd_str.otp
סוג בוליאני
תיאור

המשתמש עבר אימות באמצעות שיטות של סיסמה חד-פעמית (מאמת החשבונות של Google וקודי גיבוי).

לדוגמה:

request.auth.claims.crd_str.otp == true

claims.crd_str.mfa
סוג בוליאני
תיאור

המשתמש עבר אימות באמצעות אחת מהשיטות שבטבלה הזו, חוץ מpwd.

לדוגמה:

request.auth.claims.crd_str.mfa == true

request.auth.oauth.client_id
סוג OAuthClientID
תיאור

מזהה הלקוח של סוכן ה-AI שרוצים לאפשר או לחסום את הגישה שלו לכלי MCP.

לדוגמה:

request.auth.oauth.client_id == OAuthClientID

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

מאפיינים של request.time

בקטע הזה מפורטים המאפיינים שנתמכים באובייקט request.time.

מאפיינים
getFullYear()
סוג מחרוזת
תיאור

הפונקציה מחזירה את השנה (לדוגמה: 2023).

לדוגמה:

request.time.getFullYear("America/Los_Angeles") == 2024

getMonth()
סוג מחרוזת
תיאור

הפונקציה מאחזרת את החודש, מ-0 (ינואר) עד 11 (דצמבר).

לדוגמה:

request.time.getMonth("America/Los_Angeles") == 0 (ינואר)

getDate()
סוג מחרוזת
תיאור

הפונקציה מחזירה את היום בחודש, מ-1 עד 31.

לדוגמה:

request.time.getDate("America/Los_Angeles") == 1

getDayOfMonth()
סוג מחרוזת
תיאור

הפונקציה מחזירה את היום בחודש, מ-0 עד 30 (0 הוא היום הראשון).

לדוגמה:

request.time.getDayOfMonth("America/Los_Angeles") == 0 (הראשון בחודש)

getDayOfWeek()
סוג מחרוזת
תיאור

הפונקציה מחזירה את היום בשבוע, מ-0 (יום ראשון) עד 6 (יום שבת).

לדוגמה:

request.time.getDayOfWeek("America/Los_Angeles") == 1 (יום שני)

getDayOfYear()
סוג מחרוזת
תיאור

הפונקציה מחזירה את היום בשנה, מ-0 עד 365.

לדוגמה:

request.time.getDayOfYear("America/Los_Angeles") == 0 (1 בינואר)

getHours()
סוג מחרוזת
תיאור

הפונקציה מחזירה את השעה ביום, מ-0 (חצות) עד 23 (23:00).

לדוגמה:

request.time.getHours("America/Los_Angeles") == 19 (19:00)

getMinutes()
סוג מחרוזת
תיאור

הפונקציה מחזירה את מספר הדקות אחרי השעה השלמה, בין 0 ל-59.

לדוגמה:

request.time.getMinutes("America/Los_Angeles") == 30

מאפיין levels

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

מאפיינים
level name
סוג בוליאני
תיאור

level name הוא השם של רמת גישה קיימת.

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

לדוגמה:

levels.allow_corp_ips

כאשר allow_corp_ips הוא השם של רמת גישה.

מאפיין device

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

מאפיינים
encryption_status
סוג enum
תיאור

תיאור של סטטוס ההצפנה של המכשיר.

ערכי enum:

enum DeviceEncryptionStatus {
  // The encryption status of the device is not specified or not known.
  ENCRYPTION_UNSPECIFIED == 0;
  // The device does not support encryption.
  ENCRYPTION_UNSUPPORTED == 1;
  // The device supports encryption, but is currently unencrypted.
  UNENCRYPTED == 2;
  // The device is encrypted.
  ENCRYPTED == 3;
}

לדוגמה:

device.encryption_status == DeviceEncryptionStatus.ENCRYPTED

is_admin_approved_device
סוג בוליאני
תיאור

אם המכשיר אושר על ידי האדמין של הדומיין.

לדוגמה:

device.is_admin_approved_device == true

is_corp_owned_device
סוג בוליאני
תיאור

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

לדוגמה:

device.is_corp_owned_device == true

is_secured_with_screenlock
סוג בוליאני
תיאור

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

לדוגמה:

device.is_secured_with_screenlock == true

os_type
סוג enum
תיאור

מזהה את מערכת ההפעלה שבה המכשיר משתמש.

ערכי enum:

enum OsType {
  // The operating system of the device is not specified or not known.
  OS_UNSPECIFIED == 0;
  // A desktop Mac operating system.
  DESKTOP_MAC == 1;
  // A desktop Windows operating system.
  DESKTOP_WINDOWS == 2;
  // A desktop Linux operating system.
  DESKTOP_LINUX == 3;
  // An Android operating system.
  ANDROID == 4;
  // An iOS operating system.
  IOS == 5;
  // A desktop ChromeOS operating system.
  DESKTOP_CHROME_OS == 6;
}

לדוגמה:

device.os_type == OsType.DESKTOP_MAC
device.os_type != OsType.OS_UNSPECIFIED

vendors
סוג ‪map<string, Vendor> vendors;
תיאור

האובייקט vendors משמש לגישה לנתונים שסופקו על ידי ספקים של צד שלישי בתחום האבטחה וניהול נקודות הקצה. כל ספק יכול לאכלס שלושה מאפיינים משותפים ברמה העליונה: is_compliant_device,‏ is_managed_device ו-device_health_score.

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

כדי להפנות אל מצב המכשיר, משתמשים בפורמט key-acme, כאשר acme הוא מספר הלקוח של הארגון. אפשר למצוא את מספר הלקוח בכתובת ה-URL GET https://www.googleapis.com/admin/directory/v1/customers/my_customer. השדה ID בתשובה מכיל את מספר הלקוח שמתחיל באות C. מספר הלקוח הוא המחרוזת שאחרי האות C, לא כולל האות C.

ערכי enum:

// Health score of the device as provided by the vendor (possibly third party).
enum DeviceHealthScore {
  // The health score for the device is not specified or unknown.
  DEVICE_HEALTH_SCORE_UNSPECIFIED = 0;
  // The health of the device is very poor.
  VERY_POOR = 1;
  // The health of the device is poor.
  POOR = 2;
  // The health of the device is ok.
  NEUTRAL = 3;
  // The health of the device is good.
  GOOD = 4;
  // The health of the device is very good.
  VERY_GOOD = 5;
}

לדוגמה:

device.vendors["some_vendor"].is_compliant_device == true

device.vendors["some_vendor"].is_managed_device == true

device.vendors["some_vendor"].device_health_score == DeviceHealthScore.VERY_GOOD

device.vendors["some_vendor"].data["is_device_compromised"] == true

device.vendors["some_vendor"].data["some_num"] == 1.0

android_device_security.verified_boot
סוג בוליאני
תיאור

האם הסטטוס של הפעלה מאומתת של Android הוא green.

לדוגמה:

device.android_device_security.verified_boot == true

android_device_security.cts_profile_match
סוג בוליאני
תיאור

האם המכשיר עומד בדרישות של פרופיל CTS.

לדוגמה:

device.android_device_security.cts_profile_match == true

android_device_security.verify_apps_enabled
סוג בוליאני
תיאור

האם התכונה 'אימות אפליקציות' של Google Play Protect מופעלת במכשיר.

לדוגמה:

device.android_device_security.verify_apps_enabled == true

android_device_security.has_potentially_harmful_apps
סוג בוליאני
תיאור

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

לדוגמה:

device.android_device_security.has_potentially_harmful_apps == true
ios_device_security.is_device_jailbroken
סוג בוליאני
תיאור

האם המערכת זיהתה שבוצעה פריצה למכשיר iOS.

לדוגמה:

device.ios_device_security.is_device_jailbroken == true

verified_chrome_os
סוג בוליאני
תיאור

האם הבקשה מגיעה ממכשיר עם ChromeOS מאומת.

לדוגמה:

device.verified_chrome_os == true

chrome.management_state
סוג מחרוזת
תיאור

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

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

אלה מצבי הניהול הזמינים של Chrome:

מדינה
UNMANAGED הדפדפן או הפרופיל לא מנוהלים על ידי לקוח כלשהו.
MANAGED_BY_OTHER_DOMAIN הדפדפן או הפרופיל מנוהלים על ידי לקוח אחר.
PROFILE_MANAGED הפרופיל מנוהל על ידי הלקוח.
BROWSER_MANAGED הדפדפן מנוהל על ידי הלקוח.

לדוגמה:

device.chrome.management_state in
    [
        ChromeManagementState.CHROME_MANAGEMENT_STATE_BROWSER_MANAGED,
        ChromeManagementState.CHROME_MANAGEMENT_STATE_PROFILE_MANAGED,
    ]

chrome.versionAtLeast
סוג מחרוזת
תיאור

האם הדפדפן הוא מעל גרסה מינימלית מסוימת.

לדוגמה:

device.chrome.versionAtLeast("88.0.4321.44")

chrome.is_realtime_url_check_enabled
סוג בוליאני
תיאור

האם המחבר לבדיקת כתובות URL בזמן אמת מופעל.

לדוגמה:

device.chrome.is_realtime_url_check_enabled == true | false

chrome.is_file_upload_analysis_enabled
סוג בוליאני
תיאור

האם המחבר לניתוח העלאות קבצים מופעל.

לדוגמה:

device.chrome.is_file_upload_analysis_enabled == true | false

chrome.is_file_download_analysis_enabled
סוג בוליאני
תיאור

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

לדוגמה:

device.chrome.is_file_download_analysis_enabled == true | false

chrome.is_bulk_data_entry_analysis_enabled
סוג בוליאני
תיאור

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

לדוגמה:

device.chrome.is_bulk_data_entry_analysis_enabled == true | false

chrome.is_security_event_analysis_enabled
סוג בוליאני
תיאור

האם מחבר הדיווח על אירועי אבטחה מופעל.

לדוגמה:

device.chrome.is_security_event_analysis_enabled == true | false

device.certificates.exists
סוג בוליאני
תיאור

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

לדוגמה:

// Checks if the device has at least one valid enterprise certificate.
device.certificates.exists(cert, cert.is_valid == true)

מאפיינים של api

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

מאפיינים
mcp.is_mcp
סוג בוליאני
תיאור

השדה מציין אם הקריאה ל-API מתבצעת על ידי שירות MCP.

לדוגמה:

api.mcp.is_mcp == true

mcp.tool.is_read_only
סוג בוליאני
תיאור

המאפיין הזה מציין אם הפעלת כלי ה-MCP היא במצב קריאה-בלבד.

לדוגמה:

api.mcp.tool.is_read_only == true

פונקציות

‫Access Context Manager מספק את הפונקציות הבאות לשימוש בביטויי CEL לרמות גישה בהתאמה אישית.

פונקציות
inIpRange(address, [subnets])
סוג ‫(string, list(string)) -< boolean
תיאור

בודקת אם כתובת IP שייכת לאחת מתת-הרשתות שצוינו.

לדוגמה:

inIpRange(origin.ip, ["192.0.2.0/24", "198.51.100.0/24", "203.0.113.0/24"])

device.versionAtLeast(minVersion)
סוג DeviceType.(string) ‫-> boolean
תיאור

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

לדוגמה:

device.versionAtLeast("10.0") == true

certificateBindingState(origin, device)
סוג ‫(Peer, ‏ DeviceType) -> integer
תיאור

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

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

  • CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE
  • CertificateBindingState.CERT_NOT_MATCHING_EXISTING_DEVICE
  • CertificateBindingState.CERT_STATE_UNKNOWN

לדוגמה:

certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE

startsWith()
סוג string.(string) ‫-> bool
תיאור

הפונקציה בודקת אם אופרנד המחרוזת מתחיל בארגומנט התחילית.

לדוגמה:

"Sample string".startsWith("Sample")

endsWith()
סוג string.(string) ‫-> bool
תיאור

בודקת אם אופרנד המחרוזת מסתיים בארגומנט הסיומת.

לדוגמה:

"Sample string".endsWith("string")

origin.clientCertFingerprint()
סוג Origin.() -> string
תיאור

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

לדוגמה:

// Checks if the enterprise certificate associated with the origin matches the device.
device.certificates.exists(cert, cert.is_valid && cert.cert_fingerprint == origin.clientCertFingerprint())

פקודות מאקרו לביטויי CEL

אפשר להשתמש בפקודות המאקרו הבאות בביטויי CEL לרמות גישה מותאמות אישית:

מאקרו תיאור
has(e.f) בודקת אם שדה זמין. פרטים נוספים מופיעים במאמר בנושא בחירת שדות. דוגמה:

has({"key": "value"}.key) has(device.vendors.some_vendor)

e.all(x, p) בודקת אם פרדיקט מתקיים עבור כל הרכיבים של רשימה e או מפתחות של מפה e. כאן x הוא מזהה לשימוש ב-p שמשויך לרכיב או למפתח. פקודת המאקרו all() משלבת תוצאות של פרדיקטים לכל רכיב עם האופרטור and (&&), כך שאם פרדיקט כלשהו מחזיר את הערך false, פקודת המאקרו מחזירה את הערך false, תוך התעלמות משגיאות מפרדיקטים אחרים. דוגמה:

הפונקציה מחזירה false כי לא כל הרכיבים גדולים מ-1:
[1,2,3].all(x, x > 1)

e.exists(x, p) בדומה לפקודת המאקרו all(), אבל משלבת את תוצאות התנאי עם האופרטור or (||). דוגמה:

הפונקציה מחזירה את הערך True כי יש לפחות רכיב אחד ברשימה שגדול מ-1:
[1,2,3].exists(x, x > 1)

בודק אם האישור הארגוני שמשויך למכשיר תואם למונפק:
device.certificates.exists(cert, cert.is_valid && cert.issuer == "EMAILADDRESS=test_inter1@beyondcorp.in, CN=inter_1, OU=BCEDemo_1, O=BCEDemo, L=NCR, ST=UP, C=IN")

e.exists_one(x, p) בדומה לפקודת המאקרו exists(), אבל מחזירה את הערך True רק אם ערך החיזוי של רכיב אחד או מפתח אחד הוא True, ושל כל השאר הוא False. כל שילוב אחר של תוצאות בוליאניות מוערך כ-false, וכל שגיאה בפרדיקט גורמת לפקודת המאקרו להחזיר שגיאה. דוגמה:

הפונקציה מחזירה false כי יש יותר מרכיב אחד שגדול מ-1:
[1,2,3].exists_one(x, x > 1)

דוגמאות לביטויי CEL

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

דוגמה 1

device.encryption_status == DeviceEncryptionStatus.ENCRYPTED && (origin.region_code in ["US"] || device.is_admin_approved_device)

בדוגמה הזו מוצגת רמת גישה שבה הבקשה תאושר רק אם התנאים הבאים יתקיימו:

  • המכשיר שממנו נשלחה הבקשה מוצפן.

  • אחד או יותר מהתנאים הבאים מתקיימים:

    • הבקשה נשלחה מארצות הברית.

    • המכשיר שממנו נשלחה הבקשה אושר על ידי האדמין של הדומיין.

דוגמה 2

(device.os_type == OsType.DESKTOP_WINDOWS && device.is_corp_owned_device) || (device.os_type == OsType.DESKTOP_MAC && device.is_admin_approved_device && device.versionAtLeast("10.11.0"))

בדוגמה הזו מוצגת רמת גישה שבה הבקשה תאושר רק אם התנאים הבאים יתקיימו:

  • אחד מהתנאים הבאים מתקיים:

    • המכשיר שממנו נשלחה הבקשה משתמש במערכת הפעלה Windows למחשב נייח ונמצא בבעלות הארגון.

    • המכשיר שממנו נשלחה הבקשה משתמש במערכת הפעלה של Mac למחשבים נייחים, אושר על ידי מנהל הדומיין ופועלת בו לפחות גרסה MacOS 10.11.

דוגמה 3

(certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE)

בדוגמה הזו מוצגת רמת גישה שבה כדי לאשר בקשה צריך לעמוד בתנאי הבא:

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