使用 PgAudit 記錄資料庫活動 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 PgAudit 記錄資料庫活動

金融機構、政府機構和許多產業都需要保留「稽核日誌」,以符合法規要求。透過使用 PostgreSQL 稽核擴充功能 (PgAudit) 搭配 Aurora PostgreSQL 資料庫叢集,您可以擷取稽核人員通常需要的詳細記錄,以符合法規要求。例如,您可以設定 pgAudit 擴充功能來追蹤對特定資料庫和資料表所做的變更、記錄進行變更的使用者,以及許多其他詳細資訊。

pgAudit 擴充功能建置在原生 PostgreSQL 記錄基礎結構的功能之上,以更多的詳細資訊擴充日誌訊息。換言之,您可以使用與檢視任何日誌訊息相同的方法來檢視稽核日誌。如需 PostgreSQL 記錄的詳細資訊,請參閱 Aurora PostgreSQL 資料庫日誌檔

pgAudit 擴充功能會從日誌中刪減敏感資料,例如純文字密碼。如果您的 Aurora PostgreSQL 資料庫叢集設定為記錄資料操作語言 (DML) 陳述式 (如針對您的 Aurora PostgreSQL 資料庫叢集開啟查詢記錄中所述),您可以使用 PostgreSQL 稽核擴充功能避免純文字密碼問題。

您可以非常具體地設定對資料庫執行個體的稽核。您可以稽核所有資料庫和所有使用者。或者,您可以選擇僅稽核某些資料庫、使用者和其他物件。您也可以明確排除特定使用者和資料庫,使其不受稽核。如需詳細資訊,請參閱從稽核記錄中排除使用者或資料庫

鑑於可以擷取的詳細資訊量,我們建議您,如果的確使用 pgAudit,請監控您的儲存耗用量。

所有可用的 Aurora PostgreSQL 版本都支援 PgAudit 擴充功能。如需 Aurora PostgreSQL 版本支援的 pgSQL 版本清單,請參閱《Aurora PostgreSQL 版本資訊》中的 Amazon Aurora PostgreSQL 的擴充功能版本

設定 pgAudit 擴充功能

若要在 Aurora PostgreSQL 資料庫叢集上設定 PgAudit 擴充功能,您必須先將 PgAudit 新增至 Aurora PostgreSQL 資料庫叢集的自訂資料庫叢集參數群組上的共用程式庫。如需建立自訂資料庫參數群組的相關資訊,請參閱 使用參數群組接下來,您會安裝 pgAudit 擴充功能。最後,您會指定要稽核的資料庫和物件。本節中的程序展示做法。您可以使用 AWS Management Console 或 AWS CLI。

您必須具有做為 rds_superuser 角色的許可,才能執行所有這些任務。

以下步驟假設您的 Aurora PostgreSQL 資料庫叢集與自訂資料庫叢集參數群組相關聯。

