אבטחה ברמת השורה ב-BigQuery עם שירותים מתקדמים

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

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

דרישות

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

מגבלות

  • כדי לצפות בלוח הבקרה, כל צופה צריך לאשר את הגישה אליו בפעם הראשונה.
  • לצופים אין אפשרות לערוך את לוח הבקרה או לשתף אותו עם אחרים.
  • אם אתם לקוחות Workspace והאדמין שלכם השבית את השיתוף של קבצים ב-Drive עם 'כל מי שיש לו קישור', אתם צריכים להסיר את הגבלת השיתוף או לפתח את הפתרון בחשבון Gmail.com.

פתרון

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

יצירת מחבר קהילה חדש

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

כתיבת קוד המחבר

  1. getAuthType() אמורה להחזיר NONE.
  2. getConfig() צריך להחזיר הגדרה ריקה.
    • אופציונלי: אם אתם צריכים קלט ספציפי כדי להגדיר את לוח הבקרה, אתם יכולים לבקש קלט של משתמשים כאן.
  3. הפקודה getSchema() אמורה להחזיר את הסכימה של השאילתה.
    • אופציונלי: אפשר להוסיף שדות מותאמים אישית וחישובים בשאילתת SQL או באמצעות שדות מחושבים כחלק מהסכימה.
  4. getData() יושלם בשלב מאוחר יותר.

עדכון המניפסט

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

  1. הגדרת dataStudio.forceViewersCredentials לערך true.
  2. הגדרת dataStudio.advancedServices.data לערך true.
  3. בשביל oauthScopes מוסיפים את https://www.googleapis.com/auth/userinfo.email ואת https://www.googleapis.com/auth/script.external_request. מידע נוסף זמין במאמר היקפי הרשאות (scopes) ב-Apps Script.
    • מותנה: מוסיפים את כל ההיקפים הרלוונטיים לשירותים שבהם נעשה שימוש במחבר.

המניפסט צריך להיראות כך:

{
  ...
  "dataStudio": {
    "forceViewersCredentials": true,
    "advancedServices": {
       "data": true
    },
    ...
  }
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
    ],
  ...
}

הטמעה של חשבון שירות

  1. יוצרים חשבון שירות בפרויקט בענן של Google Cloud. זה יהיה הפרויקט לחיוב.
  2. מוודאים שלחשבון השירות הזה יש גישה ל-BigQuery בפרויקט בענן.
    • תפקידים נדרשים בניהול זהויות והרשאות גישה (IAM): BigQuery Data Viewer, BigQuery Job User
  3. מורידים את קובץ ה-JSON כדי לקבל את המפתחות של חשבונות השירות. מאחסנים את המפתחות במאפייני הסקריפט של פרויקט המחבר.
  4. כוללים את ספריית OAuth2 for Apps Script בפרויקט Apps Script.
  5. מטמיעים את קוד OAuth2 הנדרש לחשבון השירות:
    var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
    var SERVICE_ACCOUNT_KEY = 'private_key';
    var SERVICE_ACCOUNT_EMAIL = 'client_email';
    var BILLING_PROJECT_ID = 'project_id';
    
    /**
     * Copy the entire credentials JSON file from creating a service account in GCP.
     */
    function getServiceAccountCreds() {
      return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
    }
    
    function getOauthService() {
      var serviceAccountCreds = getServiceAccountCreds();
      var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
      var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
    
      return OAuth2.createService('RowLevelSecurity')
        .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(serviceAccountKey)
        .setIssuer(serviceAccountEmail)
        .setPropertyStore(scriptProperties)
        .setCache(CacheService.getScriptCache())
        .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
    }

הטמעה של getData()

  1. יוצרים את השאילתה ב-BigQuery.
    • באמצעות האימייל, מחפשים את המיפוי בין האימייל לבין הנתונים.
    • משתמשים ב-JOIN או בתנאי WHERE כדי לסנן את הנתונים.
  2. קבלת האימייל של המשתמש האפקטיבי (הפניה למזהה המשתמש).
  3. אפשר להשתמש ב-getData כדי להחזיר את הגדרת השאילתה באמצעות [Data Studio Advanced Services].
    • מעבירים את השאילתה שנבנתה, את פרויקט החיוב ואת אסימון ה-OAuth של חשבון השירות.
    • מותנה: אם אתם מקבלים קלט של משתמשים דרך המחבר getConfig, אתם צריכים לשלב את הקלט כפרמטרים של BigQuery.

יצירת מרכז הבקרה

  1. הסבר על פריסות וגרסאות של מחברים.
  2. יוצרים פריסה של גרסת ייצור למחבר.
  3. משתמשים בפריסת הייצור כדי ליצור מקור נתונים ודוח חדש ב-Data Studio.
  4. מוסיפים את כל הטבלאות והתרשימים בדוח.
  5. לוח הבקרה מוכן עכשיו לשיתוף עם המשתמשים.

הגדרת מרכז הבקרה כזמין למשתמשים

  1. משתפים את סקריפט המחבר עם משתמשים נבחרים או עם "כל מי שיש לו את הקישור".
  2. משתפים את מרכז הבקרה עם משתמשים נבחרים או עם 'כל מי שיש לו את הקישור'.
  3. אופציונלי: אפשר להשתמש בשירות לקיצור כתובות URL כדי ליצור קישור מקוצר לכתובת ה-URL של לוח הבקרה. משתפים את כתובת ה-URL המקוצרת עם המשתמשים. כך אפשר להחליף את כתובת ה-URL של לוח הבקרה במועד מאוחר יותר, אם יש צורך.
  4. אופציונלי: הגדרת Google Analytics כדי למדוד את השימוש במרכז הבקרה בדוח.

קוד לדוגמה