אתם יכולים להשתמש בתצוגות מאובטחות עם פרמטרים ב-AlloyDB Omni כדי להגביל את הגישה לנתונים על סמך פרמטרים בעלי שם שספציפיים לאפליקציה, כמו פרטי הכניסה של משתמש האפליקציה. תצוגות מאובטחות עם פרמטרים משפרות את האבטחה ואת בקרת הגישה על ידי הרחבת הפונקציונליות של תצוגות PostgreSQL. התצוגות האלה גם מפחיתות את הסיכונים בהרצת שאילתות לא מהימנות מאפליקציות, על ידי אכיפה אוטומטית של הגבלות על כל שאילתה שמבוצעת.
מידע נוסף זמין במאמרים סקירה כללית על תצוגות מאובטחות עם פרמטרים ואבטחה ושליטה בגישה לנתוני אפליקציות באמצעות תצוגות מאובטחות עם פרמטרים.
לפני שמתחילים
התמיכה בתצוגות עם פרמטרים ב-AlloyDB AI ניתנת באמצעות parameterized_views, שהוא תוסף של AlloyDB ל-PostgreSQL.
ההנחה בדף הזה היא שהתקנתם את AlloyDB Omni. מידע נוסף מופיע במאמרים בנושא התקנת AlloyDB Omni (למאגרי מידע, ל-Kubernetes).
לפני שמשתמשים בתצוגות מאובטחות עם פרמטרים, צריך לבצע את הפעולות הבאות פעם אחת בכל מאגר Postgres חדש. אפשר להחיל כל הגדרה באמצעות ALTER SYSTEM או על ידי עריכה ישירה של postgresql.conf.
- הוספת
parameterized_viewsאלshared_preload_libraries. - מפעילים את התכונה באמצעות ההגדרה
parameterized_views.enabled=on. מפעילים מחדש את שרת PostgreSQL כדי שהשינויים ייכנסו לתוקף.
-- See the current shared_preload_libraries SHOW shared_preload_libraries; ALTER SYSTEM SET shared_preload_libraries="...,parameterized_views"; ALTER SYSTEM SET parameterized_views.enabled=on;משתמשים ב-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מציין פרמטר של תצוגה עם שם. הערך שלו מסופק כשמשתמשים ב-API שלexecute_parameterized_query. הדרישות לפרמטרים של תצוגה עם שם:- פרמטרים של תצוגה עם שם חייבים להתחיל באות (a-z).
- אפשר להשתמש באותיות עם סימנים דיאקריטיים ובאותיות לא לטיניות, וגם בקו תחתון (
_). - התווים הבאים יכולים להיות אותיות, קווים תחתונים או ספרות
(
0-9). - פרמטרים של תצוגה עם שם לא יכולים להכיל את התו
$. - הפרמטרים של תצוגות עם שם הם תלויי אותיות רישיות. לדוגמה,
$@PARAMETER_NAMEמתפרש אחרת מאשר$@parameter_name.
- יוצרים את התצוגה באמצעות האפשרות
נותנים הרשאת
SELECTבתצוגה לכל משתמש במסד הנתונים שמורשה להריץ שאילתות בתצוגה.מעניקים את ההרשאה
USAGEבסכימה שמכילה את הטבלאות שמוגדרות בתצוגה לכל משתמש במסד הנתונים שמורשה לשלוח שאילתות לתצוגה.
מידע נוסף זמין במאמר אבטחה ובקרה של הגישה לנתוני אפליקציות באמצעות תצוגות מאובטחות עם פרמטרים.
הגדרת האבטחה של האפליקציה
כדי להגדיר אבטחה לאפליקציות באמצעות תצוגות מאובטחות עם פרמטרים:
- יוצרים את התצוגות המאובטחות עם הפרמטרים כמשתמש עם הרשאת אדמין. המשתמש הזה הוא משתמש במסד הנתונים של AlloyDB Omni שמבצע פעולות אדמין באפליקציה, כולל הגדרת מסד הנתונים וניהול האבטחה.
- יוצרים תפקיד חדש במסד הנתונים להרצת שאילתות מול תצוגות מאובטחות עם פרמטרים. זהו תפקיד במסד הנתונים של AlloyDB Omni, שבו האפליקציה משתמשת כדי להתחבר למסד הנתונים ולהיכנס אליו, וכדי להריץ שאילתות בתצוגות עם פרמטרים.
- נותנים לתפקיד החדש הרשאות לתצוגות המאובטחות, שבדרך כלל כוללות הרשאות
SELECTלתצוגות ו-USAGEלסכימות. - הגבילו את האובייקטים שהתפקיד הזה יכול לגשת אליהם לקבוצה המינימלית הנדרשת של פונקציות ואובייקטים ציבוריים שהאפליקציה צריכה. אל תתנו גישה לסכימות ולטבלאות שלא מוגדרות כציבוריות.
- כששולחים שאילתה לתצוגות, האפליקציה מספקת את הערכים של הפרמטרים הנדרשים לתצוגה, שקשורים לזהות המשתמש באפליקציה.
שליחת שאילתה לתצוגה מאובטחת עם פרמטרים
כדי לשלוח שאילתה לתצוגה מאובטחת שמכילה פרמטרים, אתם יכולים להשתמש באחת מהאפשרויות הבאות, בהתאם לתרחיש לדוגמה:
- מבוסס-JSON: משתמשים ב-API הזה כדי להריץ את השאילתה בבת אחת ולהחזיר שורות JSON.
- CURSOR-based: משתמשים ב-API הזה כשיש שאילתות ארוכות יותר או כשיש שאילתות גדולות ורוצים לאחזר את התוצאה בקבוצות. הפונקציה
execute_parameterized_queryשסופקה על ידי התוסףparameterized_viewsמקבלת שם של סמן. - הצהרת
PREPARE EXECUTE: משתמשים בהצהרה הזו להצהרות מוכנות שאפשר להריץ כמה פעמים עם ערכי פרמטרים שונים.
כדי לשלוח שאילתה לתצוגות מאובטחות עם פרמטרים, משתמשים בפונקציה execute_parameterized_query()
שמסופקת על ידי התוסף parameterized_views.
API בפורמט JSON
ל-API הזה יש מגבלות כי הוא מצהיר על סמן לשאילתה הנתונה. לכן, השאילתה צריכה להיות תואמת לסמנים של PostgreSQL. לדוגמה, ה-API של CURSOR לא תומך בהצהרות 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.
ל-API הזה יש מגבלות כי הוא מצהיר על סמן לשאילתה הנתונה. לכן, השאילתה צריכה להיות תואמת לסמנים של PostgreSQL. לדוגמה, ה-API של CURSOR לא תומך בהצהרות 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
ל-API הזה יש מגבלות כי הוא מצהיר על סמן לשאילתה הנתונה. לכן, השאילתה צריכה להיות תואמת לסמני מיקום (cursors) של PostgreSQL. לדוגמה, ה-API של CURSOR לא תומך בהצהרות 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.
הצהרת PREPARE
משתמשים בפקודה PREPARE .. AS RESTRICTED כדי ליצור הצהרה מוכנה שמפנה לתצוגות עם פרמטרים. ההצהרות המוכנות האלה תומכות בפרמטרים של מיקום, ואוכפות הגבלות שונות כשמריצים אותן. למידע נוסף, קראו את המאמר מנגנון אבטחה.
התכונה הזו מרחיבה את הפקודות PREPARE ו-EXECUTE כדי לתמוך בפרמטרים של תצוגות עם שם. כדאי להשתמש בהצהרות מוכנות כדי להימנע מהתקורה של ניתוח, פענוח וכתיבה מחדש בכל פעם שההצהרה מופעלת. כך אפשר לשפר משמעותית את הביצועים, במיוחד בשאילתות מורכבות או כאלה שמופעלות לעיתים קרובות. הצהרה מוכנה היא אובייקט בצד השרת שיכול לשפר את הביצועים על ידי הידור מראש ואחסון של הצהרת 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לא מורשות כדי למנוע אפשרות של התקפות ערוץ סמוי באמצעות תוכניות לביצוע שאילתות. מידע נוסף זמין במאמר ערוץ סמוי.תצוגות מאובטחות עם פרמטרים מספקות הגדרות שיעזרו לכם לנהל משאבים שמשמשים את ממשקי ה-API לשליחת שאילתות לתצוגות עם פרמטרים, כמו
parameterized_views.statement_timeout. מידע נוסף זמין במאמר בנושא דגלים של AlloyDB ל-PostgreSQL.
הצגת רשימה של כל התצוגות שמכילות פרמטרים
אפשר להשתמש בתוסף 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, ודאו שהתצוגה עם הפרמטרים מכילה לפחות פרמטר אחד עם שם בהגדרה שלה.