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 证书。这需要在双方进行一些额外的配置,但这提供了比仅仅使用密码更强大的身份验证。它可以防止计算机假装是服务器,以便读取客户端发送的密码。它还有助于防止“中间人”攻击,在这种攻击中,客户端和服务器之间的计算机假装是服务器,并读取和传递客户端和服务器之间所有数据。
如果服务器机器的系统管理员不可信,则客户端需要加密数据;这样,未加密的数据就不会出现在数据库服务器上。数据在客户端加密后发送到服务器,数据库结果必须在客户端解密后才能使用。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。