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 证书。这需要在每一方进行一些额外的配置,但这提供了比仅仅使用密码更强的身份验证。它可以防止计算机假装是服务器,仅仅足够长的时间来读取客户端发送的密码。它还有助于防止 “中间人” 攻击,其中客户端和服务器之间的计算机假装是服务器并读取和传递客户端和服务器之间所有数据。
如果无法信任服务器机器的系统管理员,则客户端必须加密数据;这样,未加密的数据永远不会出现在数据库服务器上。数据在发送到服务器之前在客户端进行加密,并且数据库结果必须在客户端解密后才能使用。