【学习资料】第3期PostgreSQL 数据库安全指南 - 以及安全合规

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 大家好,这里是PostgreSQL 数据库安全指南 - 以及安全合规

背景


数据库在一个企业中通常都处于非常核心的位置,数据库安全是一个非常严肃的话题。

从机房、网络、服务器、数据交换设备、操作系统、应用程序、数据库本身,数据库所处的环境非常复杂,安全隐患也非常多。

所以本文将从各个层面帮助大家理解和避免一些常见的安全隐患问题。

本文是PostgreSQL使用安全指导性的文章,涉及详细的用法或原理请参考相关链接。

如何安全的使用PostgreSQL,让用户高枕无忧呢?

可以分为如下几个方面来加固你的数据库。

一、认证安全

认证前的安全,端口暴露度的把握。

PostgreSQL认证安全》

认证是使用数据库的第一关,如果认证不安全,你的数据库将很容易被入侵。

1. pg_hba.conf安全

配置合理的pg_hba.conf,将权限控制到最小。

任何情况下都不允许trust认证方法;

超级用户只允许从本地连接,不允许从网络连接;

dbname+username+ip限制到最小,"授权用户"只能从"授权IP"过来连接"授权数据库"

如果使用数据库密码认证,请务必使用md5认证方法,网络传输的密码是md5+随机字符加密后的密文。

2. 密码复杂度策略

创建用户或修改用户密码时,强制限制密码的复杂度,例如密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串。

PostgreSQL认证安全》

3. 密码更换周期

使用合理的密码更换周期,创建角色时使用VALID UNTIL ‘timestamp',同时限制密码不能重复使用,

请注意配合监控使用,及时提醒管理员和用户密码快到期了。

4. 密码存储策略

如果使用数据库密码认证,创建角色时请使用encrypted password,这样pg_shadow.passwd存储的是密码+角色名的MD5码,否则是明文。


         
postgres=# select usename,passwd from pg_shadow where usename='r_test';
usename |  passwd
---------+----------
r_test  | hello123
(1 row)

         
postgres=# alter role r_test encrypted password 'hello123';
ALTER ROLE
postgres=# select usename,passwd from pg_shadow where usename='r_test';
usename |               passwd
---------+-------------------------------------
r_test  | md5bb0d7bef45a0530ac529e7b43943a2d1
(1 row)

         
postgres=# select md5('hello123r_test');
md5
----------------------------------
bb0d7bef45a0530ac529e7b43943a2d1
(1 row)

5. 设置密码时防止密码被记录到数据库日志,history,审计日志,pg_stat_activity, pg_stat_statements.

(例如使用了readline, 堡垒机, 或者开启了log_statement)


         
pg_log/xxx.csv
堡垒机日志
pg_stat_activity视图
pg_stat_statements视图与文件(与PG版本有关)

通过修改PG数据库内核,直接避免在审计日志、pg_stat_activitypsql_historypg_stat_statements中出现明文密码或MD5码。

6. 外部表密码安全

回收pg_user_mappings视图的public权限,否则mapping用户可以看到user mapping下的密码。


         

7. dblink密码安全

普通用户使用dblink时,需要提供连接用户和密码,不建议使用。如果一定要用,请限制dblink目标用户在目标数据库集群的权限到最小化。

同时开放DBLINK还有一个问题,请参考

《开放dblink , fdw带来的安全隐患》

8. 如果使用外部认证,如AD域,请加固对应的认证服务。

9. 应用程序配置文件中如果需要配置用户和密码,请确保应用程序服务器的安全。防止配置文件泄露。

10. 数据库本身的认证方式加固,但是需要客户端驱动同时来支持,修改认证协议。

参考

PostgreSQL psql 安全设置数据库用户密码的方法之一》

8. 认证方法的安全(特别是云服务)

PostgreSQL md5 对比MySQL - 秘钥认证》

建议使用scram-sha-256机制。

PostgreSQL 10.0 preview 安全增强- SASL认证方法scram-sha-256 安全认证机制》

