pg數據庫安全配置

pg數據庫安全配置

[TOC]

數據庫安全配置是數據庫管理的重要環節之一。安全配置主要包括密碼、網絡訪問控制、審計等。下面會依次講解在瀚高數據庫中如何實現密碼相關的安全性配置。

1 密碼加密存儲

pg中密碼始終以加密方式存儲在系統目錄中。ENCREPED 關鍵字沒有任何效果, 但被接受向後兼容。加密方式可以通過password_encryption參數配置


--create role test with login encryped password 'test';
create role test with login password 'test';

show password_encryption;
password_encryption
---------------------
md5
(1 row)

select usename,passwd from pg_shadow where usename='test';
 usename |               passwd                
---------+-------------------------------------
 test    | md505a671c66aefea124cc08b76ea6d30bb
(1 row)

2 密碼有效期

pg支持密碼有效期配置,可以通過配置密碼有效期,制定密碼更換週期。

服務器端設置有效期

alter role test valid until '2020-04-24 10:10:00';

select usename,valuntil  from pg_user where usename='test';
 usename |        valuntil        
---------+------------------------
 test    | 2020-12-10 16:58:00+08

客戶端連接測試,密碼有效期到期後,需重新設置密碼


有效期超期報錯

date
Fri Apr 24 10:19:02 CST 2020


psql -h 192.168.6.10 -U test -d highgo
Password for user test:
psql: FATAL: password authentication failed for user "test"

修改有效期
alter role test valid until '2020-12-31 10:10:00';

正常登陸
psql -h 192.168.6.10 -U test -d highgo
Password for user test: 
psql (5.6.5)

PSQL: Release 5.6.5
Connected to:
HighGo Database V5.6 Enterprise Edition Release 5.6.5 - 64-bit Production

Type "help" for help.

highgo=> 

注意:

  • pg_hba.conf配置了local trust,則可在服務器端登陸,不受限制。

3 密碼複雜度策略

passwordcheck.so模塊可以實現密碼複雜度要求,此模塊可以檢查密碼,如果密碼太弱,他會拒絕連接 創建用戶或修改用戶密碼時,強制限制密碼的複雜度,限制密碼不能重複使用 例如密碼長度,包含數字,字母,大小寫,特殊字符等,同時排除暴力破解字典中的字符串 參考官方文檔

3.1、啓用模塊

添加'$libdir目錄下的passwordcheck'到參數shared_preload_libraries,重啓生效 默認so文件都存放在$libdir目錄下


select name,setting from pg_settings where name like '%dynamic%';
name | setting
----------------------------+---------
dynamic_library_path | $libdir
dynamic_shared_memory_type | posix
(2 rows)


ls -atl $PGHOME/lib/postgresql/passwordcheck*
-rwxr-xr-x 1 postgres postgres 8616 Feb 27 10:09 /opt/pg122/lib/postgresql/passwordcheck.so

alter system set shared_preload_libraries=passwordcheck;

重啓生效

shared_preload_libraries參數使用參考“Postgresql共享庫預加載(Shared Library Preloading)”

3.2、複雜度功能驗證

密碼複雜度檢查模塊Passwordcheck

  • 驗證創建的用戶密碼是否符合規則。 密碼:最少8個字符;必須包含數字和字母;密碼中不能含有用戶名字段。
alter role test with password 'test';
ERROR: password is too short
alter role test password '12345678';
ERROR: password must contain both letters and nonletters
alter role test with password 'test1234';
ERROR: password must not contain user name
alter role test with password 'tttt1234';
ALTER ROLE

4、密碼驗證失敗延遲

auth_delay.so模塊會導致服務器在報告身份驗證失敗之前短暫停留,這個主要用於防止暴力破解. 驗證失敗後, 延遲一個時間窗口才能繼續驗證。請注意, 它不會阻止拒絕服務攻擊, 甚至可能會加劇這些攻擊, 因爲在報告身份驗證失敗之前等待的進程仍將使用連接插槽。

4.1、啓用模塊

需要配置以下參數,實現密碼驗證延遲失敗延遲

so文件存儲在$libdir下


ls -atl $PGHOME/lib/auth_delay*
-rwxr-xr-x 1 postgres postgres 8352 Feb 27 10:09 /opt/pg122/lib/postgresql/auth_delay.so

參數修改


shared_preload_libraries --預加載模塊
auth_delay.milliseconds (int) --指定延遲時間
alter system set shared_preload_libraries=passwordcheck,auth_delay;
重啓生效
alter system set auth_delay.milliseconds=5000;
reload生效

注意:auth_delay.milliseconds需要啓用auth_delay後纔可以設置

4.2、驗證

psql -h 192.168.6.10 -U test -p 5432 -d postgres
Password for user test:
--5s
psql: FATAL: password authentication failed for user "test"

輸入密碼後,如果密碼不正確,會等待5s,然後返回密碼失敗提示
psql -h 192.168.6.12 -U test -p 5432 -d postgres
Password for user test:
psql (10.4)
Type "help" for help.
postgres=>

輸入密碼後,如果密碼正確,沒有等待。

5、密碼驗證失敗次數限制,失敗後鎖定, 以及解鎖時間

目前PostgreSQL不支持這個安全策略, 目前只能使用auth_delay來延長暴力破解的時間.

6、設置密碼時防止密碼被記錄到數據庫日誌中

密碼的配置命令可能會被記錄到history文件及csvlog日誌文件中(如果開啓了DDL或更高級別審計log_statement),這些文件明文記錄了密碼,可能造成密碼泄露風險。

