Common Expression Language (CEL) היא שפת ביטויים לשימוש כללי, שנועדה להיות מהירה, ניידת ובטוחה להרצה. אפשר להשתמש ב-CEL לבד או להטמיע אותה במוצר גדול יותר. שפת CEL מתאימה למגוון רחב של אפליקציות, החל מניתוב של קריאות לשירות מרוחק (RPC) ועד להגדרת מדיניות אבטחה. CEL היא שפה ניתנת להרחבה, לא תלויה בפלטפורמה ומותאמת לזרימות עבודה של קומפילציה חד-פעמית והערכה רב-פעמית.
שפת CEL תוכננה במיוחד כדי לאפשר הפעלה בטוחה של קוד משתמש. מסוכן להריץ את eval()
באופן עיוור על קוד Python של משתמש, אבל אפשר להריץ קוד CEL של משתמש בצורה בטוחה. בנוסף, מכיוון ש-CEL מונעת התנהגות שתפגע בביצועים, היא מבצעת הערכה בטוחה בננו-שניות או במיקרו-שניות. המהירות והבטיחות של CEL הופכות אותו לאידיאלי לאפליקציות שבהן הביצועים הם קריטיים.
CEL מעריכה ביטויים שדומים לפונקציות של שורה אחת או לביטויי למדה. למרות שבדרך כלל משתמשים ב-CEL כדי לקבל החלטות בוליאניות, אפשר להשתמש בו גם כדי ליצור אובייקטים מורכבים יותר כמו הודעות JSON או הודעות של מאגר פרוטוקולים.
למה כדאי להשתמש ב-CEL?
הרבה שירותים ואפליקציות מעריכים הגדרות הצהרה. לדוגמה, בקרת גישה מבוססת-תפקידים (RBAC) היא הגדרה הצהרתית שמפיקה החלטת גישה בהינתן תפקיד משתמש וקבוצת משתמשים. הגדרות דקלרטיביות מספיקות ברוב המקרים, אבל לפעמים צריך יותר כוח ביטוי. כאן נכנס לתמונה CEL.
כדוגמה להרחבת הגדרה הצהרתית באמצעות CEL, אפשר לעיין ביכולות של ניהול זהויות והרשאות גישה (IAM) ב-Google Cloud. בדרך כלל משתמשים ב-RBAC, אבל IAM מציע ביטויי CEL שמאפשרים למשתמשים להגביל עוד יותר את היקף ההרשאה מבוססת התפקיד בהתאם למאפייני הודעת הפרוטו של הבקשה או של המשאבים שאליהם מתבצעת גישה. תיאור התנאים האלה באמצעות מודל הנתונים יגרום לממשק API מורכב שקשה לעבוד איתו. במקום זאת, שימוש ב-CEL עם בקרת גישה מבוססת-מאפיינים (ABAC) הוא הרחבה משמעותית ועוצמתית של RBAC.
מושגי ליבה של CEL
ב-CEL, הידור של ביטוי מתבצע בהתאם לסביבה. בשלב הקומפילציה נוצר עץ תחביר מופשט (AST) בפורמט protocol buffer. ביטויים שעברו קומפילציה מאוחסנים לשימוש עתידי כדי שההערכה תהיה מהירה ככל האפשר. אפשר להעריך ביטוי מורכב אחד עם הרבה קלטים שונים.
הנה הסבר מפורט יותר על חלק מהמושגים האלה.
הבעות
משתמשים כותבים את הביטויים. ביטויים דומים לגופי פונקציות של שורה אחת או לביטויי למדה. חתימת הפונקציה שמצהירה על הקלט נכתבת מחוץ לביטוי 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 { we
ll_known: "TIMESTAMP" }
}
}
ההצהרות שמבוססות על פרוטו משמשות את בודק הסוגים של CEL כדי לוודא שכל ההפניות למזהים ולפונקציות בתוך ביטוי מוצהרות ומשמשות בצורה נכונה.
שלבים בעיבוד ביטויים
ביטויי CEL מעובדים בשלושה שלבים:
- נתח
- המחאה
- הערך
הדפוס הנפוץ ביותר של שימוש ב-CEL הוא ניתוח ובדיקה של ביטויים בזמן ההגדרה, אחסון של AST ואז אחזור והערכה של AST שוב ושוב בזמן הריצה.
איור של שלבי העיבוד של CEL
המערכת מנתחת את CEL מביטוי שניתן לקריאה על ידי אדם ל-AST באמצעות לקסיקון ודקדוק של מנתח ANTLR. בשלב הניתוח נוצר AST מבוסס-פרוטוקול שבו כל צומת Expr
ב-AST מכיל מזהה מספרי שמשמש לאינדקס של מטא-נתונים שנוצרו במהלך הניתוח והבדיקה. קובץ syntax.proto
שנוצר במהלך הניתוח מייצג את הייצוג המופשט של מה שהוקלד בפורמט המחרוזת של הביטוי.
אחרי שמנתחים ביטוי, מתבצעת בדיקת סוגים בהתאם לסביבה כדי לוודא שכל המזהים של המשתנים והפונקציות בביטוי הוגדרו ונעשה בהם שימוש נכון. בודק הסוגים יוצר קובץ checked.proto
שכולל מטא-נתונים של סוג, משתנה ופתרון פונקציה, שיכולים לשפר באופן משמעותי את יעילות ההערכה.
לבסוף, אחרי שהביטוי עובר ניתוח ומתבצעת בדיקה, מתבצעת הערכה של ה-AST המאוחסן.
כדי להשתמש בכלי להערכת CEL, צריך שלושה דברים:
- קישורי פונקציות לכל תוסף בהתאמה אישית
- קישורי משתנים
- עץ תחביר מופשט להערכה
הפונקציה והמשתנים שמוגדרים בה צריכים להיות זהים לאלה ששימשו להידור של ה-AST. אפשר לעשות שימוש חוזר בכל אחד מהקלטות האלה בכמה הערכות. לדוגמה, אפשר להעריך עץ תחביר מופשט (AST) בכמה קבוצות של קשרי משתנים, להשתמש באותם משתנים בכמה עצי תחביר מופשטים או להשתמש בקשרי הפונקציות לאורך כל משך החיים של תהליך (מקרה נפוץ).