אימות והרשאה

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

תוכלו להגדיר את היכולות שסופקו על ידי Last Mile Fleet Solution באמצעות מסוף Google Cloud. כדי להשתמש בממשקי ה-API ובערכות ה-SDK האלה, צריך להשתמש באסימוני JWT (JSON Web Tokens) שנחתמו באמצעות חשבונות שירות שנוצרו ממסוף Cloud.

סקירה כללית

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

כדי להגן על קריאות לפונקציות שמקורן בסביבות עם אמון נמוך, Google תכננה מנגנון שבו הקוד יוצר אסימון בשרת הקצה העורפי – סביבה מהימנה באופן מלא. לכל שיחה יש תיאור אבטחה מלא, שמוצפן ל-JWT שמעבירים עם השיחה מכל סביבה.

עקרונות תכנון האימות

תהליך האימות של Fleet Engine כולל את עקרונות התכנון הבאים.

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

  • תפקידי IAM משויכים לחשבונות שירות.

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

  • בקשות שנשלחות אל Fleet Engine מכילות תמיד JWT.

    • מכיוון שאסימוני JWT משויכים לחשבונות שירות, בקשות שנשלחות למנוע Fleet משויכות באופן מרומז לחשבון השירות שמשויך ל-JWT.
  • כדי לבקש את ה-JWT המתאים שאפשר להעביר למנוע Fleet, קודם צריך להפעיל את הקוד בסביבה עם רמת אמון נמוכה.

  • Fleet Engine מבצע את בדיקות האבטחה הבאות:

    1. תפקידי IAM שמשויכים לחשבון השירות מספקים את ההרשאה הנכונה למתקשר לבצע את הקריאה ל-API.

    2. הצהרות ה-JWT שהועברו בבקשה מספקות את ההרשאה הנכונה למתקשר לבצע פעולות על הישות.

תהליך האימות

תרשים הרצף הבא מדגים את הפרטים של תהליך האימות.

  1. האדמין של הצי יוצר חשבונות שירות.

  2. האדמין של הצי מקצה תפקידי IAM ספציפיים לחשבונות השירות.

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

  4. אפליקציית הלקוח מבקשת JWT מהקצה העורפי של השותף. מגיש הבקשה יכול להיות אפליקציית Drive, אפליקציית הצרכן או אפליקציית מעקב.

  5. Fleet Engine מנפיק JWT עבור חשבון השירות הרלוונטי. אפליקציית הלקוח מקבלת את ה-JWT.

  6. אפליקציית הלקוח משתמשת ב-JWT כדי להתחבר ל-Flet Engine כדי לקרוא או לשנות נתונים, בהתאם לתפקידי IAM שהוקצו לה בשלב ההגדרה.

תרשים של רצף אימות

הגדרת פרויקט ב-Cloud

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

כדי ליצור פרויקט ב-Google Cloud:

  1. יצירת פרויקט ב-Google Cloud באמצעות מסוף Google Cloud.
  2. באמצעות ממשקי ה-API והשירותים, מפעילים את Local Rides and Deliveries API.

חשבונות שירות ותפקידי IAM

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

ב-Last Mile Fleet Solution נעשה שימוש בתפקידים הבאים:

תפקידתיאור
משתמש נהג מהימן במסירה למנועי חיפוש (Flet Engine)

roles/fleetengine.deliveryTrustedDriver
הענקת הרשאה ליצור ולעדכן רכבים ומשימות למסירה, כולל עדכון של מיקום כלי המסירה והסטטוס או התוצאה. אסימונים שהופקו על ידי חשבון שירות עם התפקיד הזה משמשים בדרך כלל מהמכשירים הניידים של נהג/ת המסירה או מהשרתים העורפיים שלך.
משתמש נהג לא מהימן במסירת מנוע חיפוש

roles/fleetengine.deliveryUntrustedDriver
הענקת הרשאה לעדכון מיקום כלי הרכב. באסימונים שהוטמעו על ידי חשבון שירות בתפקיד הזה, משתמשים בדרך כלל מהמכשירים הניידים של נהג/ת המסירה.
משתמש צרכן מסוג Fleet Engine Delivery

roles/fleetengine.deliveryConsumer
הענקת הרשאה לחפש משימות באמצעות מזהה לצורכי מעקב, ולקרוא את פרטי המשימות בלי לעדכן אותם. באסימונים שהוטמעו על ידי חשבון שירות עם התפקיד הזה, משתמשים בדרך כלל בדפדפן האינטרנט של צרכן המשלוחים.
משתמש-על במסירת מנועים של Fleet

roles/fleetengine.deliverySuperUser
מעניק הרשאה לכל ממשקי ה-API של המשימות ושל כלי המשלוח. אסימונים שהופקו על ידי חשבון שירות עם התפקיד הזה משמשים בדרך כלל מהשרתים העורפיים שלך.
קורא Fleet Engine Delivery Fleet

