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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Postgresql数据库安全性配置-密码 数据库密码管理是数据库安全的重要环节之一。密码管理及配置策略主要包括: 密码加密存储 密码有效期 密码复杂度 密码验证失败延迟 密码验证失败次数限制,失败后锁定, 以及解锁时间 设置密码时防止密码被记录到数据库日志中下面会依次讲解在PostgreSQL中如何实现密码相关的安全性配置。

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

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

  • 密码加密存储
  • 密码有效期
  • 密码复杂度
  • 密码验证失败延迟
  • 密码验证失败次数限制,失败后锁定, 以及解锁时间
  • 设置密码时防止密码被记录到数据库日志中
    下面会依次讲解在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-10 16:58:00+08 | 
(1 row)
postgres=#
AI 代码解读

2、密码有效期

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

服务器端设置有效期
postgres=# alter role test valid until '2019-04-10 16:58:00';
ALTER ROLE
postgres=# select * from pg_user where usename='test';
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig 
---------+----------+-------------+----------+---------+--------------+----------+------------------------+-----------
test | 49156 | f | f | f | f | ******** | 2019-04-10 16:58:00+08 | 
(1 row)
客户端连接测试
[postgres@pg2 ~]$ date
Wed Apr 10 17:11:49 CST 2019
[postgres@pg2 ~]$ psql -h 192.168.6.12 -U test -d postgres -p 5432
Password for user test: 
psql: FATAL: password authentication failed for user "test"
[postgres@pg2 ~]$ 
AI 代码解读

注意:

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

3、密码复杂度策略

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

3.1、启用模块

添加'libdir/passwordchecksharedpreloadlibrariessolibdir目录下

[pg@pg ~]$ ls -atl $LD_LIBRARY_PATH/passwordcheck*
-rwxr-xr-x 1 pg pg 8640 Feb 1 14: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=# 
重启生效
AI 代码解读

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

3.2、复杂度功能验证

密码复杂度检查模块Passwordcheck

  • 验证创建的用户密码是否符合规则。
    密码:最少8个字符;必须包含数字和字母;密码中不能含有用户名字段。
postgres=# alter role test with password 'test';
ERROR: password is too short
postgres=# alter role test password '12345678';
ERROR: password must contain both letters and nonletters
postgres=# alter role test with password 'test1234';
ERROR: password must not contain user name
postgres=# alter role test with password 'tttt1234';
ALTER ROLE
postgres=#
AI 代码解读

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 1 14: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生效
AI 代码解读

4.2、验证

[pg@pg ~]$ psql -h 192.168.6.12 -U test -p 5432 -d postgres
Password for user test: 
--5s
psql: FATAL: password authentication failed for user "test"
[pg@pg ~]$
输入密码后,如果密码不正确,会等待5s,然后返回密码失败提示
[pg@pg ~]$ psql -h 192.168.6.12 -U test -p 5432 -d postgres
Password for user test: 
psql (10.4)
Type "help" for help.
postgres=> 
输入密码后,如果密码正确,没有等待。
AI 代码解读

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 
数据库错误日志
AI 代码解读

事例:

如以下命令,会记录到HISTFILE和csvlog日志中
postgres=# alter role test with password 'tttt1234';
ALTER ROLE
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 ~]$ 
[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 ~]$ 
AI 代码解读

6.2、解决方式

  1. 使用createuser命令行工具-W选项提示输入密码。
  2. 使用pg_md5工具生成密码, 在psql中使用ALTER ROLE填入md5值。
    与上面类似, pg_md5是pgpool提供的一个工具, 实际上就是调用上面的函数。
[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 ~]$ 
AI 代码解读

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
chrisx
+关注
目录
打赏
0
0
0
0
327
分享
相关文章
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
Navicat Premium 17 最新版下载与配置:5分钟完成企业级数据库工具部署
Navicat Premium 17 是一款支持多种主流数据库(如 MySQL、Oracle、PostgreSQL 等)的多数据库管理工具,提供可视化数据建模、SQL 编辑和数据同步等功能。试用版提供 14 天全功能体验,商业版支持跨平台使用。安装环境要求 Windows 10/11 或 macOS 12.0+,最低配置为 4GB 内存。下载并解压安装包后,按步骤启动安装程序、接受许可协议、自定义安装路径并完成安装。首次运行时需激活许可证并配置数据库连接。常见问题包括无法写入注册表、试用期续费及连接数据库权限问题。高级功能涵盖 SSH 通道加速、自动化任务调度和性能调优建议。
196 19
YashanDB异构数据库链接配置
本指南介绍在YashanDB中配置异构数据库链接(DBLINK)的方法,特别是连接至Oracle数据库的前置要求与步骤。需确保YashanDB服务端安装plugin插件包、Oracle Instant Client及libaio库,否则可能导致错误或进程崩溃。文档还提供了Oracle Instant Client和libaio库的具体安装指导,帮助管理员顺利完成配置。
【赵渝强老师】PostgreSQL的模板数据库
在PostgreSQL中,创建新数据库时,默认通过拷贝`template1`实现。`template1`包含标准系统对象,可自定义以影响新数据库内容;而`template0`是纯净模板,仅含预定义对象且不应修改。视频讲解和代码示例展示了如何查看现有数据库信息及标识字段的作用。 ![图示](https://ucc.alicdn.com/pic/developer-ecology/yub6x2mlkqwck_398ed06397a44c2d9bfbb5ae5c90bbc0.png) [视频链接](https://www.bilibili.com/video/BV1szyfY4EQn)
【赵渝强老师】PostgreSQL的模板数据库
|
2月前
|
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
230 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
PostgreSQL 入门指南:安装、配置与基本命令
本文从零开始,详细介绍如何在 Windows、Linux 和 macOS 上安装和配置 PostgreSQL,涵盖30+个实操代码示例。内容包括安装步骤、配置远程访问和用户权限、基础数据库操作命令(如创建表、插入和查询数据),以及常见问题的解决方案。通过学习,你将掌握 PostgreSQL 的基本使用方法,并为后续深入学习打下坚实基础。
710 1
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等