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

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

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

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

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

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

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

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

מטרות

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

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להשתמש במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

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

הפעלת החיוב וממשקי ה-API הנדרשים

  1. בוחרים פרויקט במסוף Google Cloud .

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט ב- Google Cloud .

  3. מפעילים את Cloud APIs שנדרשים כדי ליצור מכונה של AlloyDB ל-PostgreSQL ולהתחבר אליה.

    1. הפעלת ה-API

    2. בשלב Confirm project, לוחצים על Next כדי לאשר את שם הפרויקט שבו רוצים לבצע שינויים.

    3. בשלב Enable APIs, לוחצים על Enable כדי להפעיל את ממשקי ה-API הבאים:

      • AlloyDB for PostgreSQL API
      • Knowledge Catalog API
      • ‫Data Analytics API עם Gemini‏ (geminidataanalytics.googleapis.com)

יצירת מסד נתונים והתחברות אליו

  1. יוצרים אשכול ואת המכונה הראשית שלו.
  2. מתחברים למכונה ויוצרים מסד נתונים.

הקצאת התפקידים הנדרשים ויצירת משתמש במסד הנתונים של IAM

כדי לבצע אימות באמצעות ניהול זהויות והרשאות גישה (IAM) ולהריץ בקשות queryData בתצוגות מאובטחות עם פרמטרים, צריך להגדיר את המשתמש או את חשבון השירות ב-IAM:

  1. מקצים את תפקידי ה-IAM הבאים ל-IAM_USER_EMAIL בפרויקט ב- Google Cloud :

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/alloydb.databaseUser

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

  2. מפעילים אימות IAM במכונה של AlloyDB ומוסיפים את IAM_USER_EMAIL כמשתמש במסד הנתונים שמבוסס על IAM באשכול. צריך ליצור את משתמש מסד הנתונים הזה ב-IAM לפני שנותנים לו את התפקיד psv_user במסד הנתונים. מידע נוסף על הגדרת משתמשי מסד נתונים ב-IAM זמין במאמר ניהול אימות IAM.

הכנת הסביבה

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

הפעלת הדגל לניהול מסד הנתונים

מפעילים את הדגל לניהול מסד הנתונים parameterized_views.enabled, שטוען את ספריות התוספים הנדרשות. מידע נוסף זמין במאמר הגדרת דגלים לניהול מסד נתונים של מכונה.

הגדרת מסד הנתונים

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

