Postgresql 中文操作指南

19.8. Encryption Options #

PostgreSQL 提供了多个级别的加密,并灵活保护数据免遭数据库服务器窃取、不道德的管理员和不安全网络导致的数据泄露。可能还需要加密来保护敏感数据,例如医疗记录或金融交易。

  • Password Encryption

    • 数据库用户密码存储为散列(由设置 password_encryption 确定),因此管理员不能确定分配给用户的实际密码。如果使用 SCRAM 或 MD5 加密对客户端身份进行验证,则未加密的密码甚至不会暂时出现在服务器上,因为客户端在通过网络发送之前已对其进行加密。首选 SCRAM,因为它是一项互联网标准,并且比 PostgreSQL 特有的 MD5 身份验证协议更安全。

  • Encryption For Specific Columns

    • pgcrypto 模块允许某些字段以加密方式存储。如果仅部分数据敏感,这将非常有用。客户端提供解密密钥,并在服务器上对数据进行解密,然后将其发送到客户端。

    • 解密数据和解密密钥在客户端和服务器之间解密和通信时会在服务器上存在很短时间。给系统管理员等完全访问数据库服务器的人造成了短暂的拦截数据和密钥的机会。

  • Data Partition Encryption

    • 存储加密可以在文件系统级别或块级别执行。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 Host Authentication

    • 客户端和服务器都可以彼此提供 SSL 证书。这需要在每一方做一些额外的配置,但提供了比仅仅使用密码更强的身份验证。它可以防止计算机假冒服务器以便在客户端发送密码时进行读取。它也有助于防止“中间人”攻击,在该攻击中,客户端和服务器之间的计算机假冒服务器并读取和传递客户端与服务器之间传递的所有数据。

  • Client-Side Encryption

    • 如果无法信赖服务器计算机的系统管理员,客户端就有必要加密数据;这样,未加密的数据将永远不会出现在数据库服务器上。数据在发送至服务器之前会在客户端进行加密,而数据库结果在使用之前则必须在客户端进行解密。