Postgresql数据库安全性配置-密码

Postgresql数据库安全性配置-密码

数据库密码管理是数据库安全的重要环节之一。密码管理及配置策略主要包括:

  • 密码加密存储
  • 密码有效期
  • 密码复杂度
  • 密码验证失败延迟
  • 密码验证失败次数限制,失败后锁定, 以及解锁时间
  • 设置密码时防止密码被记录到数据库日志中
    下面会依次讲解在PostgreSQL中如何实现密码相关的安全性配置。

1、密码加密存储

pg中密码始终以加密方式存储在系统目录中。ENCREPED 关键字没有任何效果, 但被接受向后兼容。加密方式可以通过password_encryption参数配置


  1. postgres=# show password_encryption;

  2. password_encryption

  3. ---------------------

  4. md5

  5. (1 row)

  6. postgres=# select * from pg_shadow where usename='test';

  7. usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | usec

  8. onfig

  9. ---------+----------+-------------+----------+---------+--------------+-------------------------------------+------------------------+-----

  10. ------

  11. test | 49156 | f | f | f | f | md52d308906cb4ea734a22f76e7927c046b | 2019-04-10 16:58:00+08 |

  12. (1 row)

  13. postgres=#

2、密码有效期

pg支持密码有效期配置,可以通过配置密码有效期,制定密码更换周期。


  1. 服务器端设置有效期

  2. postgres=# alter role test valid until '2019-04-10 16:58:00';

  3. ALTER ROLE

  4. postgres=# select * from pg_user where usename='test';

  5. usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig

  6. ---------+----------+-------------+----------+---------+--------------+----------+------------------------+-----------

  7. test | 49156 | f | f | f | f | ******** | 2019-04-10 16:58:00+08 |

  8. (1 row)

  9. 客户端连接测试

  10. [postgres@pg2 ~]$ date

  11. Wed Apr 10 17:11:49 CST 2019

  12. [postgres@pg2 ~]$ psql -h 192.168.6.12 -U test -d postgres -p 5432

  13. Password for user test:

  14. psql: FATAL: password authentication failed for user "test"

  15. [postgres@pg2 ~]$

注意:

  • pg密码有效期仅针对客户端有效,服务器端不受限制。
  • 网络访问控制文件中不能配置为trust认证方式

3、密码复杂度策略

passwordcheck.so模块可以实现密码复杂度要求,此模块可以检查密码,如果密码太弱,他会拒绝连接
创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用
例如密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串

3.1、启用模块

添加'$libdir/passwordcheck'到参数shared_preload_libraries,重启生效
默认so文件都存放在$libdir目录下


  1. [pg@pg ~]$ ls -atl $LD_LIBRARY_PATH/passwordcheck*

  2. -rwxr-xr-x 1 pg pg 8640 Feb 1 14:23 /opt/postgres/lib/passwordcheck.so

  3. postgres=# select name,setting from pg_settings where name like '%dynamic%';

  4. name | setting

  5. ----------------------------+---------

  6. dynamic_library_path | $libdir

  7. dynamic_shared_memory_type | posix

  8. (2 rows)

  9. postgres=# alter system set shared_preload_libraries=pg_pathman,pg_stat_statements,passwordcheck;

  10. ALTER SYSTEM

  11. postgres=#

  12. 重启生效

shared_preload_libraries参数使用参考“Postgresql共享库预加载(Shared Library Preloading)”

3.2、复杂度功能验证

密码复杂度检查模块Passwordcheck

  • 验证创建的用户密码是否符合规则。
    密码:最少8个字符;必须包含数字和字母;密码中不能含有用户名字段。

  1. postgres=# alter role test with password 'test';

  2. ERROR: password is too short

  3. postgres=# alter role test password '12345678';

  4. ERROR: password must contain both letters and nonletters

  5. postgres=# alter role test with password 'test1234';

  6. ERROR: password must not contain user name

  7. postgres=# alter role test with password 'tttt1234';

  8. ALTER ROLE

  9. postgres=#

