ביקורת ב-PostgreSQL באמצעות pgAudit

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

למידע כללי על תוספים של PostgreSQL ב-Cloud SQL, קראו את המאמר תוספים של PostgreSQL.

סקירה כללית

אפשר לבצע ביקורת של מסדי נתונים ב-Cloud SQL ל-PostgreSQL באמצעות התוסף pgAudit בקוד פתוח.

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

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

במאמר יומני ביקורת מוסבר בהרחבה על רישום ביומני ביקורת ב-Cloud SQL.

הגדרת ביקורת של מסדי נתונים ב-Cloud SQL

השלבים לרישום ביומן הביקורת באמצעות התוסף pgAudit כוללים:

  1. הפעלת הדגל cloudsql.enable_pgaudit ב-Cloud SQL.
  2. מריצים פקודה כדי ליצור את התוסף pgAudit.
  3. הגדרת ערכים לדגל pgaudit.log.

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

הגדרת ביקורת

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

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

ב-Cloud SQL, משתמשים בדגלים לניהול מסד נתונים לפעולות רבות, כולל התאמת הפרמטרים של PostgreSQL והגדרת מכונה. הדגל cloudsql.enable_pgaudit מפעיל ביקורת במכונה נתונה של מסד נתונים. אפשר לשנות את הערך של הדגל cloudsql.enable_pgaudit באמצעות מסוף Google Cloud או באמצעות הפקודה gcloud.

משתמשים בהוראות הרגילות לדגלים כדי להפעיל את הדגל cloudsql.enable_pgaudit, ומגדירים את הערך ל-on. לדוגמה, כדי להשתמש בפקודה gcloud, מציינים את הפרטים הבאים ומחליפים את [INSTANCE_NAME] בשם המכונה:

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

הדגל cloudsql.enable_pgaudit מופיע ברשימה עם הדגלים הנתמכים האחרים, והוא ספציפי ל-Cloud SQL.

מריצים את הפקודה כדי ליצור את התוסף pgAudit

אחרי שמפעילים את הדגל לניהול מסד הנתונים, מריצים את הפקודה CREATE EXTENSION באמצעות לקוח psql תואם. הפקודה הבאה יוצרת את התוסף pgAudit לכל מסדי הנתונים במכונה של Cloud SQL:

CREATE EXTENSION pgaudit;

הגדרת ערכים לדגל pgaudit.log

משתמשים בהוראות הרגילות לדגלים כדי להגדיר ערכים לדגל pgaudit.log.

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

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

קביעת הגדרות אחרות למסד הנתונים

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

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

כדי לצפות ביומני הביקורת, צריך להפעיל את יומני הביקורת של בקרת הרשאות גישה לנתונים בפרויקט. יומני pgAudit שנוצרים במכונה נשלחים ל-Cloud Logging בתור יומני ביקורת של גישה לנתונים. המשתמשים יכולים לראות את יומני pgAudit שנוצרו באמצעות האפליקציה Logs Explorer.

באפליקציה Logs Explorer, אפשר לראות את יומני pgAudit על ידי בחירת מסנן היומנים cloudaudit.googleapis.com/data_access.

לחלופין, אפשר להשתמש בשאילתה הבאה כדי להציג את כל יומני pgAudit של פרויקט Cloud SQL נתון:

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

פורמט היומן של pgAudit

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

לדוגמה:

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

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

  • auditClass. סוג ההצהרה שנרשמת ביומן. הערכים האפשריים הם READ,‏ WRITE,‏ FUNCTION,‏ ROLE,‏ DDL,‏ MISC ו-MISC_SET.
  • auditType. ‫SESSION או OBJECT.
  • chunkCount. הנתונים בשדות parameter ו-statement יכולים לעבור חלוקה לחלקים. השדה chunkCount מציין את המספר הכולל של החלקים. כדאי גם לעיין בתיאור של השדה chunkIndex.
  • chunkIndex. מציין את מספר האינדקס של מקטעי הנתונים בשדות parameter ו-statement (במאגר request הנוכחי). המספר הראשוני הוא 1. אפשר גם לעיין בתיאור של השדה chunkCount.
  • command. לדוגמה, ALTER TABLE או SELECT.
  • פרמטר. השדה chunkIndex יכול לקבוע את התוכן של השדה הזה. אפשר לעיין בתיאור של השדה chunkIndex. אם מוגדר ערך ל-pgaudit.log_parameter, השדה parameter יכול להכיל את הפרמטרים של ההצהרה כנתוני CSV במירכאות. אם אין פרמטרים, השדה הזה מכיל את הערך [none]. אחרת, השדה הזה מכיל את הערך [not logged].
  • הצהרה. הצהרה שבוצעה בקצה העורפי. השדה chunkIndex יכול לקבוע את התוכן של השדה statement. אפשר לקרוא על כך בתיאור של השדה chunkIndex.
  • statementId. מזהה הצהרה ייחודי לסשן הזה. כל מזהה הצהרה מייצג קריאה לקצה העורפי. מזהי ההצהרות הם עוקבים, גם אם חלק מההצהרות לא מתועדות.
  • substatementId. מזהה רציף לכל הצהרת משנה בתוך ההצהרה הראשית.

