17.7. 加密选项

PostgreSQL提供了几个不同级别的加密, 并且在保护数据库服务器不受数据窃贼、不道德管理员、不安全网络等因素泄漏的方面 提供很高的灵活性。加密可能也是保护一些诸如医疗记录和财务交易等敏感数据的要求。

口令存储加密

缺省的时候,数据库用户的口令以MD5散列的方式存储, 所以管理员无法判断赋予用户的实际口令。如果MD5加密用于客户端认证, 那么未加密的口令甚至都不可能临时出现在服务器上,因为客户端在透过 网络发送之前,就先用MD5加密了。

为指定的字段加密

contrib函数库pgcrypto 允许对某些字段进行加密存储。这个功能在某些数据是敏感的情况下有用。 客户端提供解密的密钥,然后数据在服务器端解密,然后发送给客户端。

在数据解密和数据在服务器与客户端之间传递时, 解密数据和解密密钥将会在服务器端存在短暂的一段时间。 这就给那些可以完全访问数据库服务器的人提供了一个短暂 的截获密钥和数据的时间,这样的人一般是数据库管理员。

DataPartitionEncryption数据库分区加密

在Linux上,加密可以在使用"回环设备"(loopbackdevice) 挂载的文件系统上面进行。这样就可以把磁盘上整个文件分区都加密, 然后由操作系统解密。在FreeBSD上, 等效机制为GEOM基本磁盘加密(GEOMBaseDiskEncryption)gbde, 和许多其他操作系统支持此功能,包括Windows。

这个机制避免了在整个计算机或者磁盘驱动器被窃的情况下, 未加密的数据被从驱动器中读取。它无法防止在文件系统被挂 载的时候的攻击,因为在挂载之后,操作系统提供数据的解密视图。 不过,要想挂载文件系统,你需要有一些方法把解密密钥传递给操作 系统,有时候这个密钥就存储在挂载该磁盘的主机的某个地方。

跨网络加密口令

MD5认证方法在客户端将口令发给服务 器之前将它双重加密。第一次MD5加密是基于用户名的, 然后在连接数据库的时候,用服务器发送的随机盐粒再次加密。 这个双重加密的数值就是从网络传递给服务器的数值。双重加密 不仅可以避免口令泄漏,还可以避免稍后其它的连接使用同样的 加密口令连接数据库(回放攻击)。

透过网络加密数据

SSL连接加密所有透过网络发送的数据:口令、查询、返回的数据。 pg_hba.conf文件允许管理员声明哪些主机可以使用 不加密的连接(host),以及哪些主机需要 使用SSL加密的连接(hostssl)。我们可以 使用StunnelSSH加密数据传输。

SSL主机认证

客户端和主机都可以提供SSL键字和证书给对方。 这么做需要在两边都进行一些额外的配置工作, 但是这种方式提供了比简单使用用户名和口令更强的身份认证的手段。 它避免一个计算机装作是服务器,然后读取客户端口令, 只要时间长得足够读取客户端发送的口令就行了。它还避免了 "中间人"攻击(在客户端和服务器之间有台计算机, 读取然后将所有数据在客户端和服务器之间传递)。

客户端加密

如果系统管理员是不可信的,那么客户端加密数据也是必要的; 这种情况下,未加密的数据从来不会在数据库服务器上出现。 数据在发送给服务器之前加密,而数据库结果必须在客户端使用之前解密。