Common Expression Language (CEL)

Common Expression Language (CEL) היא שפת ביטויים לשימוש כללי, שתוכננה להיות מהירה, ניידת ובטוחה להפעלה. אפשר להשתמש ב-CEL בנפרד או להטמיע אותה במוצר גדול יותר. CEL מתאימה למגוון רחב של אפליקציות, מניתוב קריאות לשירות מרוחק (RPCs) ועד להגדרת מדיניות אבטחה. CEL היא פלטפורמה ניתנת להרחבה, עצמאית ומותאמת לתהליכי עבודה של הידור חד-פעמיים/הערכת הרבה.

תוכנית CEL תוכננה במיוחד באופן בטוח לביצוע קוד משתמש. מסוכן לבצע קריאה ל-eval() באופן עיוור בקוד python של המשתמש, אבל אפשר להריץ את קוד ה-CEL של המשתמש בבטחה. מאחר ש-CEL מונעת התנהגות שתגרום לירידה בביצועים, היא מבצעת הערכה בטוחה תוך ננו-שניות או מיליוניות השנייה. המהירות והבטיחות של CEL הופכות אותה לאידיאלית לאפליקציות שחיוניות לביצועים.

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

למה CEL?

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

כדוגמה להרחבת ההגדרות המוצהרות באמצעות CEL, הביאו בחשבון את היכולות של ניהול הזהויות והרשאות הגישה (IAM) ב-Google Cloud. בעוד ש-RBAC הוא המקרה הנפוץ, ב-IAM יש ביטויי CEL שמאפשרים למשתמשים להגביל עוד יותר את היקף המענק בהתאם לתפקיד, בהתאם למאפיינים של שליחת הודעות פרוטו של הבקשה או למשאבים שאליהם מתבצעת הגישה. תיאור התנאים האלה באמצעות מודל הנתונים עלול ליצור משטח API מורכב שקשה לעבוד איתה. במקום זאת, השימוש ב-CEL עם בקרת גישה מבוססת-מאפיינים (ABAC) הוא תוסף אקספרסיבי וחזק ל-RBAC.

מושגי ליבה של CEL

ב-CEL, הביטוי נוצר מול סביבה. בשלב ההידור נוצר עץ תחביר מופשט (AST) בפורמט מאגר לפרוטוקולים. ביטויים היצורים נשמרים לשימוש עתידי כדי שההערכה תתבצע מהר ככל האפשר. אפשר להעריך ביטוי מאוחד עם מספר קלטים שונים.

לפניך סקירה מפורטת יותר של כמה מהמושגים האלו.

ביטויים

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

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

דוגמה לביטוי CEL לאימות של אסימון הצהרות

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

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

סביבה

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

לדוגמה, הקוד הבא של textproto מצהיר על סביבה שמכילה את המשתנים request ו-now באמצעות ההודעה CompileRequest משירות CEL.

דוגמה להצהרה על סביבת CEL

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

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

שלבי עיבוד הביטוי

העיבוד של ביטויי CEL מחולק לשלושה שלבים:

  1. נתח
  2. בדיקה
  3. הערך

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

איור של שלבי העיבוד של CEL

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

פרוטוקול CEL מנותח מביטוי קריא (לבני אדם) ל-AST באמצעות תחביר מנתח ו-ANTLR – שיטת הניתוח מפיקה AST מבוסס-פרוטו-פרוטו, שבו כל צומת Expr ב-AST מכיל מזהה מספר שלם שמשמש ליצירת אינדקס למטא-נתונים שנוצרו במהלך הניתוח והבדיקה. הקובץ syntax.proto שנוצר במהלך הניתוח מייצג את הייצוג המופשט של מה שהוקלד בצורת מחרוזת של הביטוי.

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

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

לבודק ה-CEL נדרשים שלושה דברים:

  • קישורי פונקציות לכל תוסף מותאם אישית
  • קישורי משתנים
  • AST להערכה

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