PostgreSQL 数据库加密存储

36

如何对PostgreSQL数据库进行安全加密?

我无法找到一个好的文档来解释如何实现这一点。

6个回答

31
威胁模型在这种情况下非常重要,因为高效地加密数据库并不是一件容易的事情,这可以通过3个不同的层面进行实现(客户端应用程序,存储设备,数据库本身),请注意,在所有情况下,如果客户端应用程序被攻击,则加密就变得无用了。自我数据库加密解决方案只涵盖以下最少的威胁模型。
  • 恶意用户窃取存储设备并直接读取数据库文件。
  • 恶意备份操作员进行备份。
  • 保护静态数据(持久数据)

数据库加密解决方案1:

系统磁盘加密(cryptsetup/luks)... 在这种情况下,Postgres设置不需要进行任何修改。这也使clog和文本日志在静态状态下加密。如果您正在使用Google Cloud VM 此指南可能会有帮助。

数据库加密解决方案2:

PostgreSQL TDE(透明数据加密)是 PostgreSQL 的一个特性,实现了对整个数据库的静态数据加密。这里有一个示例

数据库加密解决方案3:

Pgcrypto可以用于加密部分数据库而非所有内容。以下是一个示例


2
第二个解决方案需要谨慎:TDE 的目标是针对 PG-14。https://wiki.postgresql.org/wiki/Transparent_Data_Encryption#Scope_for_the_first_release_of_TDE - ogirginc
@ogirginc 很好知道:),我知道这是一个新功能,但不知道它是如此“alpha”... - intika
1
TDE由Cybertec提供 - https://www.cybertec-postgresql.com/en/products/postgresql-transparent-data-encryption/ - sharadov
Percona负责监督开源TDE扩展"pg_tde"的开发,详情请参见:https://github.com/Percona-Lab/postgres-tde-ext - undefined

26

我还没有找到有关Postgres的EncryptionAtRest文档。来这里了解更多关于EncrAtRest的信息的人可以查看AWS RDS或MongoDB Enterprise,它们提供了此功能。

我的回复是对那些遵循“批准”答案的人的警告!说“只需使用文件系统加密”是忽略了加密数据库静止的目的。当你加密文件系统时,这会保护你免受某人复制驱动备份或窃取物理驱动器的伤害。除此之外什么都不起作用。

攻击者通过网络获得了访问您挂载的文件系统的权限,因此它已经被解密以使其可访问于操作系统、应用程序等。


8
假设攻击者已经可以访问您的数据库正在运行的文件系统,那么他们很可能已经可以访问您的数据库系统本身。您认为有哪种攻击方式不会出现这种情况呢? - Richard Huxton
1
EncryptionAtRest 的目的是保护数据库免受攻击者的克隆。在休息时,意味着数据库中的每个字段都被加密,这可以防御数据库管理员攻击。 - Falieson
我同意你的想法,但我认为你并没有真正提供答案。此外,问题很明确,我应该如何加密PostgreSQL数据库以保证其安全性,而不是是否应该加密整个文件系统。 - E.Serra

10

如果您想加密整个数据库,只需使用文件系统加密即可。您可能还希望加密事务日志和数据库日志,因此只需加密这些日志所在的文件系统即可。

如果您只想加密几列数据,则pgcrypto模块是标准的解决方案。


1
如果我使用pgcrypto,那就意味着我需要更改读写应用程序。那不是在传输时加密吗,因为我正在即时加密和解密数据。 - K.Pil
您可以随时进行加密和解密,不论您如何操作(除非您仅加密备份)。您的选择是在哪里进行加密和解密,可能是在服务器硬件和客户端应用程序之间的任何位置。 - Richard Huxton

1
CREATE EXTENSION pgcrypto;

CREATE TABLE userinfo (username varchar(20), password bytea);

以加密格式插入数据:

INSERT INTO userinfo VALUES(' suman ',encrypt('111222','password','aes'));

select * from userinfo ;

0

文件系统加密可以提供对大多数攻击的保护,但无法解决“斯诺登问题”,即当数据库管理员使用数据库权限窃取数据时。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接