认证方法,绝对不要使用可以捕获密码明文的认证方法,例如password方法,在认证过程中传输的就是明文密码,而MD5传输的是salt以及saltmd5码加密后的md5码。

二、数据传输安全

确保数据传输过程的安全,即使数据被截获,也不需要担心。

1. 数据传输加密

如果你的网络是不可靠的,请使用加密传输,例如OPENSSL

参考,

PostgreSQL如何实现网络压缩传输或加密传输(openssl)

2. 认证过程加密

认证过程加密,指认证过程中,网络上传输的密码安全,如果使用数据库认证,请使用MD5方法(配置pg_hba.conf)。确保网络中传输的是随机码和MD5加密后的MD5

但是请注意,MD5也不能泄露,泄露是危险的,可以参考以下文档使用MD5进行认证

PostgreSQL对比MySQL - 秘钥认证》

三、数据安全

你的数据安全吗?如果你存储的敏感数据在数据库中是明文的,一旦数据库暴露,用户数据可能泄露,如何尽可能的保证泄露的数据的安全呢?

1. 字段存储加密,使用加密的数据类型。

将敏感数据加密后存储在数据库中,即使加密数据泄露,只要加解密方法没有泄露,也是相对安全的。

加解密方法建议放在应用端实现,如果加解密在数据库端实现,用户一旦入侵数据库,更容易破解。(或者加密在数据库端实现,解密在应用程序端实现)

《固若金汤- PostgreSQL pgcrypto加密插件》

2. 敏感数据,跟踪并记录DML,truncate操作的undo

对于非常敏感的数据,我们应该记录对这些数据操作的UNDO,在必要时刻可以快速的回滚到误操作前。

这种方法主要是对付SQL注入,人为误操作(包括delete,update,insert,truncate的回滚)。

请参考,

PostgreSQL闪回- flash back query emulate by trigger

3. 函数代码加密

如果我们将业务逻辑放在数据库函数中处理的话,肯定不想让用户看到函数的内容。

对于先编译后执行的函数,例如C函数,是不需要加密的,但是,对于解释性语言函数如plpgsql,建议加密函数的内容。

目前enterprisedb有这个特性,社区版本的PostgreSQL没有这个特性。

请参考,

PostgreSQL函数封装- Wrap Function code like Oracle package

http://www.cybertec.at/en/products/plpgsql_sec-encrypt-your-stored-procedure-codes/

如果不能加密,至少需要控制普通用户不能查看函数内容。

PostgreSQL函数代码隐藏- How to control who can see PostgreSQL function's source code

4. 使用recycle bin插件,用户在删对象时,对象会存储在recycle bin schema下,而不会被真实删除。那么表被误删除或恶意删除后,很容易找回。(使用钩子实现)

请参考,

PostgreSQL回收站功能- 基于HOOKrecycle bin pgtrashcan

5. 透明加密,防止数据文件被拖走后,泄露数据。

手段包括类型透明加密(TDE),文件透明加密(FDE)

参考

PostgreSQL透明加密(TDE,FDE) - 块级加密》

四、限控制

1. 权限管理

最危险的就是最容易暴露的数据库用户,当然是应用连接数据库的账号(以下简称应用账号)。

应用账号权限越大,应用程序被攻击后破坏性就越大。

例如用户有删数据库,删表,删索引,删表空间,删SCHEMA,删函数等等这样的权限的话,危害极大。

安全建议:

1.1 使用超级用户创建数据库,SCHEMA,应用所需的对象(如表,索引,函数)。

1.2 创建应用账号角色。

1.3 回收数据库,schemalanguage,应用对象的public权限。


         
revoke all on schema sch_name from public;
revoke all on language plpgsql from public;
revoke all on table ... from public;
revoke all on function ... from public;
......

1.4 将数据库,schema的使用权限赋予给应用账号。


         
grant usage on schema sch_name to approle;

1.5 将应用需要访问的对象的相关权限赋予给应用账号。


         