6.1、密碼記錄到兩個地方

介紹

  • HISTFILE The file name that will be used to store the history list. If unset, the file name is taken from the PSQL_HISTORY environment variable. If that is not set either, the default is ~/.psql_history, or %APPDATA%\postgresql\psql_history on Windows. For example, putting: \set HISTFILE ~/.psql_history- :DBNAME in ~/.psqlrc will cause psql to maintain a separate history for each database. Note This feature was shamelessly plagiarized from Bash. --
  • csvlog 數據庫錯誤日誌

記錄情況 如以下命令,會記錄到HISTFILE和csvlog日誌中

postgres=# alter role test with password 'tttt1234';
  • history file記錄 [pg@pg ~]$ cat ~/.psql_history |grep tttt1234 alter role test with password 'tttt1234'; [pg@pg ~]$
  • csvlog記錄 [pg@pg ~]$ cat $PGDATA/postgresql.conf |grep log_statement #log_statement = 'none'         # none, ddl, mod, all log_statement = 'ddl' #log_statement_stats = off

[pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tttt1234 2019-04-12 09:33:23.036 CST,"pg","postgres",1309,"[local]",5cafeadb.51d,3,"idle",2019-04-12 09:33:15 CST,3/21,0,LOG,00000,"statement: alter role test with password 'tttt1234';",,,,,,,,,"psql" [pg@pg ~]$

6.2、解決方式

使用createuser命令行工具-W選項提示輸入密碼。 。

[pg@pg ~]$ createuser -l -h 127.0.0.1 -p 5432 -U pg -W tuser
Password:
[pg@pg ~]$
[pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tuser
2019-04-12 11:17:48.348 CST,"pg","postgres",1574,"localhost:42560",5cb0035c.626,3,"idle",2019-04-12 11:17:48 CST,3/236,0,LOG,00000,"statement: CREATE ROLE tuser NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;",,,,,,,,,"createuser"
[pg@pg ~]$
  • 注意:可使用pg_pool提供的pg_md5工具生成密碼, 在psql中使用ALTER ROLE填入md5值。 與上面類似, pg_md5是pgpool提供的一個工具, 實際上就是調用上面的函數

7網絡訪問控制

在$PGDATA/pg_hba.conf文件中配置網絡訪問控制,可限制連接網段和IP地址

如:

# IP reject set
host       all           all           192.168.6.1/32             reject
host       all           all           192.168.6.0/24             reject

reload生效 pg_ctl reload

解釋: 第一列:類型,host表示TCP/IP連接 第二列:數據庫,all表示可以訪問所有數據庫 第三列:數據庫用戶,all表示允許所有數據庫用戶連接 第四列:地址,指定具體的主機名或IP地址 第五列:驗證方式,reject表示拒絕連接

注意:

1 在$PGDATA/pg_hba.conf沒有匹配記錄的IP,會自動拒絕訪問 2 每次連接嘗試都會按順序檢查pg_hba.conf文件中的記錄,因此限制IP記錄應該放在靠前的位置

8 權限分配

對於用戶權限的分配,建議使用最小權限原則。只授予用戶需要的權限。

所有權限的管理

如果是針對對象的所有權限,建議統一使用schema進行管理,大體過程如下 1、新建一個schema

create schema SCHEMA_NAME;

2、對用戶授予管理這個schema的權限

grant all on schema SCHEMA_NAME to USER_NAME;

3、設置將該schema加入到搜索路徑

alter database "benchmarksql" set search_path to "$user", public,SCHEMA_NAME; 

添加新路徑即可,不要修改原有的值。

具體對象授權管理

具體對象授權參考相關的語法

可能用到的授權語句語法

授予用戶對某個schema下的部分表或所有表的操作權限

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES |TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

將某個schema下的函數授予用戶執行權限(EXECUTE)或所有權限(ALL)

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

*授予用戶對某個schema下的部分SEQUENCE或所有SEQUENCE的操作權限

GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶對某個數據庫的管理權限

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶對外部數據的權限

GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶對語言的使用權限,如pl/pgsql、PL/Tcl等

GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶管理schema的權限

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶管理表空間的權限

GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

授予用戶管理數據類型的權限

GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER

將一個用戶的權限授予另一個用戶

GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]

注:在pg中用戶是一個特殊的role。USAGE表示只有使用權限,WITH ADMIN OPTION表示接收權限者擁有對其他用戶授予該對象的權限。

9審計配置

這裏只討論數據庫日誌記錄的審計方式,pg還有專用的審計插件(pg_audit)用於專業的審計,針對pg_audit請參考相關文章。

配置日誌參數,審計連接信息及SQL語句,審計信息生成在數據庫日誌中。 執行以下語句配置:

alter system set log_destination = 'csvlog';
alter system set logging_collector=on;

alter system set log_connections=on;
alter system set log_disconnections=on;
alter system set log_statement = 'mod';

reload生效 pg_ctl reload

解釋: log_destination:PG記錄日誌的方法 logging_collector:啓動一個後臺進程抓取日誌信息寫入日誌文件

log_connections:嘗試連接服務器的記錄,及完成客戶端身份驗證的記錄 log_disconnections :會話終止記錄,及會話持續時間 log_statement:記錄的語句

log_statement參數值:        none,即不記錄        ddl(記錄create,drop和alter)        mod(記錄ddl+insert,delete,update和truncate)        all(mod+select)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章