סקירה כללית של תצוגות עם פרמטרים

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

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

  • להעביר פרמטרים של הקשר בזמן השאילתה, כמו זהות המשתמש או הדייר, להגדרה של תצוגה.
  • הגבלת תוצאות השאילתה רק לשורות שתואמות לפרמטרים שצוינו.
  • למנוע ממשתמשים לעקוף מסנני נתונים ברמת האפליקציה בשאילתות SQL שנוצרו או בשאילתות SQL אד-הוק.

מידע נוסף זמין במאמר יצירת תצוגה עם פרמטרים.

איך פועלות תצוגות עם פרמטרים

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

הפונקציה SECURE_CONTEXT() מספקת את ממשק ה-SQL לגישה לפרמטרים המאובטחים האלה בהגדרה של תצוגה. תצוגות עם פרמטרים דורשות את מודל האבטחה definer's rights view, שבו התצוגה משתמשת ב-SECURE_CONTEXT() כדי לגשת לערכים ולסנן תוצאות.

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

CREATE VIEW MyUserData
SQL SECURITY DEFINER AS
(SELECT *
FROM AllUserData
WHERE UserID = CAST(SECURE_CONTEXT('user_id'), INT));

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

CREATE VIEW SafeUserData
SQL SECURITY DEFINER AS
(SELECT UserID, AccountCreationTime, PublicProfileText
FROM AllUserData
WHERE SECURE_CONTEXT('role') = 'Moderator');

אפשר להשתמש ב-SECURE_CONTEXT() בכל מקום בהגדרה של שאילתת תצוגה, אבל כדי לשפר את הביצועים מומלץ להשתמש בה בסעיף WHERE כדי לסנן לפי עמודות המפתח המובילות של טבלה או אינדקס. כך Spanner יכול להעביר ביעילות את לוגיקת הסינון לשכבת האחסון.

כברירת מחדל, שליחת שאילתה לפונקציה SECURE_CONTEXT() ישירות בשאילתה אד-הוק נכשלת, אלא אם לתפקיד במסד הנתונים יש את התפקיד spanner_secure_context_reader. כך משתמשים ללא הרשאות לא יכולים לבדוק ישירות את ערכי הפרמטרים.

דפוס מומלץ הוא לשלב תצוגות עם פרמטרים עם תצוגות של זכויות מגדיר ובקרת גישה פרטנית (FGAC). כדי לוודא שהמשתמשים יכולים לשלוח שאילתות רק דרך התצוגה:

  1. מפעילים את FGAC ויוצרים תפקיד במסד הנתונים לאפליקציה.
  2. GRANT את ההרשאה SELECT בתצוגה לתפקיד.
  3. מוודאים שלתפקיד המערכת public לא הוקצו הרשאות במסדי הנתונים הטבלאיים או בתצוגות.

לדוגמה:

-- Create a role for the application user
CREATE ROLE pv_user;

-- Grant SELECT permission on the view to the role
GRANT SELECT ON VIEW MyUserData TO ROLE pv_user;

אחרי שיוצרים את התצוגה עם הפרמטרים, התהליך של בקשה רגילה הוא:

  1. האפליקציה מגדירה את ההקשר המאובטח בבקשת שאילתה. ההקשר מכיל מידע שמזהה את המשתמש באפליקציה, כמו מזהה משתמש או תפקיד.
  2. האפליקציה מריצה שאילתה בתצוגה של זכויות המגדיר.
  3. התצוגה משתמשת בפונקציה SECURE_CONTEXT() בסעיף WHERE כדי לסנן שורות על סמך הערכים שסופקו בהקשר המאובטח.
  4. ‫Spanner מחזיר רק את השורות שתואמות למסנן, ומסנן את תוצאות השאילתה לנתונים שמשויכים להקשר של הסשן של המשתמש.

לדוגמה, אפליקציה יכולה להעביר את מזהה המשתמש הנוכחי בהקשר המאובטח באמצעות אחת מספריות הלקוח של Spanner. בדוגמה הבאה נעשה שימוש בספריית הלקוח של C++‎ כדי להגדיר את הפרמטר המאובטח user_id:

(*request.mutable_secure_context())["user_id"] = "ca6095c4-1a68-44a8-9562-dd9e897326f0";

