בקטע הזה מוסברים המושגים של אימות והרשאה באמצעות ביחס לשילוב עם Fleet Engine.
אפשר להגדיר את היכולות שמסופקות על ידי Last Mile Fleet Solution באמצעות מסוף Google Cloud. ערכות SDK של כלל המכשירים בארגון לדרוש שימוש באסימוני JWT (JSON Web Tokens) שנחתמו על ידי שירות מתאים חשבון.
סקירה כללית
קצוות עורפיים של הלקוח לאימות ולהרשאה מול Fleet Engine צריכים להשתמש ברירת מחדל של אפליקציה רגילה פרטי כניסה על מנגנוני תשומת לב.
ה-Fleet Engine גם מקבל קריאות שמגיעות מסביבות עם רמת אמון נמוכה כמו סמארטפונים ודפדפנים. להגנה רק על מפתחות סודיים של חשבונות שירות מתאימים לסביבות אמינות, קצוות עורפיים צפויים ליצור אסימוני JWT (JSON Web Tokens) עם הצהרות נוספות ספציפיות ל-Fleet Engine שיכול להיות נשלח לסביבות לא מהימנות כמו טלפונים ניידים.
עקרונות לעיצוב אימות
תהליך האימות ב-Fleet Engine כולל את עקרונות התכנון הבאים.
תפקידי IAM מגדירים קבוצת ההרשאות למשאבים שמורשים לחשבון משתמש. לדוגמה, תפקידי אדמין מורשים לעשות כל מה שצריך ב-Application Default פרטי כניסה, אבל התפקיד 'נהג לא מהימן*' מותר לעדכן רק. מיקום הרכב ומוגבל לשימוש באסימוני JWT לאימות, אישור.
בסביבות לא אמינות, הצהרות JWT מגבילות עוד יותר את הישויות ייתכן שהמתקשר פועל. משימות כאלה יכולות להיות משימות ספציפיות או רכבי משלוח.
הקוד שפועל בסביבה לא מהימנה צריך להפעיל קודם פועל בסביבה מהימנה כדי להנפיק JWT.
Fleet Engine מבצע את בדיקות האבטחה הבאות בקריאות ל-API עבור resource:
לחשבון המשתמש ששולח את הקריאה יש את ההרשאות המתאימות (באמצעות התפקיד הקצאה) לפעולה במשאב.
לתפקידים שאינם אדמין, הצהרות ה-JWT שהועברו בבקשה מספקות את את ההרשאה הנדרשת למשאב.
תהליך האימות
תרשים הרצף הבא מדגים את הפרטים האלה של תהליך האימות.
האדמין של הצי יוצר חשבונות שירות.
האדמין של כלל המכשירים בארגון מקצה תפקידי IAM ספציפיים לחשבונות השירות.
האדמין של כלל המכשירים בארגון מגדיר את הקצה העורפי שלו עם חשבונות השירות ו-Application Default Credentials
אפליקציית הלקוח מבקשת JWT מהקצה העורפי של הלקוח. המבקש יכול אפליקציית הנהג, אפליקציית הצרכן או אפליקציית מעקב.
הקצה העורפי של הלקוח חותם ומנפיק JWT עבור השירות המתאים חשבון. אפליקציית הלקוח מקבלת את ה-JWT.
אפליקציית הלקוח משתמשת ב-JWT כדי להתחבר ל-Fleet Engine כדי לקרוא או לשנות בהתאם לתפקידי IAM שהוקצו להם בשלב ההגדרה.
הגדרת פרויקט בענן
כדי להגדיר את הפרויקט בענן, קודם צריך ליצור את הפרויקט ואז ליצור חשבונות שירות.
כדי ליצור את הפרויקט ב-Google Cloud:
- יוצרים פרויקט ב-Google Cloud באמצעות מסוף Google Cloud.
- באמצעות מרכז השליטה של ממשקי ה-API והשירותים, הפעל את API מקומי של נסיעות ומשלוחים.
חשבונות שירות תפקידי IAM
חשבון שירות הוא סוג מיוחד של חשבון שמשמש אפליקציה, ולא אדם. בדרך כלל, חשבון שירות משמש להנפקה של אסימוני JWT שמעניקים קבוצות של הרשאות, בהתאם לתפקיד. כדי לצמצם את הסיכון לניצול לרעה אפשר ליצור כמה חשבונות שירות, שכל אחד מהם עם קבוצת התפקידים המינימלית נדרש ().
ל-Last Mile Fleet Solution משתמשים בתפקידים הבאים:
תפקיד | תיאור |
---|---|
משתמש נהג מהימן למסירה ב-Fleet Engine
roles/fleetengine.deliveryTrustedDriver |
מעניק הרשאה ליצור ולעדכן רכבים ומשימות למשלוח, כולל עדכון המיקום וסטטוס המשימה של המשלוח או לתוצאה אחרת. אסימונים שנוצרו על ידי חשבון שירות עם התפקיד הזה משמשים בדרך כלל מהמכשירים הניידים של נהג המשלוח שלכם או בשרתים העורפיים. |
משתמש לא מהימן של נהג לא מהימן למסירה ב-Fleet Engine
roles/fleetengine.deliveryUntrustedDriver |
התפקיד הזה מאפשר לעדכן את מיקום הרכב למשלוח. אסימונים שהוטבעו בחשבון שירות עם התפקיד הזה בדרך כלל משמש מההעברה שלכם במכשירים הניידים של הנהג. |
משתמש צרכן למשלוחי Fleet
roles/fleetengine.deliveryConsumer |
התפקיד הזה מאפשר לחפש משימות באמצעות מזהה לצורכי מעקב, ולקרוא את פרטי המשימה, אבל לא לעדכן אותם. אסימונים שהוטבעו בחשבון שירות עם התפקיד הזה, בדרך כלל משתמשים בדפדפן האינטרנט של הצרכן. |
אדמין מסירה של מנועי Fleet
roles/fleetengine.deliveryAdmin |
התפקיד הזה מאפשר לקרוא ולכתוב למשאבי ההעברה. מנהלי בתי ספר בתפקיד הזה לא צריכים להשתמש באסימוני JWT, ועדיף להשתמש באסימוני Application פרטי הכניסה שמוגדרים כברירת מחדל. המערכת מתעלמת מהצהרות JWT מותאמות אישית. התפקיד הזה צריך להיות מוגבל לסביבות מהימנות (הקצה העורפי של הלקוח). |
roles/fleetengine.deliverySuperUser |
התפקיד הזה מאפשר לכל ממשקי ה-API של משימות ורכבי משלוחים. אסימונים שהוטבעו על ידי חשבון שירות עם התפקיד הזה, בדרך כלל משמש מהקצה העורפי שלך שרתים. |
בעל הרשאת קריאה של כלל המכשירים למסירה של Fleet Engine
roles/fleetengine.deliveryFleetReader |
התפקיד הזה מאפשר לקרוא רכבים ומשימות למסירה ולחפש רכבים משימות באמצעות מזהה לצורכי מעקב. אסימונים שנוצרו על ידי חשבון שירות באמצעות בדרך כלל משתמשים בו מדפדפן האינטרנט של מפעיל כלל משלוחים. |
ארגונים שמספקים לנהגי המשלוחים שלהם מכשירים שמנוהלים על ידי צוות IT ארגוני יכול לנצל את הגמישות שמוצעת על ידי Fleet Engine התפקיד 'משתמש Drive מהימן' ואפשרות לשלב חלק מ-Fleet Engine או את כולו אינטראקציות באפליקציה לנייד.
ארגונים שתומכים במדיניות 'הבאת מכשיר משלך' צריכים לבחור הבטיחות של התפקיד 'משתמש נהיגה לא מהימן' ב-Fleet Engine, מסתמכים רק על אפליקציה לנייד לשליחת עדכונים לגבי מיקום הרכבים אל Fleet Engine. כל השאר האינטראקציות צריכות להגיע מהשרתים בקצה העורפי של הלקוח.
ערכות ה-SDK לנהגים ולצרכנים מבוססות על התפקידים הרגילים האלה. אבל אפשר ליצור תפקידים בהתאמה אישית. שמאפשרות לקבוצה שרירותית של הרשאות. בערכות ה-SDK של מנהל התקן והצרכן יוצגו הודעות שגיאה כאשר חסרה ההרשאה הנדרשת. לכן, אנחנו ממליצים מאוד באמצעות קבוצת התפקידים הרגילה שמוצגת למעלה, במקום תפקידים בהתאמה אישית.
יצירת חשבון שירות
אפשר ליצור חשבון שירות באמצעות IAM & Admin > Service Accounts
במסוף Google Cloud. מהרשימה הנפתחת 'תפקיד', בוחרים
Fleet Engine ומקצים אחד מהתפקידים לחשבון השירות. כדאי
כדי לציין את החשבון שמשויך לכל תפקיד.
לדוגמה, נותנים לחשבון השירות שם בעל משמעות.
מטעמי נוחות, אם אתם צריכים להנפיק אסימוני JWT עבור לקוחות לא מהימנים, הוסיפו משתמשים בתפקיד 'יצירת אסימונים בחשבון שירות', מאפשרים להם להנפיק אסימונים באמצעות כלי שורת הפקודה של gcloud.
gcloud projects add-iam-policy-binding project-id \ --member=user:my-user@example.com \ --role=roles/iam.serviceAccountTokenCreator
כאשר my-user@example.com
הוא האימייל המשמש
ביצוע אימות באמצעות gcloud (gcloud auth list
--format='value(account)'
).
ספריית אימות של Fleet Engine
ב-Fleet Engine משתמשים באסימוני JWT כדי להגביל את הגישה לממשקי API של Fleet Engine במקומות לא מהימנים בסביבות שונות. ספריית Fleet Engine Auth, זמינה באתרים הבאים: GitHub הוא פשוט יותר לבניית אסימוני JWT של Fleet Engine וחותמים עליהם בצורה מאובטחת.
הספרייה מספקת את היתרונות הבאים:
- מפשט את תהליך היצירה של אסימוני Fleet Engine.
- מספקת מנגנוני חתימת אסימונים שאינם שימוש בקובצי פרטי כניסה (כמו התחזות לחשבון שירות).
יצירת אסימון רשת מבוסס JSON (JWT) להרשאה
כשלא משתמשים בספריית האימות של Fleet Engine, אסימוני JWT צריכים שנוצר ישירות ב-codebase שלכם. לשם כך צריך להיות לכם גם להבין את אסימוני ה-JWT ואיך הם קשורים ל-Fleet Engine. לכן אנחנו מומלץ מאוד להשתמש בספריית Fleet Engine Auth.
בתוך Fleet Engine, אסימוני JWT מספקים אימות לטווח קצר ולוודא שמכשירים יכולים לשנות רק כלי רכב או משימות עבור שהם מורשים. אסימוני JWT מכילים כותרת וקטע הצהרה על זכויות יוצרים. קטע הכותרת מכיל מידע כמו מפתח פרטי לשימוש (המתקבל מחשבונות שירות) וההצפנה באלגוריתם כלשהו. הקטע של התלונה מכיל מידע כמו זמן היצירה של האסימון, זמן החיים של האסימון, השירותים שבהם האסימון טענה לגישה אל, ומידע אחר על הרשאה לצורך צמצום היקף גישה; כמו מזהה הרכב למשלוח.מקטע כותרת JWT מכיל את השדות הבאים:
שדה | תיאור |
---|---|
alg |
האלגוריתם שבו צריך להשתמש. 'RS256'. |
typ |
סוג האסימון. JWT. |
kid |
מזהה המפתח הפרטי של חשבון השירות שלכם. אפשר למצוא את הערך הזה בשדה 'private_key_id' בקובץ ה-JSON של חשבון השירות. צריך להקפיד להשתמש במפתח מחשבון שירות עם רמת ההרשאות המתאימה. |
קטע של הצהרות JWT מכיל את השדות הבאים:
שדה | תיאור |
---|---|
iss |
כתובת האימייל של חשבון השירות שלכם. |
sub |
כתובת האימייל של חשבון השירות שלכם. |
aud |
SERVICE_NAME של חשבון השירות שלך, במקרה הזה https://fleetengine.googleapis.com/ |
iat |
חותמת הזמן של מועד יצירת האסימון, צוינה בשניות שחלפו מ-00:00:00 UTC, 1 בינואר 1970. ממתינים 10 דקות להטיה. אם המועד של חותמת הזמן רחוק מדי בעבר. אחרת, השרת עשוי לדווח על שגיאה. |
exp |
חותמת הזמן של זמן התפוגה של האסימון, מצוינת בשניות שחלפו מ-00:00:00 UTC, 1 בינואר 1970. הבקשה תיכשל אם חותמת הזמן בעוד יותר משעה. |
authorization |
בהתאם לתרחיש לדוגמה, הוא עשוי לכלול 'deliveryvehicleid', 'trackingid', 'taskid' או 'taskids'. |
הטמעת אסימון JWT היא חתימה עליו. להוראות ולדוגמאות קוד ליצירה ולחתימה של ה-JWT. תוכלו לקרוא הרשאה לחשבון שירות ללא OAuth. לאחר מכן אפשר לצרף אסימון מוטמע לקריאות ל-gRPC או לשיטות אחרות שבהן נעשה שימוש כדי לגשת ל-Fleet Engine.
הצהרות JWT
הפתרון של Last Mile Fleet Solution משתמש בתלונות פרטיות. השימוש בתלונות פרטיות מבטיח שרק
לקוחות מורשים יכולים לגשת לנתונים שלהם. לדוגמה, כשהקצה העורפי
מנפיק אסימון אינטרנט מסוג JSON עבור המכשיר הנייד של מנהל המשלוח,
מכילים את ההצהרה deliveryvehicleid
עם הערך של המסירה על ידי הנהג
במזהים של כלי הרכב. לאחר מכן, בהתאם לתפקיד הנהג, אסימונים מאפשרים גישה רק עבור
מזהה הרכב הספציפי לספק ולא כל מזהה רכב שרירותי אחר.
הפתרון של Last Mile Fleet Solution משתמש בהצהרות הפרטיות הבאות:
deliveryvehicleid
- משמש בקריאה לממשקי API של כלי הרכב למשלוח.taskid
– לשימוש במהלך קריאה לממשקי API לכל משימה.taskids
- לשימוש במהלך שיחה אלBatchCreateTasksAPI
. תביעה זו חייבת להיות בפורמט של מערך, והמערך צריך להכיל את כל מזהי המשימות שדרושים להשלים את הבקשה. אין לכלולdelivervehicleid
,trackingid
אוtaskid
תלונות.trackingid
- לשימוש כשמבצעים קריאה לGetTaskTrackingInfoAPI
. התלונה חייבת תואם למזהה לצורכי מעקב שצוין בבקשה. אין לכלולdelivervehicleid
,taskid
אוtaskids
תלונות.
האסימון חייב לכלול גם את ההצהרה המתאימה כשמבצעים קריאה לממשקי API
משרת הקצה העורפי שלכם, אבל אפשר להשתמש בערך המיוחד של כוכבית.
("*") לתלונות מסוג deliveryvehicleid
, taskid
ו-trackingid
. הכוכבית
("*") יכול לשמש גם בהצהרה taskids
, אבל הוא חייב להיות הרכיב היחיד
במערך.
אם רוצים ליצור קובץ JSON ולחתום עליו ישירות כנושא אסימונים, במקום באמצעות אסימוני גישה מסוג OAuth 2.0, עליך לקרוא את ההוראות עבור הרשאה לחשבון שירות ללא OAuth במסמכי התיעוד למפתחים של זהויות.
המנגנון לצירוף האסימון לקריאה ל-gRPC תלוי בשפה והמסגרת שמשמשת לביצוע השיחה. המנגנון לציון אסימון בקריאת HTTP היא לכלול כותרת Authorization עם אסימון למוכ"ז שהערך שלו הוא האסימון, כפי שצוין בהערות ההרשאה של מעקב אחר משלוחים או ביצועים של כלל המכשירים במקרים שונים.
הדוגמה הבאה מציגה אסימון לפעולה לכל משימה מה שרת עורפי:
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"taskid": "*"
}
}
הדוגמה הבאה מציגה אסימון לפעולה של יצירת משימות באצווה מה שרת עורפי:
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"taskids": ["*"]
}
}
הדוגמה הבאה מציגה אסימון לפעולת כלי רכב לכל מסירה של הרכב שרת הקצה העורפי שלך:
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"deliveryvehicleid": "*"
}
}
בדוגמה הבאה מוצג אסימון ללקוחות של משתמשי קצה:
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_consumer_service_account"
}
.
{
"iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
"sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"trackingid": "shipment_12345"
}
}
בדוגמה הבאה מוצג אסימון לאפליקציית הנהגים שלכם:
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_driver_service_account"
}
.
{
"iss": "driver@yourgcpproject.iam.gserviceaccount.com",
"sub": "driver@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"deliveryvehicleid": "driver_12345"
}
}
- בשדה
kid
שבכותרת, מציינים את הגדרת הפרטיות של חשבון השירות למזהה המפתח. אפשר למצוא את הערך הזה בשדהprivate_key_id
של קובץ JSON של חשבון השירות. - בשדות
iss
ו-sub
, צריך לציין את כתובת האימייל של חשבון השירות. אפשר למצוא את הערך הזה בשדהclient_email
בחשבון השירות קובץ JSON. - בשדה
aud
מציינים https://SERVICE_NAME/. - בשדה
iat
מציינים את חותמת הזמן של מועד יצירת האסימון. בשניות שחלפו מאז 00:00:00 (שעון UTC), 1 בינואר 1970. המתנה של 10 דקות בנושא הטיה. אם חותמת הזמן רחוקה מדי בעבר או בעתיד, המאפיין השרת עשוי לדווח על שגיאה. - בשדה
exp
מציינים את חותמת הזמן של מועד התפוגה של האסימון, בשניות מאז 00:00:00 (שעון UTC), 1 בינואר 1970. הערך המומלץ הואiat
+ 3600.
כשחותמים על האסימון להעברה למכשיר נייד או למשתמש קצה, צריך לוודא כדי להשתמש בקובץ פרטי הכניסה לתפקיד 'נהג/ת מסירה' או 'צרכן'. אחרת, המכשיר הנייד או משתמש הקצה יוכלו לשנות את ההגדרות או להציג אותן מידע שלא אמורה להיות להם גישה אליו.