Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 证书。每一方都需要一些额外的配置,但这提供了比仅使用密码更强的身份验证。它可以防止计算机假冒服务器,以便有足够长的时间读取客户端发送的密码。它还可以帮助防止中间人攻击,在这种攻击中,客户端和服务器之间的计算机假冒服务器,并读取和传递客户端和服务器之间所有的数据。

客户端侧加密

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