这样,应用账号只有对象的使用权限,没有对象的DROPTRUNCATEREPLACE权限,相对来说是更安全的。

2. 通过事件触发器禁止应用账号执行DDL,通过这种方法可以限制用户执行DDL,防止被攻击后,用户执行DROPTRUNCATE删除对象或清空数据(当然delete不带条件还是能删除数据的,需要用其他手段)

请参考,

PostgreSQL事件触发器- PostgreSQL 9.3 Event Trigger

3. 防止执行不带条件的delete,update

例如,在需要保护的表里,新增一条dummy记录,创建行触发器,当这条记录被更新或删除时,抛出异常。

对于业务上不允许执行删除操作的表,不要赋予该表的delete权限给应用账号,也就不会有这个风险。

4. 函数语言安全

建议回收函数语言的public权限,以及普通用户的权限,用户不能创建函数。执行online code

例如:


         
revoke all on language plpgsql from app_role;

5. 行级安全策略

限制普通用户只能操作表中的指定条件的记录,用于rewriter改写重写规则,普通用户只能访问满足指定条件的行。

请参考,

PostgreSQL行安全策略- PostgreSQL 9.5 new feature - can define row security policy for table

6. 对于只需要访问某些行,或某些列的需求,可以通过列权限或视图来限制应用账号的权限。

五、防意攻

1. 视图攻击

用户利用PostgreSQL的优化器原理,创建成本极低的函数,在函数中获取视图限制外的隐藏内容。

如果用户没有创建函数的权限,用户就无法利用这个原理。

或者使用安全栅栏来弥补。

请参考,

PostgreSQL views privilege attack and security with security_barrier(视图攻击)

PostgreSQL leakproof function in rule rewrite("attack" security_barrier views)

或者使用基于安全策略来管理数据可见性。

PostgreSQL 9.4 patch : Row-Level Security

PostgreSQL行安全策略- PostgreSQL 9.5 new feature - can define row security policy for table

2. 防止SQL注入

应用层应该有SQL注入预防手段,例如使用简单的过滤器,使用绑定变量等手段。

3. 密码暴力破解

目前可以通过密码错误延迟认证(auth_delay)来增加暴力破解需要的时间。

请参考,

PostgreSQL密码安全指南》

4. 防止普通用户通过函数调用陷阱进行攻击

PostgreSQL安全陷阱- 利用触发器或规则,结合security invoker函数制造反噬陷阱》

5. Hacking PostgreSQL

6. 防止恶意占用连接,即使攻击者没有密码,也能占用SERVER SLOT,即攻击者连接数据库时,在提示输入密码的阶段不响应,这个SOLT会被占用,相当于消耗数据库的一个连接。

通过如下参数,可以控制认证过程的时间,但是无法防止恶意的攻击,因为超时后攻击者又可以发起连接。

https://www.postgresql.org/docs/9.6/static/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SECURITY


         

         
Maximum time to complete client authentication, in seconds.

         
If a would-be client has not completed the authentication protocol in this much time, the server closes the connection.

         
This prevents hung clients from occupying a connection indefinitely.

         
The default is one minute (1m). This parameter can only be set in the postgresql.conf file or on the server command line.

所以不要随机的暴露端口。

7. 通过端口尝试CANCEL用户QUERY

PostgreSQL cancel 安全漏洞》

六、份,容灾,恢复测试

再好的安全策略,也需要备份。

基于时间点的,块级别增量备份,是比较靠谱的。(你可以选择合适的文件系统,例如btrfs)

请参考,

PostgreSQL最佳实践- 块级增量备份(ZFS)方案与实战》

PostgreSQL最佳实践- 块级增量备份(ZFS)验证- recovery test script for zfs snapshot clone + postgresql stream replication + archive

另外PostgreSQL的每个数据块中都有LSN编号,使用这个也能实现块级别的增量备份,参考

PostgreSQL最佳实践- 块级别增量备份(pg_rman baseon LSN)源码浅析与使用》

