בקרת גישה פרטנית לתורים

בדף הזה מוסבר איך בקרת גישה ברמת גרנולריות גבוהה פועלת עם תורים של Spanner למסדי נתונים עם ניב GoogleSQL ולמסדי נתונים עם ניב PostgreSQL.

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

הרשאות לשליחת הודעות (מפיקים)

כדי לשלוח הודעות לתור באמצעות DML ‏ (INSERT INTO) או Mutation API (ראו הצהרת Insert), צריך להעניק את ההרשאה INSERT בתור לתפקיד במסד הנתונים:

GoogleSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;

כדי לבטל את ההרשאה:

GoogleSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

הרשאות לקבלת הודעות (צרכנים)

כדי להזרים הודעות מתור, תהליכי עבודה של צרכנים מריצים את הפונקציה RECEIVE_QUEUE_NAME() table-valued function (TVF) עם ExecuteStreamingSQL.

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

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;

כדי לבטל את ההרשאה:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;

כדי להתקשר אל RECEIVE_QUEUE_NAME() צריך רק EXECUTE ב-TVF, ולא צריך SELECT בתור.

הארכת תקופת ההחזקה של הודעות

כשצרכן מקבל הודעה, Spanner מקצה לו חכירה ראשונית של 10 שניות. אם עיבוד ההודעה נמשך יותר זמן מהחכירה הראשונית, צרכן צריך להאריך את החכירה באמצעות TVF‏ RENEWLEASE_QUEUE_NAME().

כדי להאריך את תקופת ההחזקה, התפקיד צריך לכלול את ההרשאה EXECUTE בפונקציה RENEWLEASE_QUEUE_NAME:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;

כדי לבטל את ההרשאה:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;

התקשרות אל RENEWLEASE_QUEUE_NAME() דורשת רק EXECUTE ב-TVF, ולא דורשת SELECT בתור.

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

הרשאות להרצת שאילתות ישירות בתורים

כדי לקרוא או לבדוק הודעות ישירות מתור באמצעות SQL סטנדרטי (SELECT * FROM QUEUE_NAME) או Read API, צריך להעניק את ההרשאה SELECT בתור:

GoogleSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;

כדי לבטל את ההרשאה:

GoogleSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

מתן הרשאה SELECT בתור מאפשר להריץ שאילתה על התור כטבלה, אבל לא מאפשר הרשאה EXECUTE על RECEIVE_QUEUE_NAME() או על RENEWLEASE_QUEUE_NAME().

הרשאות לאישור ולמחיקה של הודעות

כדי לאשר או למחוק הודעות מתור באמצעות DML ‏ (DELETE FROM) או Mutation API ‏ (Ack או Delete), צריך להעניק את ההרשאה DELETE בתור:

GoogleSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;

כדי לבטל את ההרשאה:

GoogleSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;

הרשאות שנדרשות לפעולות בתור

בטבלה הבאה מפורטות ההרשאות הנדרשות לפעולות נפוצות בתור:

פעולה הרשאות נדרשות
שליחת הודעות (DML INSERT או Mutation API Send) INSERT ברשימת ההמתנה
קבלת הודעות (RECEIVE_QUEUE_NAME() TVF) EXECUTE בפונקציה RECEIVE_QUEUE_NAME
הארכת השכרה של הודעה (RENEWLEASE_QUEUE_NAME() TVF) EXECUTE בפונקציה RENEWLEASE_QUEUE_NAME
אישור או מחיקה של הודעות (DML DELETE או Mutation API Ack או Delete) DELETE ברשימת ההמתנה
קריאת נתוני תור ישירות (SQL SELECT או Read API) SELECT ברשימת ההמתנה

דוגמה: הגדרת תפקידים של יוצרים וצרכנים

בדוגמה הבאה מוגדרים תפקידים נפרדים במסד הנתונים עבור יצרן, צרכן ומבקר בתור בשם OrdersQueue:

GoogleSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;

PostgreSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;

INFORMATION_SCHEMA צפיות בתורים

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

מכיוון שמודלים של Spanner מתייחסים לתורים כאובייקטים של סכימה ברמת הטבלה, ההרשאות שניתנות לתורים מופיעות ב-TABLE_PRIVILEGES. הרשאות שניתנו בפונקציות של טבלאות תורים מופיעות ב-ROUTINE_PRIVILEGES.

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

סינון שורות חל גם על תצוגות המטא-נתונים הבאות של התור:

GoogleSQL

  • INFORMATION_SCHEMA.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

סינון השורות חל גם על תצוגות המטא-נתונים של פונקציות של טבלאות בתור (RECEIVE_QUEUE_NAME ו-RENEWLEASE_QUEUE_NAME):

תפקיד המערכת spanner_info_reader והמשתמשים שמשויכים אליו תמיד רואים INFORMATION_SCHEMA ללא סינון.

הערות והתייחסויות

  • הרשאות נפרדות להרצת TVF ולשאילתות ישירות בתור: הענקת הרשאת SELECT בתור לא מעניקה הרשאת EXECUTE בפונקציות המשויכות שמחזירות טבלה (RECEIVE_QUEUE_NAME או RENEWLEASE_QUEUE_NAME). באופן דומה, הענקת הרשאת EXECUTE ב-TVF לא מעניקה הרשאת SELECT בתור.

    • אם תפקיד עם הרשאה SELECT בלבד בתור מנסה להפעיל את RECEIVE_QUEUE_NAME(), ‏ Spanner מחזירה שגיאה שמציינת שלתפקיד אין את ההרשאות הנדרשות בפונקציית הטבלה RECEIVE_QUEUE_NAME.
    • אם תפקיד עם הרשאה EXECUTE בלבד ב-TVF ינסה להפעיל את SELECT * FROM QUEUE_NAME, ‏ Spanner יחזיר שגיאה שבה מצוין שלתפקיד אין את ההרשאות הנדרשות בתור QUEUE_NAME.
  • ההבדל מזרמי שינויים: בניגוד לזרמי שינויים (שנדרשים בהם גם SELECT בזרם וגם EXECUTE בפונקציית הקריאה), צרכני הודעות בתור דורשים רק EXECUTE ב-TVF‏ RECEIVE. הם לא דורשים SELECT בתור עצמו.

  • אין תמיכה בהרשאות ברמת העמודה: בניגוד לטבלאות, ב-Spanner אין תמיכה בהרשאות ברמת העמודה בתורים (כמו GRANT SELECT (COLUMN_NAME) ON QUEUE). צריך להעניק הרשאות לאובייקט התור כולו, כי התורים כוללים עמודות פנימיות של מטא-נתונים של המערכת.

  • הפרדה בין תפקידי היצרן והצרכן: מומלץ להגדיר תפקידים נפרדים במסד הנתונים עבור יצרני הודעות וצרכני הודעות. לדוגמה:

    • תפקיד של מפיק עם INSERT בלבד בתור.
    • תפקיד של צרכן עם EXECUTE בפונקציות RECEIVE_QUEUE_NAME ו-RENEWLEASE_QUEUE_NAME, בנוסף ל-DELETE בתור אם מאשרים הודעות באמצעות DELETE או המוטציה Ack.
  • DML ישיר לעומת מסירת TVF בתור: הצהרות ישירות של DELETE או UPDATE עוקפות את השכרת התור ואת מכונת המצבים של המסירה. מומלץ להגביל את ההרשאות האלה לתפקידי אדמין או לתפקידים שקשורים לתחזוקה.

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