PostgreSQL密码安全策略
引用地址:https://blog.csdn.net/weixin_34143774/article/details/89561946 请以原文为主,引用注明出处。
问题:今天公司进行软件测评,在测评期间,测评人员问起PostgreSQL登录失败导致用户锁定的次数,密码输错几次账户会被锁定?
网上查了一圈,oracle和mysql都有相关设置,只有pg库没有找到相关的设置参数。偶然发现网上的帖子,结果发现PG库尚不支持相关设置。
下面引用一下:
数据库密码管理是数据库安全的重要环节之一。密码管理及配置策略主要包括:
- 密码加密存储
- 密码有效期
- 密码复杂度
- 密码验证失败延迟
- 密码验证失败次数限制,失败后锁定, 以及解锁时间
- 设置密码时防止密码被记录到数据库日志中
下面会依次讲解在PostgreSQL中如何实现密码相关的安全性配置。
1、密码加密存储
pg中密码始终以加密方式存储在系统目录中。ENCREPED 关键字没有任何效果, 但被接受向后兼容。加密方式可以通过password_encryption参数配置。
postgres=# show password_encryption;password_encryption
---------------------md5
(1 row)
postgres=# select*from pg_shadow where usename="test";
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | usec
onfig
---------+----------+-------------+----------+---------+--------------+-------------------------------------+------------------------+-----
------
test |49156| f | f | f | f | md52d308906cb4ea734a22f76e7927c046b |2019-04-1016:58:00+08|
2、密码有效期
pg支持密码有效期配置,可以通过配置密码有效期,制定密码更换周期。
服务器端设置有效期postgres
=# alter role test valid until "2019-04-10 16:58:00";ALTER ROLEpostgres
=# select*from pg_user where usename="test";usename
| usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig ---------+----------+-------------+----------+---------+--------------+----------+------------------------+-----------test |49156| f | f | f | f |********|2019-04-1016:58:00+08|
(1 row)
客户端连接测试
[postgres@pg2 ~]$ date
Wed Apr 1017:11:49 CST 2019
[postgres@pg2 ~]$ psql -h 192.168.6.12-U test -d postgres -p 5432
Password foruser test:
psql: FATAL: password authentication failed foruser "test"
注意:
- pg密码有效期仅针对客户端有效,服务器端不受限制。
- 网络访问控制文件中不能配置为trust认证方式
3、密码复杂度策略
passwordcheck.so模块可以实现密码复杂度要求,此模块可以检查密码,如果密码太弱,他会拒绝连接
创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用
例如密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串
3.1、启用模块
添加"$libdir/passwordcheck"到参数shared_preload_libraries,重启生效
默认so文件都存放在$libdir目录下
[pg@pg ~]$ ls -atl $LD_LIBRARY_PATH/passwordcheck*shared_preload_libraries参数使用参考“Postgresql共享库预加载(Shared Library Preloading)”-rwxr-xr-x 1 pg pg 8640 Feb 114:23/opt/postgres/lib/passwordcheck.so
postgres=# select name,setting from pg_settings where name like"%dynamic%";
name | setting
----------------------------+---------
dynamic_library_path | $libdir
dynamic_shared_memory_type | posix
(2 rows)
postgres=# alter system set shared_preload_libraries=pg_pathman,pg_stat_statements,passwordcheck;
ALTER SYSTEM
postgres=#
重启生效
3.2、复杂度功能验证
密码复杂度检查模块Passwordcheck
- 验证创建的用户密码是否符合规则。
密码:最少8个字符;必须包含数字和字母;密码中不能含有用户名字段。
postgres=# alter role test with password "test";ERROR: password
is too shortpostgres
=# alter role test password "12345678";ERROR: password must contain both letters
and nonletterspostgres
=# alter role test with password "test1234";ERROR: password must
not contain user namepostgres
=# alter role test with password "tttt1234";ALTER ROLE
4、密码验证失败延迟
auth_delay.so模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。请注意, 它不会阻止拒绝服务攻击, 甚至可能会加剧这些攻击, 因为在报告身份验证失败之前等待的进程仍将使用连接插槽。
4.1、启用模块
需要配置以下参数,实现密码验证延迟失败延迟
so文件存储在$libdir下[pg@pg lib]$ ls -atl $LD_LIBRARY_PATH/auth_delay*-rwxr-xr-x 1 pg pg 8432 Feb 114:23/opt/postgres/lib/auth_delay.so
参数修改
shared_preload_libraries --预加载模块
auth_delay.milliseconds (int) --指定延迟时间
postgres=# alter system set shared_preload_libraries=pg_pathman, pg_stat_statements, passwordcheck,auth_delay;
ALTER SYSTEM
重启生效
postgres=# alter system set auth_delay.milliseconds=5000;
ALTER SYSTEM
reload生效
4.2、验证
[pg@pg ~]$ psql -h 192.168.6.12-U test -p 5432-d postgresPassword
foruser test: --5spsql: FATAL: password authentication failed foruser "test"
[pg@pg ~]$
输入密码后,如果密码不正确,会等待5s,然后返回密码失败提示
[pg@pg ~]$ psql -h 192.168.6.12-U test -p 5432-d postgres
Password foruser test:
psql (10.4)
Type "help" for help.
postgres=>
输入密码后,如果密码正确,没有等待。
5、密码验证失败次数限制,失败后锁定, 以及解锁时间
目前PostgreSQL不支持这个安全策略, 目前只能使用auth_delay来延长暴力破解的时间.
6、设置密码时防止密码被记录到数据库日志中
密码的配置命令可能会被记录到history文件及csvlog日志文件中(如果开启了DDL或更高级别审计log_statement),这些文件明文记录了密码,可能造成密码泄露风险。
6.1、密码记录到两个地方
HISTFILEThe
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 isnotset either, the defaultis~/.psql_history, or%APPDATA%postgresqlpsql_history on Windows. For example, putting:set HISTFILE ~/.psql_history- :DBNAMEin~/.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";ALTER ROLEhistory file记录
[pg@pg ~]$ cat ~/.psql_history |grep tttt1234alter role test with password "tttt1234";[pg@pg ~]$csvlog记录
[pg@pg ~]$ cat $PGDATA/postgresql.conf |grep log_statement#log_statement
="none" # none, ddl, mod, alllog_statement
="ddl"#log_statement_stats
=off[pg@pg ~]$
[pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tttt1234
2019-04-1209:33:23.036 CST,"pg","postgres",1309,"[local]",5cafeadb.51d,3,"idle",2019-04-1209:33:15 CST,3/21,0,LOG,00000,"statement: alter role test with password "tttt1234";",,,,,,,,,"psql"
6.2、解决方式
- 使用createuser命令行工具-W选项提示输入密码。
- 使用pg_md5工具生成密码, 在psql中使用ALTER ROLE填入md5值。
与上面类似, pg_md5是pgpool提供的一个工具, 实际上就是调用上面的函数。
[pg@pg ~]$ createuser -l -h 127.0.0.1-p 5432-U pg -W tuserPassword:
[pg@pg ~]$ [pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tuser2019-04-1211:17:48.348 CST,"pg","postgres",1574,"localhost:42560",5cb0035c.626,3,"idle",2019-04-1211:17:48 CST,3/236,0,LOG,00000,"statement: CREATE ROLE tuser NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;",,,,,,,,,"createuser"
以上是 PostgreSQL密码安全策略 的全部内容, 来源链接: utcz.com/z/533206.html