設定 pgAudit 擴充功能
  1. 登入 AWS Management Console,並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇您的 Aurora PostgreSQL 資料庫叢集的寫入器執行個體

  3. 針對您的 Aurora PostgreSQL 資料庫叢集的寫入器執行個體開啟 Configuration (組態) 索引標籤。在執行個體詳細資訊之間,尋找 Parameter group (參數群組) 連結。

  4. 選擇連結以開啟與 Aurora PostgreSQL 資料庫叢集相關聯的自訂參數。

  5. Parameters (參數) 搜尋欄位中,輸入 shared_pre 以尋找 shared_preload_libraries 參數。

  6. 選擇 Edit parameters (編輯參數) 以存取屬性值。

  7. Values (值) 欄位中,將 pgaudit 新增至清單。使用逗號區隔值清單中的項目。

    已新增 pgAudit 之 shared_preload_libaries 參數的影像。
  8. 重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,以便您對 shared_preload_libraries 參數所做的變更生效。

  9. 當執行個體可用時,請驗證 pgAudit 是否已初始化。使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,然後執行下列命令。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  10. 在初始化 pgAudit 之後,您現在可以建立擴充功能。您必須在初始化程式庫之後建立擴充功能,因為 pgaudit 擴充功能會安裝事件觸發條件,以稽核資料定義語言 (DDL) 陳述式。

    CREATE EXTENSION pgaudit;
  11. 關閉 psql 工作階段。

    labdb=> \q
  12. 登入 AWS Management Console,並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  13. 在清單中尋找 pgaudit.log 參數,並設定為適合您使用案例的適當值。例如,將 pgaudit.log 參數設定為 write (如下圖所示) 會擷取日誌的插入、更新、刪除,以及其他一些類型的變更。

    pgaudit.log 參數與設定的影像。

    您也可以針對 pgaudit.log 參數選擇下列其中一個值。

    • none – 這是預設值。不會記錄任何資料庫變更。

    • all – 記錄一切 (read、write、function、role、ddl、misc)。

    • ddl – 記錄未包含在 ROLE 類別中的所有資料定義語言 (DDL) 陳述式。

    • function – 記錄函數呼叫和 DO 區塊。

    • misc – 記錄其他命令,例如 DISCARDFETCHCHECKPOINTVACUUMSET

    • read – 來源為關聯 (例如資料表) 或查詢時,記錄 SELECTCOPY

    • role – 記錄與角色和權限相關的陳述式,例如 GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE

    • write – 目的地為關聯 (資料表) 時,記錄 INSERTUPDATEDELETETRUNCATECOPY

  14. 選擇儲存變更

  15. 前往 https://console.aws.amazon.com/rds/,開啟 Amazon RDS 主控台。

  16. 從資料庫清單中選擇 Aurora PostgreSQL 資料庫叢集的寫入器執行個體以選取它,然後從 Actions (動作) 功能表中選擇 Reboot (重新啟動)。

設定 pgAudit

若要使用設定 pgAuditAWS CLI,請呼叫modify-db-parameter-group作業來修改自訂參數群組中的稽核記錄參數,如下列程序所示。

  1. 使用下列 AWS CLI 命令,將 pgaudit 新增至 shared_preload_libraries 參數。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  2. 使用下列 AWS CLI 命令重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,以便初始化 pgaudit 程式庫。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. 當執行個體可用時,您可以驗證 pgaudit 是否已初始化。使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,然後執行下列命令。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)

    在初始化 PgAudit 之後,您現在可以建立擴充功能。

    CREATE EXTENSION pgaudit;
  4. 關閉 psql 工作階段,以便您可以使用 AWS CLI。

    labdb=> \q
  5. 使用下列 AWS CLI 命令,來指定要由工作階段稽核記錄所記錄的陳述式類別。此範例會將 pgaudit.log 參數設定為 write,此參數會擷取日誌的插入、更新和刪除操作。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.log,ParameterValue=write,ApplyMethod=pending-reboot" \ --region aws-region

    您也可以針對 pgaudit.log 參數選擇下列其中一個值。

    • none – 這是預設值。不會記錄任何資料庫變更。

    • all – 記錄一切 (read、write、function、role、ddl、misc)。

    • ddl – 記錄未包含在 ROLE 類別中的所有資料定義語言 (DDL) 陳述式。

    • function – 記錄函數呼叫和 DO 區塊。

    • misc – 記錄其他命令,例如 DISCARDFETCHCHECKPOINTVACUUMSET

    • read – 來源為關聯 (例如資料表) 或查詢時,記錄 SELECTCOPY

    • role – 記錄與角色和權限相關的陳述式,例如 GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE

    • write – 目的地為關聯 (資料表) 時,記錄 INSERTUPDATEDELETETRUNCATECOPY

    使用下列 AWS CLI 命令,重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region

稽核資料庫物件

在您的 Aurora PostgreSQL 資料庫叢集上設定 pgAudit,並針對您的要求進行設定後,會在 PostgreSQL 日誌中擷取更詳細的資訊。例如,雖然預設 PostgreSQL 記錄組態會識別在資料庫資料表中進行變更的日期和時間,但使用 pgAudit 擴充功能時,日誌項目可以包括結構描述、進行變更的使用者,以及其他詳細資訊,視擴充功能參數的設定方式而定。您可以將稽核設定為以下列方式追蹤變更。

  • 對於每個工作階段,依使用者。對於工作階段層級,您可以擷取完整的命令文字。

  • 對於每個物件,依使用者和資料庫。