חלק מהשדות האלה מתוארים גם במסמכי התיעוד של pgAudit.

השבתת הביקורת

כדי להשבית את הביקורת על מסד הנתונים, מגדירים את הערך של הדגל cloudsql.enable_pgaudit ל-off. אפשר לשנות את הערך דרך מסוף Google Cloud או באמצעות הפקודה gcloud. משתמשים בהוראות הרגילות לדגלים כדי להשבית את הדגל cloudsql.enable_pgaudit.

בנוסף, מריצים את הפקודה DROP EXTENSION באמצעות לקוח psql תואם כדי להסיר את מצב התוסף:

DROP EXTENSION pgaudit;

התאמה אישית של רישום ביומן הביקורת של מסד הנתונים ב-Cloud SQL

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

במסמכי התיעוד של pgAudit מפורטות יכולות נוספות של התוסף.

דרישה להרשאות של משתמש-על

ב-Cloud SQL, רק משתמשים עם התפקיד cloudsqlsuperuser יכולים ליצור תוספים. כשיוצרים מכונה חדשה של PostgreSQL, נוצר בשבילכם משתמש ברירת המחדל של PostgreSQL (אבל אתם צריכים להגדיר את הסיסמה של המשתמש). משתמש ברירת המחדל של PostgreSQL הוא חלק מהתפקיד cloudsqlsuperuser. מידע נוסף זמין במאמר משתמשי PostgreSQL.

הגדרת ביקורת לכל הפעולות במסד הנתונים במכונה

כדי להגדיר ביקורת לכל מסדי הנתונים במכונה, צריך להחיל את ההגדרות של pgAudit ברמת המערכת. אפשר להגדיר את הפרמטרים של הביקורת ברמת המערכת רק כדגלים לניהול מסד נתונים דרך מסוף Google Cloud או הפקודה gcloud. לדוגמה, כדי להפעיל ביקורת לכל הפעולות במסד הנתונים במכונה, אפשר להשתמש בפקודה הבאה של gcloud:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

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

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

  gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

הפקודה מחליפה את הדגלים הקיימים לניהול מסד הנתונים.

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

כדי להגדיר ביקורת למסד נתונים ספציפי, מגדירים את הפרמטרים של pgAudit ברמת מסד הנתונים. לדוגמה, אפשר להשתמש בפקודת ה-SQL הבאה כדי להפעיל ביקורת קריאה וכתיבה במסד נתונים בשם finance:

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

הגדרת ביקורת ליחס

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

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

לדוגמה, כדי להגדיר ביקורת לכל השאילתות מסוג SELECT ביחס salary במסד הנתונים employee, אפשר להשתמש בפקודות הבאות:

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

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

לדוגמה, הפקודה הבאה מגדירה רישום ביומן הביקורת רק כשניגשים לעמודות income ו-tax_status מהקשר salary:

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

הגדרת ביקורת למשתמש במסד נתונים

כדי להפעיל את הביקורת למשתמש ספציפי, מגדירים את הפרמטר pgaudit.log ברמת ROLE.

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

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

הסתרת מידע אישי רגיש ביומני ביקורת

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

יתרונות

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

איך זה עובד

