支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: 开发版
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

18.8. 加密选项 #

PostgreSQL 在多个级别提供加密,并灵活地保护数据免受因数据库服务器被盗、不道德的管理员和不安全的网络而导致的数据泄露。加密也可能需要保护敏感数据,例如医疗记录或金融交易。

密码加密

数据库用户密码存储为哈希值(由设置 password_encryption 决定),因此管理员无法确定分配给用户的实际密码。如果使用 SCRAM 或 MD5 加密进行客户端身份验证,则未加密的密码甚至不会临时出现在服务器上,因为客户端会在通过网络发送之前对其进行加密。SCRAM 是首选,因为它是一个互联网标准,并且比 PostgreSQL 特定的 MD5 身份验证协议更安全。

特定列的加密

pgcrypto 模块允许对某些字段进行加密存储。如果只有部分数据是敏感的,则此功能非常有用。客户端提供解密密钥,并且数据在服务器上解密,然后发送到客户端。

解密的数据和解密密钥在服务器上短暂存在,因为它正在解密并在客户端和服务器之间通信。这会出现一个短暂的时刻,即数据和密钥可能被具有完全访问数据库服务器权限的人(例如系统管理员)截获。

数据分区加密

存储加密可以在文件系统级别或块级别执行。Linux 文件系统加密选项包括 eCryptfs 和 EncFS,而 FreeBSD 使用 PEFS。块级别或全盘加密选项包括 Linux 上的 dm-crypt + LUKS 和 FreeBSD 上的 GEOM 模块 geli 和 gbde。许多其他操作系统都支持此功能,包括 Windows。

如果驱动器或整个计算机被盗,此机制可防止从驱动器读取未加密的数据。这不能防止文件系统已挂载时的攻击,因为挂载时,操作系统会提供数据的未加密视图。但是,要挂载文件系统,您需要某种方式将加密密钥传递给操作系统,有时密钥会存储在挂载磁盘的主机上的某个位置。

通过网络加密数据

SSL 连接对通过网络发送的所有数据进行加密:密码、查询和返回的数据。pg_hba.conf 文件允许管理员指定哪些主机可以使用未加密的连接(host),哪些主机需要 SSL 加密连接(hostssl)。此外,客户端可以指定它们仅通过 SSL 连接到服务器。

GSSAPI 加密连接会对通过网络发送的所有数据进行加密,包括查询和返回的数据。(密码不会通过网络发送。)pg_hba.conf 文件允许管理员指定哪些主机可以使用未加密的连接(host),哪些主机需要 GSSAPI 加密连接(hostgssenc)。此外,客户端可以指定它们仅在 GSSAPI 加密连接上连接到服务器(gssencmode=require)。

StunnelSSH 也可用于加密传输。

SSL 主机身份验证

客户端和服务器都可以相互提供 SSL 证书。这需要在每一侧进行一些额外的配置,但这提供了比仅仅使用密码更强的身份验证。它可以防止计算机冒充服务器,仅在足够长的时间内读取客户端发送的密码。它还有助于防止中间人攻击,即客户端和服务器之间的计算机冒充服务器,并读取和传递客户端和服务器之间的所有数据。

客户端加密

如果服务器计算机的系统管理员不可信任,则客户端必须对数据进行加密;这样,未加密的数据永远不会出现在数据库服务器上。数据在发送到服务器之前在客户端上加密,并且数据库结果必须在客户端上解密才能使用。

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。