pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PostgreSQL提供了多个层次的加密,并在防止数据因数据库服务器被盗、不诚实的管理员或不安全网络等原因而泄露方面提供了很高的灵活性。为了保护医疗记录、金融交易等敏感数据,也可能需要使用加密。
默认情况下,数据库用户密码以 MD5 哈希形式存储,因此管理员无法得知分配给用户的实际密码。
pgcrypto模块允许以加密形式存储特定字段。这在只有部分数据敏感时很有用。客户端提供解密密钥,数据在服务器端解密后再发送给客户端。
当数据被解密并在服务器与客户端之间传输时,解密后的数据和解密密钥会在服务器端短暂存在。这就给那些可以完全访问数据库服务器的人(例如系统管理员)提供了一个短暂的机会来截获密钥和数据。
在 Linux 上,可以使用“loopback device”(环回设备)在文件系统之上叠加加密。这允许把整个文件系统分区在磁盘上加密,并由操作系统解密。在 FreeBSD 上,等价的设施称为 GEOM Based Disk Encryption(gbde),许多其他操作系统也支持这类功能,包括 Windows。
这种机制可以防止在整台计算机或磁盘被盗时,从驱动器中直接读取未加密数据。但它无法防御文件系统已挂载时的攻击,因为在挂载之后,操作系统会提供数据的解密视图。不过,要挂载该文件系统,就必须以某种方式把加密密钥提供给操作系统,而有时这个密钥就存放在挂载该磁盘的主机上的某处。
MD5 认证方法在把密码发送给服务器之前先在客户端对其进行双重加密:先基于用户名做一次 MD5 加密,再基于建立数据库连接时服务器发送的随机盐做一次加密。经过双重加密的值才是实际通过网络发送到服务器的内容。双重加密不仅能防止密码被窃取,还能防止他人日后用同一个加密后的密码连接到数据库服务器。
SSL 连接会加密通过网络发送的全部数据:密码、查询和返回的数据。pg_hba.conf 文件允许管理员指定哪些主机可以使用非加密连接(host),哪些主机必须使用 SSL 加密连接(hostssl)。此外,客户端可以指定仅通过 SSL 连接到服务器。也可以使用 Stunnel 或 SSH 加密传输。
客户端和服务器都可以向对方提供 SSL 证书。这需要双方做一些额外配置,但它提供的认证强度高于单纯依赖密码。它可以防止某台计算机短暂冒充服务器,只为读取客户端发送的密码;同时也有助于防御“man in the middle”攻击,即某台位于客户端与服务器之间的计算机冒充服务器,读取并转发双方之间的全部数据。
如果服务器所在机器的系统管理员不可信,那么就有必要由客户端自行加密数据。这样一来,未加密的数据就永远不会出现在数据库服务器上。数据在发送给服务器之前就在客户端加密,而查询结果也必须在客户端解密后才能使用。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。