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)。
Stunnel 或 SSH 也能够被用于加密传输。
客户端和服务器都可以向对方提供 SSL 证书。这需要双方做一些额外配置,但它提供的认证强度高于单纯依赖密码。它可以防止某台计算机短暂冒充服务器,只为读取客户端发送的密码;同时也有助于防御“中间人”攻击,即某台位于客户端与服务器之间的计算机冒充服务器,读取并转发双方之间的全部数据。
如果服务器所在机器的系统管理员不可信,那么就有必要由客户端自行加密数据。这样一来,未加密的数据就永远不会出现在数据库服务器上。数据在发送给服务器之前就在客户端加密,而查询结果也必须在客户端解密后才能使用。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。