בדף הזה מוסבר איך להשתמש בתצוגות מאובטחות עם פרמטרים ב-AlloyDB ל-PostgreSQL. התצוגות האלה מאפשרות להגביל את הגישה לנתונים על סמך פרמטרים בעלי שם שספציפיים לאפליקציה, כמו פרטי הכניסה של משתמש האפליקציה. תצוגות מאובטחות עם פרמטרים משפרות את האבטחה ואת בקרת הגישה על ידי הרחבת הפונקציונליות של תצוגות PostgreSQL. התצוגות האלה גם מפחיתות את הסיכונים בהרצת שאילתות לא מהימנות מאפליקציות, כי הן אוכפות באופן אוטומטי הגבלות על כל שאילתה שמופעלת.
מידע נוסף זמין במאמרים סקירה כללית של תצוגות מאובטחות עם פרמטרים ואבטחה ושליטה בגישה לנתוני אפליקציות באמצעות תצוגות מאובטחות עם פרמטרים.
לפני שמתחילים
בדף הזה מניחים שיצרתם אשכול ומכונה של AlloyDB. מידע נוסף זמין במאמר יצירת מסד נתונים.
לפני שמשתמשים בתצוגות מאובטחות עם פרמטרים, צריך לבצע את הפעולות הבאות:
מפעילים את
parameterized_views.enabledדגל מסד הנתונים, שמאפשר לטעון את ספריות התוספים הנדרשות. חובה להפעיל את הדגל הזה, גם אם הוא הופעל בעבר על ידי צוות AlloyDB. מידע נוסף על הפעלת דגל מסד הנתונים זמין במאמר הגדרת דגלי מסד נתונים של מופע.משתמשים ב-AlloyDB Studio או ב-psql כדי ליצור את התוסף
parameterized_viewsבכל מסד נתונים שבו רוצים ליצור תצוגה עם פרמטרים:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;כשיוצרים את התוסף, המערכת יוצרת גם סכימה בשם
parameterized_views, כדי שממשקי ה-API ייכללו במרחב השמות של הסכימה הזו, וכדי שלא יהיה קונפליקט בין ממשקי ה-API לבין ממשקי API קיימים.
יצירת תצוגה מאובטחת עם פרמטרים
כדי ליצור תצוגה מאובטחת עם פרמטרים, פועלים לפי השלבים הבאים:
מריצים את פקודת ה-DDL
CREATE VIEW, כמו בדוגמה הבאה:CREATE VIEW secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM checked_items t WHERE customer_id = $@app_end_userid;בדוגמה הקודמת, התצוגה המאובטחת עם הפרמטרים מאפשרת גישה לשלוש עמודות מטבלה בשם
checked_items. התצוגה מוגבלת לשורות שבהןchecked_items.customer_idתואם לפרמטר נדרש.משתמשים במאפיינים הבאים:
- יוצרים את התצוגה באמצעות האפשרות
security_barrier. - כדי להגביל את משתמשי האפליקציה כך שהם יוכלו לראות רק את השורות שיש להם גישה אליהן, מוסיפים פרמטרים נדרשים בהגדרת התצוגה באמצעות התחביר
$@PARAMETER_NAME. מקרה שימוש נפוץ הוא בדיקת הערך של עמודה בסעיףWHEREבאמצעותCOLUMN = $@PARAMETER_NAME. -
$@PARAMETER_NAMEמציין פרמטר של תצוגה עם שם. הערך שלו מסופק כשמשתמשים ב-APIexecute_parameterized_query. הדרישות לפרמטרים של תצוגה עם שם:- פרמטרים של תצוגה עם שם חייבים להתחיל באות (a-z).
- אפשר להשתמש באותיות עם סימנים דיאקריטיים ובאותיות לא לטיניות, וגם בקו תחתון (
_). - התווים הבאים יכולים להיות אותיות, קווים תחתונים או ספרות (
0-9). - פרמטרים של תצוגה עם שם לא יכולים להכיל את התו
$. - הפרמטרים של תצוגות עם שם הם תלויי אותיות רישיות. לדוגמה,
המערכת מפרשת את
$@PARAMETER_NAMEבאופן שונה מ-$@parameter_name.
- יוצרים את התצוגה באמצעות האפשרות
נותנים את ההרשאה
SELECTלתצוגה לכל משתמש במסד הנתונים שיש לו הרשאה לשלוח שאילתות לתצוגה.צריך להעניק את ההרשאה
USAGEבסכימה שמכילה את הטבלאות שמוגדרות בתצוגה לכל משתמש במסד הנתונים שיש לו הרשאה לשלוח שאילתה לתצוגה.
מידע נוסף זמין במאמר בנושא אבטחה ושליטה בגישה לנתוני אפליקציות באמצעות תצוגות מאובטחות עם פרמטרים.
הגדרת אבטחה לאפליקציה
כדי להגדיר אבטחה לאפליקציות באמצעות תצוגות מאובטחות עם פרמטרים, פועלים לפי השלבים הבאים:
- יוצרים את התצוגות המאובטחות עם פרמטרים בתור משתמש עם הרשאת אדמין. המשתמש הזה הוא משתמש במסד נתונים של AlloyDB שמבצע פעולות אדמיניסטרטיביות עבור האפליקציה, כולל הגדרת מסד הנתונים וניהול האבטחה.
יוצרים תפקיד חדש במסד הנתונים להרצת שאילתות על תצוגות מאובטחות עם פרמטרים. זהו תפקיד במסד הנתונים של AlloyDB שהאפליקציה משתמשת בו כדי להתחבר למסד הנתונים ולהיכנס אליו, וכדי להריץ שאילתות על תצוגות עם פרמטרים.
- נותנים את ההרשאות של התפקיד החדש לתצוגות המאובטחות, שבדרך כלל כוללות את ההרשאות
SELECTלתצוגות ו-USAGEלסכימות. - להגביל את האובייקטים שהתפקיד הזה יכול לגשת אליהם לקבוצה המינימלית הנדרשת של פונקציות ואובייקטים ציבוריים שהאפליקציה צריכה. מומלץ להימנע ממתן גישה לסכימות ולטבלאות שלא מוגדרות כציבוריות.
- כדי לצמצם את הסיכונים לאבטחה, צריך לבטל את הגישה מהתפקיד הזה לכל סכימה או אובייקט רגישים שלא נדרשים לתפקיד.
כשמבצעים שאילתה על התצוגות, האפליקציה מספקת את הערכים של פרמטרי התצוגה הנדרשים, שקשורים לזהות המשתמש באפליקציה.
מידע נוסף זמין במאמר בנושא יצירת משתמש במסד נתונים.
- נותנים את ההרשאות של התפקיד החדש לתצוגות המאובטחות, שבדרך כלל כוללות את ההרשאות
שאילתה של תצוגה מאובטחת עם פרמטרים
כדי להריץ שאילתה על תצוגה מאובטחת עם פרמטרים, משתמשים באחת מהאפשרויות הבאות שמתאימה ביותר לתרחיש השימוש שלכם:
- מבוסס על JSON: אפשר להשתמש ב-API הזה כדי להריץ את השאילתה בפעם אחת ולהחזיר שורות JSON.
- מבוסס-סמן: משתמשים ב-API הזה כשמריצים שאילתות ארוכות או כשמריצים שאילתות גדולות ורוצים לאחזר את התוצאות בקבוצות. הפונקציה
execute_parameterized_queryשסופקה על ידי התוסףparameterized_viewsמקבלת שם של סמן. - הצהרת
PREPARE EXECUTE: משתמשים בהצהרה הזו להצהרות מוכנות שאפשר להריץ כמה פעמים עם ערכים שונים של פרמטרים.
כדי לשלוח שאילתה לתצוגות מאובטחות עם פרמטרים, משתמשים בפונקציה execute_parameterized_query() שמופיעה בתוסף parameterized_views.
API בפורמט JSON
ל-API הזה יש מגבלות כי הוא מגדיר סמן לשאילתה הנתונה. לכן, השאילתה צריכה להיות תואמת לסמני מיקום (cursors) של PostgreSQL.
לדוגמה, CURSOR API לא תומך בהצהרות DO או SHOW.
בנוסף, ה-API הזה לא מגביל את התוצאות לפי גודל או לפי מספר השורות שמוחזרות.
מריצים את הפונקציה execute_parameterized_query(), שהתחביר שלה הוא:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
מחליפים את מה שכתוב בשדות הבאים:
-
SQL_QUERY: שאילתת SQL שהפסוקיתFROMשלה מתייחסת לתצוגות מאובטחות עם פרמטרים. -
PARAMETER_NAMES: רשימה של שמות פרמטרים שיועברו כמחרוזות. -
PARAMETER_VALUES: רשימה של ערכי פרמטרים להעברה.- הרשימה הזו צריכה להיות באותו גודל כמו הרשימה
param_names, והסדר של הערכים צריך להיות זהה לסדר של השמות. - הסוג המדויק של הערכים נקבע לפי השאילתה והגדרת התצוגה עם הפרמטרים. המרות סוגים מתבצעות כשצריך וכשאפשר, בהתאם לערך הפרמטר שצוין. אם יש אי התאמה בין הסוגים, מוצגת שגיאה.
- הרשימה הזו צריכה להיות באותו גודל כמו הרשימה
הפונקציה מחזירה טבלה של אובייקטים בפורמט JSON. כל שורה בטבלה שווה לערך ROW_TO_JSON() של שורת התוצאה של השאילתה המקורית.
בדוגמה הבאה מוצגת שאילתה לתצוגה מאובטחת עם פרמטרים:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
השימוש ב-API הזה מגביל את גודל קבוצת התוצאות לפי גודל שמוגדר בקילובייט (kB) של התוצאות ולפי מספר השורות. אפשר להגדיר את המגבלות האלה באמצעות parameterized_views.json_results_max_size ו-parameterized_views.json_results_max_rows.
CURSOR API
מריצים את הפונקציה execute_parameterized_query(), שיוצרת ומחזירה CURSOR בהיקף של טרנזקציה, שמשמש לאחזור תוצאות של שאילתה:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
cursor_name => CURSOR_NAME,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
מחליפים את מה שכתוב בשדות הבאים:
-
SQL_QUERY: שאילתת SQL שהפסוקיתFROMשלה מתייחסת לתצוגות מאובטחות עם פרמטרים. -
CURSOR_NAME: שם הסמן שרוצים להצהיר עליו. -
PARAMETER_NAMES: רשימה של שמות פרמטרים שיועברו כמחרוזות. -
PARAMETER_VALUES: רשימה של ערכי פרמטרים להעברה. הגודל של הרשימה הזו צריך להיות זהה לגודל של הרשימהparam_names, והסדר של הערכים צריך להיות זהה לסדר של השמות. הסוג המדויק של הערכים נקבע לפי השאילתה והגדרת התצוגה עם הפרמטרים. המרות סוג מתבצעות כשצריך וכשאפשר עבור ערך הפרמטר הנתון. במקרה של אי התאמה בין הסוגים, מוצגת שגיאה.
בדוגמה הבאה מוצגת שאילתה לתצוגה מאובטחת עם פרמטרים:
-- start a transaction as the that is the default lifetime of a CURSOR
BEGIN;
-- create a cursor called 'mycursor'
SELECT * FROM parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
cursor_name => 'mycursor'
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
);
-- then, to actually fetch the results
FETCH ALL FROM mycursor;
-- end the transaction, which will clean up the cursor
END;
הסמן שמוחזר הוא NO SCROLL סמן WITHOUT HOLD. אי אפשר להשתמש בסמן כדי לאחזר שורות בצורה לא רציפה, למשל בכיוון הפוך. אי אפשר להשתמש בסמן מחוץ לעסקה שבה הוא נוצר.
הצהרת PREPARE
משתמשים בפקודה PREPARE .. AS RESTRICTED כדי ליצור הצהרה מוכנה שמפנה לתצוגות עם פרמטרים. ההצהרות המוכנות האלה תומכות בפרמטרים מיקומיים ומחילות הגבלות שונות כשמבצעים אותן. מידע נוסף זמין במאמר מנגנון אבטחה.
התכונה הזו מרחיבה את PREPARE ואת EXECUTE commands כדי לתמוך בפרמטרים של תצוגה עם שמות. כדאי להשתמש בהצהרות מוכנות כדי להימנע מהתקורה של ניתוח, המרה וכתיבה מחדש בכל פעם שההצהרה מופעלת. כך אפשר לשפר משמעותית את הביצועים, במיוחד בשאילתות מורכבות או כאלה שמופעלות לעיתים קרובות. הצהרה מוכנה היא אובייקט בצד השרת שיכול לשפר את הביצועים על ידי קומפילציה מראש ואחסון של הצהרת SQL עם פרמטרים להפעלה מאוחרת יותר.
יש מגבלות על ה-API הזה כי צריך לאפשר את ההצהרה בPREPAREהצהרה, מה שאומר שרק הצהרות SELECT ו-VALUES נתמכות.
בנוסף, ה-API הזה לא מגביל את התוצאות לפי גודל או מספר השורות שמוחזרות.
כדי ליצור הצהרה מוכנה שמפנה לתצוגות עם פרמטרים, מריצים את הפקודה PREPARE .. AS RESTRICTED:
PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);
מחליפים את מה שכתוב בשדות הבאים:
-
POSITIONAL_PARAM_TYPES: פרמטר מיקום אחד או יותר שמשמשים בשאילתתRESTRICTED. POSITIONAL_PARAM_VALUES: הערכים בפועל שמוחלפים בפרמטרים המיקומיים שמוגדרים בהצהרתPREPARE.-
VIEW_PARAM_NAME: השם של הפרמטר שנדרש על ידי התצוגות עם הפרמטרים שאליהן יש הפניה בשאילתהRESTRICTED. -
VIEW_PARAM_VALUE: הערכים בפועל שמועברים לפרמטריםviewParamNameהמתאימים של התצוגות עם הפרמטרים.
כדי לכלול פרמטרים בהצהרה מוכנה, צריך לספק רשימה של סוגי נתונים בהצהרת PREPARE. בהצהרה שאתם מכינים, אתם מפנים לפרמטרים לפי מיקום באמצעות, לדוגמה, $1 ו-$2.
משתמשים בפקודה EXECUTE .. WITH VIEW PARAMETERS כדי להריץ הצהרה שהוכנה מראש ונוצרה באמצעות הפקודה PREPARE .. AS RESTRICTED.
אם הצהרת PREPARE שיצרה את ההצהרה ציינה פרמטרים מיקומיים, צריך להעביר קבוצה תואמת של פרמטרים להצהרת EXECUTE. חובה להעביר את כל הפרמטרים של תצוגות עם שם שנדרשים על ידי תצוגות עם פרמטרים בסעיף WITH VIEW PARAMETERS.
בדוגמה הבאה מוצגת שאילתה לתצוגה מאובטחת עם פרמטרים:
PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;
EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);
הגבלות שנאכפות על שאילתות
בקטע הבא מפורטות הפעולות המוגבלות לשאילתות שמריצים באמצעות האפשרויות שמתוארות במאמר הפעלת שאילתה בתצוגה מאובטחת עם פרמטרים:
- אסור להפעיל באופן רקורסיבי ממשקי API כלשהם –
execute_parameterized_queryאו באמצעותEXECUTE .. WITH VIEW PARAMETERS– כדי שייעשה שימוש רק בערכים שצוינו באפליקציה. ההגבלה הזו גם מונעת שימוש בשאילתה כדי לעקוף את מעטפת האבטחה של קבוצת הערכים הנתונה של הפרמטרים. - אסור להשתמש בתוספים מסוימים שמתחילים סשן חדש ברקע, כולל התוספים
dblink,pg_cronו-pg_background. - הרשימה הבאה כוללת את קבוצת מבני השאילתות המותרים שמוגבלים:
- אפשר להשתמש רק ב
SELECTדוחות לקריאה בלבד. - מותר להשתמש בהצהרות
SHOW, בהצהרותCALLובהצהרותDOעם הרשאת קריאה בלבד. - פקודות DML כמו
INSERT,UPDATEו-DELETEאסורות. - אסור להשתמש בהצהרות DDL כמו
CREATE TABLEו-ALTER TABLE. - אסור להשתמש בסוגים אחרים של הצהרות, כמו
LOAD,SET,CLUSTER,LOCK,CHECKPOINTו-EXPLAIN.
- אפשר להשתמש רק ב
- הצהרות
EXPLAINאסורות כברירת מחדל כדי למנוע מתקפות בערוצים סמויים באמצעות תוכניות שאילתה. מידע נוסף זמין במאמר בנושא ערוץ סמוי. עם זאת, כדי להריץ הצהרותEXPLAIN, כל משתמש במסד נתונים עם הרשאות סופר-משתמש ב-AlloyDB יכול להגדיר את ה-GUCparameterized_views.enable_explainברמת הסשן ל-on. - תצוגות מאובטחות עם פרמטרים מספקות הגדרות שיעזרו לכם לנהל משאבים שמשמשים את ממשקי ה-API לשליחת שאילתות לתצוגות עם פרמטרים, כמו
parameterized_views.statement_timeout. מידע נוסף זמין במאמר בנושא דגלים נתמכים של מסדי נתונים.
הצגת רשימה של כל התצוגות שמכילות פרמטרים
משתמשים בתוסף parameterized_views כדי לרשום את כל התצוגות המותאמות לפרמטרים במסד הנתונים באמצעות התצוגה all_parameterized_views. הפלט של התצוגה הזו זהה לתצוגת הקטלוג pg_views, אבל all_parameterized_views מציג רק תצוגות עם פרמטרים של תצוגה בשם.
כדי להציג רשימה של תצוגות עם פרמטרים, משתמשים בדוגמה הבאה:
postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname | viewname | viewowner | definition
-----------+--------------------+-----------+---------------------------------------------------------
public | checked_items_view | postgres | SELECT checked_items.bag_id, +
| | | checked_items."timestamp", +
| | | checked_items.location +
| | | FROM checked_items +
| | | WHERE (checked_items.customer_id = $@app_end_userid);
כדי להציג רשימה של תצוגה עם פרמטרים ב-all_parameterized_views, מוודאים שההגדרה של התצוגה עם הפרמטרים כוללת לפחות פרמטר אחד של תצוגה עם שם.
המאמרים הבאים
- מידע נוסף על תצוגות מאובטחות עם פרמטרים
- איך מאבטחים את הגישה לנתוני האפליקציה ושולטים בה באמצעות תצוגות מאובטחות עם פרמטרים