אימות והרשאה

בקטע הזה מוסברים המושגים של אימות והרשאה באמצעות ביחס לשילוב עם 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:

    1. לחשבון המשתמש ששולח את הקריאה יש את ההרשאות המתאימות (באמצעות התפקיד הקצאה) לפעולה במשאב.

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

תהליך האימות

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

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

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

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

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

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

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

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

הגדרת פרויקט בענן

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

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

  1. יוצרים פרויקט ב-Google Cloud באמצעות מסוף Google Cloud.
  2. באמצעות מרכז השליטה של ממשקי ה-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 מותאמות אישית. התפקיד הזה צריך להיות מוגבל לסביבות מהימנות (הקצה העורפי של הלקוח).
סופר-משתמש ב-Fleet Engine Delivery **(הוצא משימוש)**

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.

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