審計
日志審計
開啟標准日志審計
修改配置文件 $PGDATA/postgresql.conf,配置開啟標准日志文件
logging_collector --是否開啟日志收集開關,默認off,推薦on
log_destination --日志記錄類型,默認是stderr,只記錄錯誤輸出,推薦csvlog,總共包含:stderr, csvlog, syslog, and eventlog,
log_directory --日志路徑,默認是$PGDATA/pg_log,
log_filename --日志名稱,默認是postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode --日志文件類型,默認為0600
log_truncate_on_rotation --默認為off,設置為on的話,文件內容覆蓋方式:off后面附加,on:清空再加
log_rotation_age --保留單個文件的最大時長,默認是1d,也有1h,1min,1s
log_rotation_size --保留單個文件的最大尺寸,默認是10MB
log_error_verbosity --默認為default,verbose表示冗長的
log_connections --用戶session登陸時是否寫入日志,默認off,推薦為on
log_disconnections --用戶session退出時是否寫入日志,默認off,推薦為on
log_statement --記錄用戶登陸數據庫后的各種操作
- none,即不記錄
- ddl(記錄create,drop和alter)
- mod(記錄ddl+insert,delete,update和truncate)
- all(mod+select)
log_min_duration_statement = 2s --記錄超過2秒的SQL
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s
pgaudit 插件實現
使用 log_statement=all 提供基本語句日志記錄,但細粒度不夠精細。pgaudit 提供詳細的會話和/或對象審計日志功能。
對應版本關系
插件下載和安裝
https://github.com/pgaudit/pgaudit
git clone https://github.com/pgaudit/pgaudit.git
cd pgaudit
make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-13/bin/pg_config
配置
vi $PGDATA/postgresql.conf
shared_preload_libraries= 'pgaudit'
psql
select * from pg_available_extensions where name like '%audit%';
CREATE EXTENSION pgaudit;
pgaudit配置參數
select name,setting from pg_settings where name like 'pgaudit%';
pgaudit.log
可能的值是:
- READ: SELECT and COPY when the source is a relation or a query.
- WRITE: INSERT, UPDATE, DELETE, TRUNCATE, and COPY when the destination is a relation.
- FUNCTION: Function calls and DO blocks.
- ROLE: Statements related to roles and privileges: GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL: All DDL that is not included in the ROLE class.
- MISC: Miscellaneous commands, e.g. DISCARD, FETCH, CHECKPOINT, VACUUM.
可以使用逗號分隔的列表來提供多個類,並且類可以通過使用一種來減少類來減少。
默認值為none。
pgaudit.log_catalog
指定在語句中的所有關系都在pg_catalog中的情況下,應該啟用會話日志記錄。禁用此設置將減少日志中的噪音,例如psql和PgAdmin等工具,這些工具對目錄進行了大量查詢。 默認值on 。
pgaudit.log_level
指定用於日志條目的日志級別 (see Message Severity Levels for valid levels) ,但注意ERROR、FATAL和PANIC。此設置用於進行回歸測試,也可能對最終用戶用於測試或其他目的使用。 默認值為log。
pgaudit.log_parameter
指定審核日志記錄應該包含與語句傳遞的參數。當參數出現時,在語句文本之后,將以CSV格式包含。 缺省值off。
pgaudit.log_relation
指定會話審核日志記錄是否應該為SELECT或DML語句中引用的每個關系(表、視圖等)創建單獨的日志項。這是在不使用對象審核日志記錄的情況下進行窮舉日志記錄的一種有用的捷徑。 缺省值已關閉。
pgaudit.logstatementonce
指定日志記錄是否包含語句、文本和參數,其中包含statement/substatement組合的第一個日志條目,或與每個條目一起。禁用此設置將導致更少的日志記錄,但可能會使確定生成日志項的語句變得更困難,盡管statement/substatement對和進程id應該足以標識使用上一個條目記錄的語句文本。 缺省值off。
pgaudit.role
指定要用於對象審核日志記錄的主角色。可以通過將多個審計角色授予主角色來定義多個審計角色。這就允許多個組負責審計日志記錄的不同方面。 沒有默認值。
會話審計日志記錄
會話審計日志記錄提供了后端用戶執行的所有語句的詳細日志。
配置
使用pgaudit.log設置啟用會話日志記錄。 為所有DML和DDL啟用會話日志記錄,並記錄DML語句中的所有關系:
set pgaudit.log = 'write, ddl';set pgaudit.log_relation = on; 為除MISC之外的所有命令啟用會話日志記錄,並將審核日志信息作為NOTICE提交:
set pgaudit.log = 'all, -misc';set pgaudit.log_level = notice;
對象審核日志
只有SELECT、INSERT、UPDATE和DELETE命令才會被支持。在對象審核日志記錄中不包含TRUNCATE。
pgaudit.log = 'read, write'的一個更細粒度的替換。因此,將它們結合在一起可能是不明智的,但一個可能的場景是使用會話日志記錄每個語句,然后用對象日志來補充有關特定關系的更多細節。
配置
對象級別的審計日志記錄是通過角色系統實現的。pgaudit.role設置定義了用於審核日志記錄的角色。當審計角色具有執行命令的權限或繼承來自另一個角色的權限時,將對關系(表、視圖等)進行審核。這使您能夠有效地擁有多個審計角色,盡管在任何上下文中都有一個主角色。
將pgaudit.role設置為auditor,並grant在ACCOUNT表中的SELECT和DELETE權限。現在將記錄帳戶表中的任何SELECT或DELETE語句:
set pgaudit.role = 'auditor';grant select, delete
on public.account to auditor;
pgAudit Analyze 插件
PostgreSQL 審計日志分析器 (pgAudit Analyze) 從 PostgreSQL 日志中讀取審計條目並將它們加載到數據庫模式中以幫助分析和審計。