PostgreSQL最佳实践- pg_rman standby为源的备份浅析》

PostgreSQL最佳实践- pg_rman 数据库恢复示例软件限制解说》

七、审计

审计功能,一般是用于排查问题的,当然也是一种举证的手段,例如你的数据库遭到暴力破坏了,证据非常重要。

这里有一些例子:

如何跟踪postgresql.conf的配置变更?

worker process钩子程序的妙用.

PostgreSQL配置文件变更审计- A custom background worker process to log changes to postgresql.conf to a table

如何跟踪表中的记录被哪个用户修改或插入?

PostgreSQL跟踪谁动了你的记录- Use insert_username Tracking Who Changed a Table

使用pg_log_userqueries插件, 审计指定用户,数据库或超级用户的所有执行的SQL.

PostgreSQL灵活审计插件- PostgreSQL per database or per user audit use pg_log_userqueries

使用hstore插件和触发器跟踪表的行记录变更.

USE hstore store table's trace record

PostgreSQL中如何跟踪表的创建时间, 表定义的修改时间

PostgreSQL跟踪DDL时间- cann't use pg_class's trigger trace user_table's create,modify,delete Time

PostgreSQL 精细化审计的实施.

1. 审计指定表的INSERT, UPDATE, DELETE, TRUNCATE

2. 审计指定用户对指定表的INSERT, UPDATE, DELETE, TRUNCATE

3. 审计指定表的指定数据的INSERT, UPDATE, DELETE

4. 如何让数据库只审计成功提交的数据, 而不记录回滚事务.

PostgreSQL审计成功事务- PostgreSQL Fine-Grained Table,Column,Row Level Audit

PostgreSQL 审计功能配置

PostgreSQL审计- PostgreSQL Audit by Database or Role wide parameter

PostgreSQL 9.3 规则系统改进, 允许在规则的values中使用多次NEW, OLD.

使用规则跟踪数据变更, 记录新老数据.

PostgreSQL审计- PostgreSQL 9.3 Allow OLD and NEW in multi-row VALUES within rules

如何跟踪基于字段值为条件的行的变更,插入和删除呢?

创建触发器时when的用法, 或在触发器函数中处理. 选择效率高的.

PostgreSQL触发器应用- (触发器WHEN)前置条件过滤跟踪目标记录》

PostgreSQL数据库在上市公司重要应用中的SOX审计

PostgreSQL数据库在上市公司重要应用中的SOX审计》

审计表的DDL行为, 以及哪个会话在什么时间点,通过什么IP干的.

PostgreSQL事件触发器- DDL审计, DDL逻辑复制, 打造DDL统一管理入》

审计变更的行, 以及被变更的字段内容; 新增的行, 删除的行; 以及哪个会话在什么时间点,通过什么IP干的.

PostgreSQL触发器应用- use trigger audit record which column modified, insert, delete.

pg_audit模块

PostgreSQL审计- pg_audit module

八、

PostgreSQL社区的更新速度很快,几乎每天都会有commit,有些可能是FIX patch,有些可能是feature,有些可能是性能提升patch

正常情况下,我们只要跟随小版本的升级就可以了,一般社区遇到比较大的安全漏洞,提交补丁后马上就会发布小版本,如果没有发布小版本,

说明没有大的安全漏洞,你可以通过http://git.postgresql.org实时跟踪社区的动态,自行打patch

大版本的更新,通常情况下大版本有大量的feature,如果需要使用的话,也可以更新到大的版本,但是请注意与应用有关的修改,模块的更新等。

除了数据库的补丁,还需要更新操作系统的补丁,例如之前就有过这样的问题:OPENSSL的版本问题,低版本可能有漏洞,需要更新到新版本。

九、外界境安全

1. 应用程序是否安全?

2. 中间件是否安全?

3. 数据库所在操作系统是否安全?

4. 数据库所在服务器是否安全?

5. 存储安全,存储是否在安全的地方,有没有硬盘被拔掉的风险?

