日志審計
審計是值記錄用戶的登陸退出以及登陸后在數據庫里的行為操作,可以根據安全等級不一樣設置不一樣級別的審計,
此處涉及的參數文件有:
logging_collector --是否開啟日志收集開關,默認off,開啟要重啟DB
log_destination --日志記錄類型,默認是stderr,只記錄錯誤輸出
log_directory --日志路徑,默認是$PGDATA/pg_log, 這個目錄最好不要和數據文件的目錄放在一起, 目錄需要給啟動postgres的操作系統用戶寫權限.
log_filename --日志名稱,默認是postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode --日志文件類型,默認為0600
log_truncate_on_rotation --默認為off,設置為on的話,如果新建了一個同名的日志文件,則會清空原來的文件,再寫入日志,而不是在后面附加。
log_rotation_age --保留單個文件的最大時長,默認是1d,也有1h,1min,1s,個人覺得不實用
log_rotation_size --保留單個文件的最大尺寸,默認是10MB
log_error_verbosity --默認為default,verbose表示冗長的
log_connections --用戶session登陸時是否寫入日志,默認off
log_disconnections --用戶session退出時是否寫入日志,默認off
【推薦的日志配置】
logging_collector = on
log_destination = 'csvlog'
log_truncate_on_rotation = on
log_connections = off
log_disconnections = off
log_error_verbosity = verbose
log_statement = ddl
log_min_duration_statement = 3s
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s
1.記錄級別:
記錄用戶登陸數據庫后的各種操作,postgres日志里分成了3類,通過參數pg_statement來控制,默認的pg_statement參數值是none,即不記錄,可以設置ddl(記錄create,drop和alter)、mod(記錄ddl+insert,delete,update和truncate)和all(mod+select)。
log_statement = ddl
一般的OLTP系統審計級別設置為ddl就夠了,因為記錄輸出各種SQL對性能的影響還是蠻大的,安全級別高一點的也可以設置mod模式,有條件也可以不在數據庫層面做,而是購買設備放在網絡層監控解析。
如果這里設置為none,在 log_min_duration_statement設置為60s,那么log_min_duration_statement也會生效,將執行時間超過60s的SQL打印到日志。
按不同情況進行配置審計級別:
1)審計用戶hm連到數據庫hm 的所有SQL.
alter role hm in database hm set log_statement='all';
2) 審計用戶hm 的所有SQL.
alter role hm set log_statement='all';
3) 審計任何用戶連接到數據庫hm 的所有SQL.
alter database hm set log_statement='all';
2.定位慢查詢SQL
可以設置一定時長的參數(log_min_duration_statement),來記錄超過該時長的所有SQL,對找出當前數據庫的慢查詢很有效。 比如log_min_duration_statement = 2s,記錄超過2秒的SQL,改完需要reload
log_min_duration_statement = 2s
3.監控數據庫的checkpoint
當數據庫進行一項大更新操作時,如果參數設置不當,會在日志里留下大量的告警信息,頻繁的做checkpoint會導致系統變慢,不用設置都會有。
但是不會記錄系統正常的checkpoint,如果你想看系統一天之類發生了多少次checkpoint,以及每次checkpoint的一些詳細信息,比如buffer,sync等,就可以通過設置log_checkpoints,該參數默認值是off。
log_checkpoints = on
4.監控數據庫的鎖
數據庫的鎖通常可以在pg_locks這個系統表里找,但這只是當前的鎖表/行信息,如果你想看一天內有多少個超過死鎖時間的鎖發生,可以在日志里設置並查看,log_lock_waits 默認是off,可以設置開啟。這個可以區分SQL慢是資源緊張還是鎖等待的問題。
log_lock_waits=on
deadlock_timeout=1
還有一些Debug功能,適合修改源碼調試,一般的的系統上並不需要,暫時比較關注的就這些。
5.可以在表上設置觸發器,來審計
6.可以使用插件pg_log_userqueries 來做,沒有必要
【注意事項】
1. 超級用戶可以修改這些配置項, 所以被審計的用戶最好是普通用戶. 否則用戶連上來可以修改這些審計項.
2. 程序用的數據庫賬號和個人用的數據庫賬號分開, 對於程序用的數據庫賬號可以只審計DDL操作, 而對於個人使用的數據庫賬號, 建議審計所有的SQL.
3. 變量優先級(事務>會話>database/role>啟動參數>配置文件)
某些全局變量可以動態修改,例如本文提到的log_statement。修改后reload之后,所有會話都會讀到最新的變量
2020-03-26補充:
為了讓日志文件自動覆蓋,達到保留多少日志的目的,可以進行如下設置:
log_truncate_on_rotation = on
log_filename = 'postgresql-%I.log' #最多保存12小時的日志,每小時一個文件
log_filename = 'postgresql-%H.log' #最多保存24小時的日志,每小時一個文件
log_filename = 'postgresql-%w.log' #最多保存一周的日志,每天一個文件
log_filename = 'postgresql-%d.log' #最多保存一個月的日志,每天一個文件
log_filename = 'postgresql-%j.log' #最多保存一年的日志,每天一個文件