在系統上建立 rds_pgaudit 角色,然後將此角色新增至自訂參數群組中的 pgaudit.role 參數時,便會啟用物件稽核功能。根據預設,未設定 pgaudit.role 參數,且唯一允許的值為 rds_pgaudit。下列步驟假設 pgaudit 已初始化,且您已遵循設定 pgAudit 擴充功能中的程序建立 pgaudit 擴充功能。

設定 pgAudit 後 PostgreSQL 日誌檔的影像。

如此範例所示,「LOG: AUDIT: SESSION」一行提供資料表及其結構描述的相關資訊,以及其他詳細資訊。

設定物件稽核
  1. 使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    psql --host=your-instance-name.aws-region.rds.amazonaws.com --port=5432 --username=postgrespostgres --password --dbname=labdb
  2. 使用下列命令建立名為 rds_pgaudit 的資料庫角色。

    labdb=> CREATE ROLE rds_pgaudit; CREATE ROLE labdb=>
  3. 關閉 psql 工作階段。

    labdb=> \q

    在接下來的幾個步驟中,使用 AWS CLI 修改自訂參數群組中的稽核日誌參數。

  4. 使用下列 AWS CLI 命令,將 pgaudit.role 參數設定為 rds_pgaudit。根據預設,此參數是空的,且 rds_pgaudit 是唯一允許的值。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  5. 使用下列 AWS CLI 命令,重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,以便您對參數所做的變更生效。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  6. 執行下列命令來確認 pgaudit.role 已設定為 rds_pgaudit

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

如要測試 pgAudit 記錄功能,您可以執行幾個要稽核的範例命令。例如,您可以執行下列命令。

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

資料庫記錄應包含類似以下的項目。

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

如需有關檢視日誌的資訊,請參閱 監控 Amazon Aurora 日誌檔案

要了解有關 PGAudit 擴展的更多信息,請參閱上的。 GitHub

從稽核記錄中排除使用者或資料庫

Aurora PostgreSQL 資料庫日誌檔中所述,PostgreSQL 日誌會取用儲存空間。使用 pgAudit 擴充功能會在不同程度上增加日誌中收集的資料量,取決於您追蹤的變更。您可能不需要稽核 Aurora PostgreSQL 資料庫叢集中的每個使用者或資料庫。

若要將對儲存的影響降到最低,並避免不必要地擷取稽核記錄,您可以將使用者和資料庫排除在稽核之外。您也可以在給定的工作階段中變更記錄。下列範例向您展示做法。

注意

優先處理工作階段層級的參數設定,再處理 Aurora PostgreSQL 資料庫叢集寫入器執行個體的自訂資料庫參數群組中的設定。如果您不想要資料庫使用者略過稽核記錄組態設定,請務必變更其許可。

假設您的 Aurora PostgreSQL 資料庫叢集已設定為稽核所有使用者和資料庫的相同層級活動。然後,您決定不想要稽核使用者 myuser。您可以使用下列 SQL 命令來關閉 myuser 的稽核。

ALTER USER myuser SET pgaudit.log TO 'NONE';

然後,您可以使用下列查詢來檢查 pgaudit.loguser_specific_settings 欄,以確認參數已設定為 NONE

SELECT usename AS user_name, useconfig AS user_specific_settings FROM pg_user WHERE usename = 'myuser';

您會看到如下輸出。

user_name | user_specific_settings -----------+------------------------ myuser | {pgaudit.log=NONE} (1 row)

您可以使用下列命令,在資料庫的工作階段當中關閉特定使用者的記錄。

ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'none';

使用下列查詢,針對特定使用者和資料庫組合檢查 pgaudit.log 的 settings 欄。

SELECT usename AS "user_name", datname AS "database_name", pg_catalog.array_to_string(setconfig, E'\n') AS "settings" FROM pg_catalog.pg_db_role_setting s LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase LEFT JOIN pg_catalog.pg_user r ON r.usesysid = setrole WHERE usename = 'myuser' AND datname = 'mydatabase' ORDER BY 1, 2;

您會看到類似下列的輸出。