כשהדגל cloudsql.pgaudit_mask_literals מוגדר לערך on, התוסף pgAudit מעבד את הצהרת ה-SQL לפני שהוא כותב אותה ביומן הביקורת. אם התוסף מזהה ערכים מילוליים בשאילתה, הוא מחליף אותם לפני רישום השאילתה ביומן:

  • ההצהרה המקורית:

    INSERT INTO users (id, email) VALUES (123, 'sensitive@example.com');
    
  • הצהרה ביומן הביקורת, כשההסתרה מופעלת:

    INSERT INTO users (id, email) VALUES ($1, $2);
    

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

דרישות

  • הדגל cloudsql.pgaudit_mask_literals נתמך ב-Cloud SQL ל-PostgreSQL בגרסאות 14 ואילך.
  • הדגל cloudsql.enable_pgaudit מושבת כברירת מחדל, וכדי להשתמש בו צריך להגדיר אותו לערך on.

הפעלת מיסוך

כדי להפעיל מיסוך מילולי, מגדירים את הדגל לניהול מסד הנתונים cloudsql.pgaudit_mask_literals לערך on. אפשר להגדיר דגלים של מסד נתונים באמצעות מסוף Google Cloud , ה-CLI של gcloud או Cloud SQL Admin API.

מידע נוסף זמין במאמר הגדרת דגלים לניהול מסדי נתונים.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=on

מחליפים את INSTANCE_NAME בשם המכונה.

השבתת ההסתרה

כדי להשבית את ההסתרה של מילים מילוליות, מגדירים את הדגל cloudsql.pgaudit_mask_literals לערך off.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=off

מחליפים את INSTANCE_NAME בשם המכונה.

טיפים לניהול ביקורות ב-Cloud SQL

כשמתאימים אישית את אופן הפעולה של הביקורת, חשוב לזכור את הדברים הבאים:

  • כשמשביתים את הדגל לניהול מסד הנתונים cloudsql.enable_pgaudit, הרישום ביומן הביקורת נפסק באופן מיידי. עם זאת, הגדרות pgAudit שהוחלו (לדוגמה, הגדרות הפרמטר pgaudit.log) נשמרות, אלא אם מסירים אותן באופן מפורש.
  • מופע מסד הנתונים מופעל מחדש בכל פעם שמשתנה הערך של הדגל לניהול מסד הנתונים של cloudsql.enable_pgaudit.
  • למשתמשי מסד נתונים שנוצרו באמצעות פקודות CREATE ROLE מפורשות אין הרשאה לשנות את הגדרות הביקורת. רק משתמשי מסד נתונים שנוצרו באמצעות מסוף Google Cloud והפקודה gcloud יכולים לשנות את הגדרות הביקורת.
  • כשמפעילים גם את רישום הביקורת של הסשנים וגם את רישום הביקורת של האובייקטים, הצהרות שקשורות לשניהם מתווספות ליומנים. רישום ביומן של סשנים ורישום ביומן של אובייקטים לא מבטלים או משנים זה את זה.

המגבלות של התוסף pgAudit ב-Cloud SQL ל-PostgreSQL

יומני הביקורת נכתבים באופן זמני בדיסק של המכונה שלהם, ותופסים מקום בדיסק לפני שהיומנים נשלחים ל-Cloud Logging. לכן, לפני שמשתמשים בתכונה הזו, חשוב לקרוא את כל המידע הבא:

  • קצב הטמעת היומנים הוא 4MB לשנייה. כשהעומס של יצירת היומנים חורג מקצב ההטמעה, יכול להיות שיקרו הדברים הבאים:
    • יכול להיות שהשימוש בדיסק יגדל באופן לא רצוי.
    • המקום בכונן עלול להיגמר.
  • אם הפעלתם את התכונה הזו ואתם מריצים הרבה שאילתות שעומדות בקריטריונים של הביקורת, השימוש בדיסק עלול לגדול מהר מדי.
  • לפני שמשתמשים בתכונה הזו, צריך:
    • הפעלת הגדלות אוטומטיות של נפח האחסון
    • עוקבים אחרי השימוש הכולל בדיסק. אי אפשר לעקוב בנפרד אחרי העומס שנוצר מיצירת היומנים. משתמשים במדד cloudsql.googleapis.com/database/disk/utilization ב-Metrics explorer.
    • אם צריך, אפשר להפחית את השימוש בדיסק על ידי הפעלת פחות שאילתות או הפחתת הביקורת.
  • אם נגמר המקום הפנוי בכונן, יכול להיות שיומני הביקורת של חלק מהשאילתות יאבדו.

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