יצירת תפקידים במסד הנתונים, התוסף והסכימה של האפליקציה

  1. נכנסים לדף AlloyDB במסוף Google Cloud .

    כניסה ל-AlloyDB

  2. בוחרים אשכול מהרשימה.

  3. בתפריט הניווט, לוחצים על AlloyDB Studio.

  4. נכנסים ל-Studio באמצעות אימות של חשבון אדמין.

  5. לוחצים על אימות. בחלונית Explorer מוצגת רשימה של האובייקטים במסד הנתונים.

  6. לוחצים על New SQL editor tab או על New tab כדי לפתוח כרטיסייה חדשה.

  7. כדי להשתמש בתצוגות עם פרמטרים, יוצרים את התוסף parameterized_views במסד הנתונים:

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

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

  8. נכנסים לחשבון כמשתמש עם הרשאות של משתמש-על, כמו המשתמש המובנה postgres. כדי ליצור משתמש-על חדש, למשל admin_user, מריצים את הפקודות הבאות:

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    מידע נוסף זמין במאמר CREATE USER.

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

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    GRANT psv_user TO admin_user WITH ADMIN OPTION;
    

    מידע נוסף זמין במאמר CREATE USER.

  10. מתחברים בתור המשתמש עם הרשאת האדמין.

    SET role TO admin_user;
    
  11. יוצרים את הסכימה שמכילה את הטבלאות.

    CREATE SCHEMA store;
    
  12. יוצרים את הטבלאות ומזינים נתונים.

    CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES
    (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123),
    (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456),
    (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789),
    (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101),
    (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202),
    (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
    

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

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

  1. נכנסים לדף AlloyDB במסוף Google Cloud .

    כניסה ל-AlloyDB

  2. בוחרים אשכול מהרשימה.

  3. בתפריט הניווט, לוחצים על AlloyDB Studio.

  4. נכנסים ל-Studio ומתחברים למסד הנתונים שנקרא database בתור המשתמש admin_user.

  5. לוחצים על אימות. בחלונית Explorer מוצגת רשימה של האובייקטים במסד הנתונים.

  6. לוחצים על New SQL editor tab או על New tab כדי לפתוח כרטיסייה חדשה.

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

    CREATE VIEW store.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM store.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  8. נותנים גישה לתצוגה.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. כדי לגשת לתצוגה, צריך לתת גישה לסכימה.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. לבטל את הגישה הישירה למסד הנתונים הטבלאי.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    הערה: לבעלים של התצוגה עם הפרמטרים צריכות להיות הרשאות SELECT במסדי הנתונים הטבלאיים. בנוסף, למשתמש בתצוגה עם הפרמטרים צריכה להיות הרשאת USAGE בסכימה של התצוגה והרשאת SELECT בתצוגה. לדוגמה, המשתמש admin_user הוא הבעלים של התצוגה עם הפרמטרים, ולכן יש לו הרשאות SELECT במסדי הנתונים הטבלאיים, ואילו למשתמש psv_user צריכות להיות הרשאות USAGE בסכימה store והרשאות SELECT בתצוגה.

  11. מוודאים ש-IAM_USER_EMAIL נוסף לאשכול כמשתמש מסד נתונים ב-IAM, נכנסים כמשתמש postgres או כ-admin_user, ונותנים את התפקיד psv_user למשתמש שאומת ב-IAM:

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    מחליפים את IAM_USER_EMAIL בכתובת האימייל של המשתמש ב-IAM.

אימות אבטחת המידע

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

  1. נכנסים למסד הנתונים בתור המשתמש המאומת ב-IAM.

  2. מוודאים שאי אפשר לגשת למסד הנתונים הטבלאי.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. ניגשים לתצוגות המאובטחות שמכילות פרמטרים באמצעות הפונקציה execute_parameterized_query:

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from store.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. נכנסים ל-Google Cloud CLI בתור IAM_USER_EMAIL על ידי הפעלת gcloud auth application-default login כדי ש-gcloud auth application-default print-access-token ייצור אסימון למשתמש מסד הנתונים המוגבל של IAM, ואז שולחים שאילתה לתצוגות המאובטחות עם הפרמטרים באמצעות השיטה queryData עם פרמטרים של PSV:

      curl -X POST \
        "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: PROJECT_ID" \
        -H "Content-Type: application/json; charset=utf-8" \
        -d '{
          "prompt": "Show me the checked items.",
          "context": {
            "datasource_references": {
              "alloydb": {
                "database_reference": {
                  "project_id": "PROJECT_ID",
                  "region": "REGION",
                  "cluster_id": "CLUSTER_ID",
                  "instance_id": "INSTANCE_ID",
                  "database_id": "DATABASE_ID",
                  "table_ids": [
                    "store.secure_checked_items"
                  ]
                }
              }
            },
            "parameterized_secure_view_parameters": {
              "parameters": [
                {
                  "key": "app_end_userid",
                  "value": "303"
                }
              ]
            }
          },
          "generation_options": {
            "generate_query_result": true,
            "generate_natural_language_answer": true,
            "generate_explanation": true
          }
        }'

    משתמשים בשדה table_ids ב-database_reference כדי לוודא ש-QueryData יוצר SQL רק בתצוגה המאובטחת עם הפרמטרים של store.secure_checked_items. אם משמיטים את table_ids ולתפקיד במסד הנתונים יש גישת SELECT למסד הנתונים הטבלאי store.checked_items, יכול להיות ש-QueryData ישלח שאילתה ישירות למסד הנתונים הטבלאי, בלי לעבור דרך התצוגה המאובטחת. צריך לציין את שם התצוגה שמוגדרת בסכימה, כי שמות לא מוגדרים ב-table_ids מוגדרים כברירת מחדל לסכימה public.

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • ‫REGION: האזור שבו נמצאת המכונה של AlloyDB ל-PostgreSQL.
    • ‫CLUSTER_ID: המזהה של אשכול AlloyDB ל-PostgreSQL.
    • ‫INSTANCE_ID: המזהה של מכונת AlloyDB ל-PostgreSQL.
    • ‫DATABASE_ID: המזהה של מסד הנתונים של AlloyDB ל-PostgreSQL, שהוא database במדריך הזה.

    הסרת המשאבים

    מחיקת האשכול

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

    1. נכנסים לדף AlloyDB במסוף Google Cloud .

      כניסה ל-AlloyDB

    2. בוחרים אשכול מהרשימה.

    3. לוחצים על Delete cluster.

    4. בקטע Delete cluster, מזינים את שם האשכול כדי לאשר שרוצים למחוק אותו.

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