שימוש ב-Common Expression Language
בדף הזה מוסבר איך אפשר להשתמש ב-Common Expression Language (CEL) עם מדיניות הנפקת אישורים, תבניות אישורים ותנאים של ניהול זהויות והרשאות גישה (IAM) במאגר רשויות האישורים.
סקירה כללית
Common Expression Language (CEL) היא שפה בקוד פתוח שאינה שלמה לפי טיורינג, שמיישמת סמנטיקה משותפת להערכת ביטויים. Certificate Authority Service תומך ב-CEL כדי לאכוף אמצעי בקרה שונים של מדיניות להנפקת אישורים.
יש שני ניבים של CEL שאפשר להשתמש בהם עם שירות CA:
- ניב גמיש שאפשר להשתמש בו במדיניות הנפקת האישורים ובמאגרי האישורים של CA.
- ניב מוגבל יותר שאפשר להשתמש בו בתנאי IAM.
ניב CEL למדיניות הנפקת אישורים ולתבניות אישורים
כשיוצרים מאגר CA או תבנית אישור, אפשר לציין ביטוי CEL כחלק מהגבלות הזהות של האישור. הביטוי ב-CEL מאפשר לאמת את השדות Subject (נושא) ו-Subject Alternative Name (שם חלופי לנושא, SAN).
מידע נוסף על מדיניות הנפקת אישורים
מידע נוסף על תבניות אישורים זמין במאמר סקירה כללית על אמצעי בקרה של מדיניות.
ניב CEL לאילוצי הזהות של מאגרי CA ותבניות אישורים חושף את המשתנים הבאים לגישה לשדות הנושא וה-SAN ולאימות שלהם:
- נושא:
subject - SAN:
subject_alt_names
נושא
אפשר לאמת את כל השדות בשם הדומיין של נושא האישור (כולל השם הנפוץ), כפי שמצוין בבקשת האישור באמצעות משתנה מסוג Subject ובשם subject.
Subject הוא מבנה שמכיל את השדות הבאים:
| סוג | שם |
|---|---|
String |
common_name |
String |
country_code |
String |
ארגון |
String |
organizational_unit |
String |
רשות מוניציפאלית |
String |
מחוז |
String |
street_address |
String |
postal_code |
שמות חלופיים לנושא (SAN)
אפשר לאמת את כל שמות ה-SAN שצוינו בבקשת האישור באמצעות המשתנה subject_alt_names. המשתנה subject_alt_names מכיל רשימה של מבני SAN, כאשר כל SAN הוא מסוג SubjectAltName.
SubjectAltName הוא מבנה נתונים שמכיל את השדות הבאים:
| סוג | שם |
|---|---|
String |
value |
[]Int32 |
oid |
Enum |
סוג |
אפשר להשתמש בערכים הבאים לסוג SubjectAltName:
DNSURIEMAILIP_ADDRESSCUSTOM
המשתנה subject_alt_names מכיל רשימה עם כל שמות ה-SAN המבוקשים.
אפשר להשתמש בפקודות המאקרו הבאות ב-SAN:
subject_alt_names.all(san, predicate)subject_alt_names.exists(san, predicate)subject_alt_names.exists_one(san, predicate)subject_alt_names.filter(san, predicate)
מידע נוסף על מאקרו זמין במאמר הגדרת שפה: מאקרו.
ביטויים לדוגמה
איך מוודאים ששם נפוץ ספציפי וקבוצה של מדינות
subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")
הבטחה שכל שמות ה-DNS יסתיימו במחרוזת בהתאמה אישית
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
מוודאים שכל ה-SAN הם מסוג DNS או EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
הבטחה שיהיה רק SAN מותאם אישית אחד עם OID ספציפי
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
הקפדה על כך שכתובות ה-SAN המותאמות אישית הן רק קבוצה של מזהי OID
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
ניב CEL לכללי מדיניות IAM
משתמשים בתנאים של IAM כדי להחיל ביטוי מותנה על קישורי תפקידים ב-IAM. אם התנאי מקבל את הערך true, קישור התפקיד ב-IAM תקף. אחרת, המערכת מתעלמת ממנו. שירות CA מאפשר להוסיף קישורי תנאים של IAM למאגר CA.
התנאי ב-IAM הוא ביטוי CEL שמפנה לקבוצה של מאפיינים הקשריים לגבי הבקשה, והערך המחושב שלו הוא בוליאני. משתמשים מגדירים תנאים לקישורי התפקידים במדיניות IAM, שמאוחסנת על ידי IAM ונבדקת כדי לראות אם הפעולה שעומדת להתבצע מותרת.
מידע נוסף על תנאי IAM מופיע במאמר סקירה כללית על תנאי IAM.
המאפיינים הבאים נחשפים במהלך הערכת CEL של תנאי IAM:
privateca.googleapis.com/subjectהפריט
privateca.googleapis.com/subjectנגיש בתורapi.getAttribute('privateca.googleapis.com/subject', {}).
| סוג | תיאור |
|---|---|
map{string, string} |
השדה הזה מכיל את השם המובחן של הנושא (כולל השם הנפוץ) כפי שצוין בבקשה הנכנסת לאישור. דוגמה { |
privateca.googleapis.com/subject_alt_namesהפריט
privateca.googleapis.com/subject_alt_namesנגיש בתורapi.getAttribute('privateca.googleapis.com/subject_alt_names', []).
| סוג | תיאור |
|---|---|
list{string} |
השדה הזה מכיל את כל שמות ה-SAN המבוקשים, כפי שצוינו בבקשת האישור הנכנסת. לכל אחד משמות ה-SAN המבוקשים מצורפת קידומת שמציינת את הסוג שלו. לערכי SAN עם סוגים לא ידועים מתווספת התחילית של ה-OID הסדרתי של הסוג. דוגמה { |
privateca.googleapis.com/templateהפריט
privateca.googleapis.com/templateנגיש בתורapi.getAttribute('privateca.googleapis.com/template', '').
| סוג | תיאור |
|---|---|
String |
תבנית האישור שבה נעשה שימוש, אם יש כזו. הפורמט הוא {project_id}/-/{template_id}.דוגמה: my-project-pki/-/workload_tls |
בתחביר של התבנית נעשה שימוש ב-{project_id}/-/{template_id} במקום בשם המלא הרגיל של המשאב projects/{project_id}/locations/{location}/certificateTemplates/{template_id}, כי תבניות של אישורים צריכות להיות באותו מיקום כמו מאגר רשויות האישורים.
בפורמט הזה, המקף (-) פועל כתו כללי לחיפוש מיקום, וכך תנאי ה-CEL נשארים תמציתיים, קריאים ולא תלויים במיקום.
שם התבנית שצוין בתנאי IAM חייב להיות זהה לשם התבנית בבקשת האישור. לכן, אם מציינים מזהה פרויקט במאפיין privateca.googleapis.com/template של ביטוי CEL, צריך לציין מזהה פרויקט גם כשמבקשים את האישור. אם מציינים מספר פרויקט בביטוי CEL, צריך לציין מספר פרויקט גם בבקשת האישור.
ביטויים לדוגמה
מוודאים שכל הנושאים מוגדרים עם הארגון 'דוגמה' וקידומת המדינה US או UK
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
לוודא שבקשת האישור כוללת רק את שמות ה-SAN של ה-DNS שצוינו
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
איך מוודאים שכל האישורים משתמשים בתבנית ספציפית
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
המאמרים הבאים
- מבוא ל-CEL
- מידע נוסף על הגדרת השפה ב-CEL
- מידע על תבניות של אישורים ומדיניות הנפקת אישורים
- מומלץ לקרוא את הסקירה הכללית על התנאים ב-IAM.
- איך מוסיפים מדיניות הנפקת אישורים למאגר של רשויות אישורים