6. 网络安全,如机架交换机,未插网线的端口是否禁用了,是否做了MAC地址过滤或绑定?

7. 机房安全?

透明加密

PostgreSQL透明加密(TDE,FDE) - 块级加密》

十、源控制

虽然我们前面已经控制的挺好了,但是数据库还有一种风险和网络的DDOS攻击类似,大量的用户请求可以把数据库搞慢。

或者大量的运算量或者IO极大的请求,也很容易把数据库搞慢。

资源控制手段举例:

控制连接数,控制活动连接数,控制SQL执行时间,控制锁等待时间,控制事务空闲时间。

另一方面,因为PostgreSQL的并发控制用到了多版本,所以当更新或删除数据时,老的版本依旧存在于数据库中,需要vacuum进程回收这些数据,

目前有一个缺陷,当有长事务存在时,事务开启后产生的垃圾被视为新的垃圾,不会被回收,所以长事务容易导致数据库膨胀,太长的事务甚至可以导致数据库的xid耗尽,必须关机做vacuum freeze

请参考,

PostgreSQL垃圾回收代码分析- why postgresql cann't reclaim tuple is HEAPTUPLE_RECENTLY_DEAD

十一、

监控是DBA的眼睛,好的监控可以提前发现问题,将问题排除在发生之前。

参考(zabbix, nagios)

常用监控项请参考,

PostgreSQL nagios monitor script (archive, vacuum, age, conn, rollback, standby, lock, xact, seq, index...)

巡检参考

PostgreSQL AWR报告》

https://raw.githubusercontent.com/digoal/pgsql_admin_script/master/generate_report.sh

十二、开发规约

PostgreSQL数据库开发规范》

安全合规通常关注哪些点

1、认证:

·       密码复杂度

·       修改密码不可与最近若干次重复

·       密码到期修改策略

·       密码重复错误超出次数锁定

·       密码错误后延迟认证

2、链路

·       链路加密

·       数据库防火墙

·       空闲会话超时

3、数据

·       数据存储加密

·       数据加密类型

·       tde

·       wal日志存储加密

4、审计

·       sql审计存储加密

·       sql审计,存储时长可配置,可下载

·       GUIopenapi审计

·       关闭审计的行为被审计

5、容灾、备份

·       跨机房、跨地域容灾

·       跨机房、跨地域备份

6、外部访问

·       外部访问链路加密(dblink, fdw

·       外部访问认证账号信息加密存储(mapping , dblink , view)

7、鉴权

·       数据库权限体系、

·       GUI权限体系、

·       openapi调用权限体系

8、加密算法强度

9、监控、告警

·       错误监控

·       性能监控

·       错误告警、不可用告警、性能告警

10、授权

  • 第三方排错授

 

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
28天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之数据库不能自己减少节点如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
缓存 关系型数据库 分布式数据库
PolarDB常见问题之数据库cpu突然飙高如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB登顶2024中国数据库流行榜:技术实力与开发者影响力
近日,阿里云旗下的自研云原生数据库PolarDB在2024年中国数据库流行度排行榜中夺冠,并刷新了榜单总分纪录,这一成就引起了技术圈的广泛关注。这一成就源于PolarDB在数据库技术上的突破与创新,以及对开发者和用户的实际需求的深入了解体会。那么本文就来分享一下关于数据库流行度排行榜的影响力以及对数据库选型的影响,讨论PolarDB登顶的关键因素,以及PolarDB“三层分离”新版本对开发者使用数据库的影响。
75 3
阿里云PolarDB登顶2024中国数据库流行榜:技术实力与开发者影响力
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
|
16天前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
3天前
|
关系型数据库 OLAP 分布式数据库
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
4月26日周五,PolarDB开源社区联合康恩贝将共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
|
13天前
|
运维 关系型数据库 分布式数据库
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
4月19日周五,PolarDB开源社区联合科大讯飞共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
|
1月前
|
存储 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB突然有大量服务连不上数据库如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。

热门文章

最新文章