לאחר מכן, האפליקציה מריצה שאילתת SQL סטנדרטית בתצוגה. התצוגה משתמשת ב-user_id בסעיף WHERE כדי להחזיר רק את הרשומות ששייכות לאותו משתמש:

--Query executed by the application
SELECT * FROM MyUserData;

היתרונות של תצוגות מפורמטות

הפרמטרים עוזרים לכם להשיג את המטרות הבאות:

  • בידוד נתוני דיירים באפליקציות עם כמה דיירים: שימוש בפרמטרים כדי לוודא שהשאילתות מחזירות נתונים רק לדייר ספציפי.

  • הגבלת שאילתות של AI אקטיבי: הגבלת שאילתות בשפה טבעית לנתונים של משתמש או דייר (tenant).

  • סינון נתונים באמצעות פרטי כניסה זמניים: הגבלת הגישה לנתונים על סמך מזהה משתמש או מזהה דייר שלא קיים בניהול זהויות והרשאות גישה (IAM).

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

צמצום סיכוני אבטחה

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

  • הנחיות זדוניות: משתמשים עלולים לנסות לשנות את המודל הבסיסי כדי לגשת לכל נתוני האפליקציה.
  • שאילתות SQL בהיקף רחב: מודלים גדולים של שפה (LLM) עלולים ליצור שאילתות SQL שחושפות מידע אישי רגיש, גם אם השאילתות של המשתמשים נוצרו מתוך כוונה טובה.

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

שיטות מומלצות

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

  • שילוב עם תצוגות של זכויות מגדיר ו-FGAC: משתמשים בפרמטרים כחלק ממודל אבטחה מקיף שכולל תצוגות של זכויות מגדיר ותפקידים של בקרת גישה ברמה מפורטת. מקצים לתפקיד SELECT הרשאות רק בתצוגות, ומוודאים שלתפקיד ולתפקיד המערכת public אין הרשאות במסדי הנתונים הטבלאיים הבסיסיים.

  • שימוש ב-JSON להקשר מורכב: כדי להעביר הקשר מובנה, כמו משתמש עם כמה תפקידים, צריך להמיר את הנתונים למחרוזת JSON. מעבירים את מחרוזת ה-JSON כפרמטר יחיד. משתמשים ב-JSON או ב-JSONB המובנים של Spanner כדי לחלץ ערכים בתוך התצוגה.

  • פישוט הגישה באמצעות פונקציות SQL בהגדרת המשתמש (UDF): אם אתם ניגשים לעיתים קרובות לשדות בהקשר של JSON מובנה, צרו פונקציות SQL בהגדרת המשתמש (UDF) כדי להכיל את הלוגיקה של החילוץ. שימוש בפונקציות UDF בתצוגות משפר את הקריאוּת ואת יכולת התחזוקה.

  • הגנה מפני החדרת פרומפטים באמצעות הגנה מוגברת על המודל: כשיוצרים שאילתות באמצעות מודלים גדולים של שפה (LLM) עם קלט ממשתמשים לא מהימנים, משתמשים ב-הגנה מוגברת על המודל כדי לזהות ולחסום באופן יזום ניסיונות של החדרת פרומפטים ופריצת Jailbreak.

מגבלות

לתצוגות עם פרמטרים יש את המגבלות הבאות:

  • סוגי ארגומנטים: הפונקציה SECURE_CONTEXT() דורשת ארגומנט ליטרל של מחרוזת.
  • סוגי תוצאות: הפונקציה SECURE_CONTEXT() מחזירה מחרוזת.
  • אינטראקציות עם תכונות של Spanner: אי אפשר להשתמש ב-SECURE_CONTEXT() בעמודות שנוצרו, בביטויים של ערכי ברירת מחדל של עמודות או בתוך פונקציות בהגדרת המשתמש (UDF).
  • מחסומי אבטחה: תצוגות עם פרמטרים ב-Spanner לא כוללות מחסום אבטחה. כל המסננים מופעלים לפני החזרת תוצאות השאילתה, אבל יכול להיות שהם לא יגבילו את הגישה לנתונים במהלך עיבוד השאילתה הפנימי.

המאמרים הבאים