user_name | database_name | settings -----------+---------------+------------------ myuser | mydatabase | pgaudit.log=none (1 row)

在關閉 myuser 的稽核之後,您決定不想要追蹤 mydatabase 的變更。您可以使用下列命令來關閉該特定資料庫的稽核。

ALTER DATABASE mydatabase SET pgaudit.log to 'NONE';

然後,使用下列查詢來檢查 database_specific_settings 欄,以確認 pgaudit.log 已設定為 NONE。

SELECT a.datname AS database_name, b.setconfig AS database_specific_settings FROM pg_database a FULL JOIN pg_db_role_setting b ON a.oid = b.setdatabase WHERE a.datname = 'mydatabase';

您會看到如下輸出。

database_name | database_specific_settings ---------------+---------------------------- mydatabase | {pgaudit.log=NONE} (1 row)

若要將設定回復為 myuser 的預設設定,請使用下列命令:

ALTER USER myuser RESET pgaudit.log;

若要將設定回復為資料庫的預設設定,請使用下列命令。

ALTER DATABASE mydatabase RESET pgaudit.log;

若要將使用者和資料庫重設為預設設定,請使用下列命令。

ALTER USER myuser IN DATABASE mydatabase RESET pgaudit.log;

您也可以將 pgaudit.log 設定為 pgaudit.log 參數的其他允許值之一,將特定事件擷取至日誌。如需詳細資訊,請參閱允許的 pgaudit.log 參數設定清單

ALTER USER myuser SET pgaudit.log TO 'read'; ALTER DATABASE mydatabase SET pgaudit.log TO 'function'; ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'read,function'

pgAudit 擴充功能的參考

您可以變更本節中列出的一或多個參數,針對稽核日誌指定您所需的詳細資訊層級。

控制 pgAudit 行為

您可以變更下表中列出的一或多個參數來控制稽核記錄。

參數 描述

pgaudit.log

指定工作階段稽核記錄將記錄哪些陳述式類別。允許的值包括 ddl、function、misc、read、role、write、none、all。如需詳細資訊,請參閱允許的 pgaudit.log 參數設定清單

pgaudit.log_catalog

開啟 (設定為 1) 時,如果陳述式中的所有關聯都在 pg_catalog 中,則會將陳述式新增至稽核線索。

pgaudit.log_level

指定要用於日誌項目的日誌層級。允許的值:disabled、debug5、debug4、debug3、debug2、debug1、info、notice、warning、log

pgaudit.log_parameter

開啟 (設定為 1) 時,會在稽核日誌中擷取隨陳述式傳遞的參數。

pgaudit.log_relation

開啟 (設定為 1) 時,工作階段的稽核日誌會為 SELECT 或 DML 陳述式中參考的每個關聯 (TABLE、VIEW 等) 建立個別的日誌項目。

pgaudit.log_statement_once

指定日誌記錄包含的陳述式文字和參數,具有陳述式/子陳述式組合的第一個日誌項目,還是具有每個項目。

pgaudit.role

指定用於物件稽核日誌記錄的主要角色。唯一允許的項目為 rds_pgaudit

允許的 pgaudit.log 參數設定清單

描述

此為預設值。不會記錄任何資料庫變更。

全部

記錄一切 (read、write、function、role、ddl、misc)。

ddl

記錄未包含在 ROLE 類別中的所有資料定義語言 (DDL) 陳述式。

函數

記錄函數呼叫和 DO 區塊。

misc

記錄其他命令,例如 DISCARDFETCHCHECKPOINTVACUUMSET

讀取

來源為關聯 (例如資料表) 或查詢時,記錄 SELECTCOPY

role

記錄與角色和權限相關的陳述式,例如 GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE

write

目的地為關聯 (資料表) 時,記錄 INSERTUPDATEDELETETRUNCATECOPY

若要使用工作階段稽核功能記錄多個事件類型,請使用逗號分隔清單。若要記錄所有事件類型,請將 pgaudit.log 設定為 ALL。重新啟動資料庫執行個體以套用變更。

您可以透過物件稽核,調整稽核記錄以使用特定關聯。例如,您可以指定您想要針對一或多個資料表上的 READ 操作稽核記錄。