roles/fleetengine.deliveryFleetReader
הענקת הרשאה לקרוא כלי רכב ומשימות למסירה ולחפש משימות באמצעות מזהה לצורכי מעקב. באסימונים שהופקו על ידי חשבון שירות עם התפקיד הזה, משתמשים בדרך כלל מדפדפן האינטרנט של מפעיל שירותי המשלוחים.

ארגונים שמספקים לנהגי השליחויות מכשירים שמנוהלים על ידי ה-IT של החברה, יכולים לנצל את הגמישות של התפקיד 'משתמש נאמן של מנוע חיפוש' של Fleet Engine, ולבחור לשלב חלק מהאינטראקציות של Fleet Engine או את כולן באפליקציה לנייד.

ארגונים שתומכים במדיניות להביא את המכשיר שלכם בעצמכם צריכים לאשר את הבטיחות של התפקיד 'משתמש נהג לא מהימן של Fleet Engine' ולהסתמך רק על האפליקציה לנייד לשליחת עדכונים של מיקום כלי הרכב ל-Feet Engine. כל שאר האינטראקציות צריכות להגיע מהשרתים העורפיים של הלקוח.

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

יצירת חשבון שירות

אפשר ליצור חשבון שירות באמצעות הכרטיסייה IAM & Admin > Service Accounts במסוף Google Cloud. ברשימה הנפתחת Role, בוחרים באפשרות Flet 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.
  • מספקת מנגנוני חתימה של אסימונים מלבד שימוש בקובצי פרטי כניסה (כמו התחזות לחשבון שירות).
  • צירוף אסימונים חתומים לבקשות יוצאות שנשלחות מ-stub של gRPC או מלקוח GAPIC.

יצירת אסימון אינטרנט מסוג JSON (JWT) להרשאה

כשלא משתמשים ב-Feet Engine Auth Library, צריך ליצור את אסימוני ה-JWT ישירות ב-codebase. לשם כך נדרשת הבנה עמוקה לגבי אסימוני JWT ואיך הם קשורים ל-Flet Engine. לכן אנחנו ממליצים מאוד לנצל את ספריית Fleet Engine Auth.

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

קטע של כותרת JWT מכיל את השדות הבאים:

שדהתיאור
alg האלגוריתם שבו צריך להשתמש. 'RS256'.
typ סוג האסימון. 'JWT'.
ילד מזהה המפתח הפרטי של חשבון השירות שלך. הערך הזה מופיע בשדה 'private_key_id' בקובץ ה-JSON של חשבון השירות. חשוב להשתמש במפתח מחשבון שירות עם רמת ההרשאות הנכונה.

קטע של תלונות JWT מכיל את השדות הבאים:

שדהתיאור
iss כתובת האימייל של חשבון השירות שלכם.
sub כתובת האימייל של חשבון השירות שלכם.
אודיו SERVICE_NAME של חשבון השירות שלך, במקרה הזה https://fleetengine.googleapis.com/
Iat חותמת הזמן של מועד יצירת האסימון, שצוינה בשניות שחלפו מ-00:00:00 UTC, 1 בינואר 1970. יש להמתין 10 דקות לפני הטיה. אם חותמת הזמן רחוקה מדי בעבר או בעתיד, השרת עשוי לדווח על שגיאה.
exp חותמת הזמן של מועד פקיעת התוקף של האסימון, שמצוינת בשניות שחלפו מ-00:00:00 UTC, 1 בינואר 1970. הבקשה תיכשל אם חותמת הזמן היא יותר משעה אחת בעתיד.
הרשאה בהתאם לתרחיש לדוגמה, הוא עשוי להכיל '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 - לשימוש בעת התקשרות ל-SearchTasksAPI. ההצהרה צריכה להיות זהה למזהה לצורכי מעקב שצוין בבקשה. אין לכלול תלונות על הפרת זכויות יוצרים delivervehicleid, taskid או taskids.

האסימון צריך לכלול גם את ההצהרה המתאימה בזמן קריאה לממשקי API משרת הקצה העורפי, אבל אפשר להשתמש בערך המיוחד של כוכבית ("*") להצהרות deliveryvehicleid, taskid ו-trackingid. ניתן להשתמש גם בכוכבית ("*") בהצהרה taskids, אבל היא חייבת להיות הרכיב היחיד במערך.

אם רוצים ליצור קובץ JSON ולחתום עליו ישירות למוכ"ז של האסימון, במקום להשתמש באסימוני גישה מסוג OAuth 2.0, כדאי לקרוא את ההוראות להרשאה לחשבון שירות ללא OAuth במסמכי התיעוד של Identity Developer.

המנגנון לצירוף האסימון לקריאה ל-gRPC תלוי בשפה וב-framework שמשמשות לביצוע הקריאה. המנגנון לציון אסימון לקריאה ל-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.

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