ניהול אבטחת מידע באפליקציה באמצעות תצוגות מאובטחות עם פרמטרים ב-AlloyDB Omni

בחירת גרסת תיעוד:

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

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

לפני שמתחילים

התמיכה בתצוגות פרמטריות של AlloyDB AI ניתנת דרך parameterized_views, שהיא הרחבה של AlloyDB ל-PostgreSQL.

בדף הזה מניחים שהתקנתם את AlloyDB Omni. הוראות להתקנת AlloyDB Omni ב-Linux

לפני שמשתמשים בתצוגות מאובטחות עם פרמטרים, צריך לבצע את הפעולות הבאות פעם אחת בסביבת Linux. אפשר להחיל כל הגדרה באמצעות ALTER SYSTEM או לערוך ישירות את postgresql.conf.

  1. הוספת parameterized_views אל shared_preload_libraries.
  2. מגדירים את parameterized_views.enabled=on כדי להפעיל את התכונה.
  3. כדי שהשינויים ייכנסו לתוקף, צריך להפעיל מחדש את שרת 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;
    
  4. משתמשים ב-psql כדי ליצור את התוסף parameterized_views בכל מסד נתונים שבו רוצים ליצור תצוגה עם פרמטרים:

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

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

יצירת תצוגה מאובטחת עם פרמטרים

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

  1. מריצים את פקודת ה-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.
  2. נותנים את ההרשאה SELECT בתצוגה לכל משתמש במסד הנתונים שיש לו הרשאה לשלוח שאילתות לתצוגה.

  3. נותנים את ההרשאה USAGE בסכימה שמכילה את הטבלאות שמוגדרות בתצוגה לכל משתמש במסד הנתונים שמורשה לשלוח שאילתות לתצוגה.

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

הגדרת אבטחה לאפליקציה

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

  1. יוצרים את התצוגות המאובטחות עם פרמטרים כמשתמש עם הרשאת אדמין. המשתמש הזה הוא משתמש במסד נתונים של AlloyDB Omni שמבצע פעולות אדמיניסטרטיביות עבור האפליקציה, כולל הגדרת מסד הנתונים וניהול האבטחה.
  2. יוצרים תפקיד חדש במסד הנתונים להרצת שאילתות על תצוגות מאובטחות עם פרמטרים. זהו תפקיד במסד הנתונים של AlloyDB Omni שהאפליקציה משתמשת בו כדי להתחבר למסד הנתונים ולהיכנס אליו, וכדי להריץ שאילתות על תצוגות עם פרמטרים.
  3. מעניקים את הרשאות התפקיד החדש לתצוגות המאובטחות, שבדרך כלל כוללות את ההרשאות SELECT לתצוגות ואת ההרשאות USAGE לסכימות.
  4. להגביל את האובייקטים שהתפקיד הזה יכול לגשת אליהם לסט המינימלי הנדרש של פונקציות ואובייקטים ציבוריים שהאפליקציה צריכה. מומלץ להימנע ממתן גישה לסכימות ולטבלאות שלא גלויות לכולם.
  5. כשמבצעים שאילתה על התצוגות, האפליקציה מספקת את הערכים של פרמטרי התצוגה הנדרשים, שקשורים לזהות המשתמש באפליקציה.

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

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

  • מבוסס על JSON: אפשר להשתמש ב-API הזה כדי להריץ את השאילתה בפעם אחת ולהחזיר שורות JSON.
  • מבוסס סמן: משתמשים ב-API הזה כשמריצים שאילתות ארוכות או כשמריצים שאילתות גדולות ורוצים לאחזר את התוצאות באצוות. הפונקציה execute_parameterized_query שסופקה על ידי התוסף parameterized_views מקבלת שם של סמן.
  • הצהרת PREPARE EXECUTE: משתמשים בהצהרה הזו להצהרות מוכנות שאפשר להריץ כמה פעמים עם ערכים שונים של פרמטרים.

כדי לשלוח שאילתה לתצוגות מאובטחות עם פרמטרים, משתמשים בפונקציה execute_parameterized_query() שמופיעה בתוסף parameterized_views.

‫API בפורמט JSON

ל-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.

ל-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.

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, מוודאים שההגדרה של התצוגה עם הפרמטרים כוללת לפחות פרמטר אחד של תצוגה עם שם.

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