4、密码验证失败延迟

auth_delay.so模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。请注意, 它不会阻止拒绝服务攻击, 甚至可能会加剧这些攻击, 因为在报告身份验证失败之前等待的进程仍将使用连接插槽。

4.1、启用模块

需要配置以下参数,实现密码验证延迟失败延迟


  1. so文件存储在$libdir下

  2. [pg@pg lib]$ ls -atl $LD_LIBRARY_PATH/auth_delay*

  3. -rwxr-xr-x 1 pg pg 8432 Feb 1 14:23 /opt/postgres/lib/auth_delay.so

  4. 参数修改

  5. shared_preload_libraries --预加载模块

  6. auth_delay.milliseconds (int) --指定延迟时间

  7. postgres=# alter system set shared_preload_libraries=pg_pathman, pg_stat_statements, passwordcheck,auth_delay;

  8. ALTER SYSTEM

  9. 重启生效

  10. postgres=# alter system set auth_delay.milliseconds=5000;

  11. ALTER SYSTEM

  12. reload生效

4.2、验证

  1. [pg@pg ~]$ psql -h 192.168.6.12 -U test -p 5432 -d postgres

  2. Password for user test:

  3. --5s

  4. psql: FATAL: password authentication failed for user "test"

  5. [pg@pg ~]$

  6. 输入密码后,如果密码不正确,会等待5s,然后返回密码失败提示

  7. [pg@pg ~]$ psql -h 192.168.6.12 -U test -p 5432 -d postgres

  8. Password for user test:

  9. psql (10.4)

  10. Type "help" for help.

  11. postgres=>

  12. 输入密码后,如果密码正确,没有等待。

5、密码验证失败次数限制,失败后锁定, 以及解锁时间

目前PostgreSQL不支持这个安全策略, 目前只能使用auth_delay来延长暴力破解的时间.

6、设置密码时防止密码被记录到数据库日志中

密码的配置命令可能会被记录到history文件及csvlog日志文件中(如果开启了DDL或更高级别审计log_statement),这些文件明文记录了密码,可能造成密码泄露风险。

6.1、密码记录到两个地方

  1. HISTFILE

  2. 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:

  3. \set HISTFILE ~/.psql_history- :DBNAME

  4. in ~/.psqlrc will cause psql to maintain a separate history for each database.

  5. Note

  6. This feature was shamelessly plagiarized from Bash. --??!!

  7. csvlog

  8. 数据库错误日志

事例:


  1. 如以下命令,会记录到HISTFILE和csvlog日志中

  2. postgres=# alter role test with password 'tttt1234';

  3. ALTER ROLE

  4. history file记录

  5. [pg@pg ~]$ cat ~/.psql_history |grep tttt1234

  6. alter role test with password 'tttt1234';

  7. [pg@pg ~]$

  8. csvlog记录

  9. [pg@pg ~]$ cat $PGDATA/postgresql.conf |grep log_statement

  10. #log_statement = 'none'         # none, ddl, mod, all

  11. log_statement = 'ddl'

  12. #log_statement_stats = off

  13. [pg@pg ~]$

  14. [pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tttt1234

  15. 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"

  16. [pg@pg ~]$

6.2、解决方式
  1. 使用createuser命令行工具-W选项提示输入密码。
  2. 使用pg_md5工具生成密码, 在psql中使用ALTER ROLE填入md5值。
    与上面类似, pg_md5是pgpool提供的一个工具, 实际上就是调用上面的函数。

  1. [pg@pg ~]$ createuser -l -h 127.0.0.1 -p 5432 -U pg -W tuser

  2. Password:

  3. [pg@pg ~]$

  4. [pg@pg ~]$ cat $PGDATA/pg_log/postgresql-2019-04-12_092557.csv |grep tuser

  5. 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"

你可能感兴趣的:(postgresql,数据库,postgresql)