# 19.8.加密选项
PostgreSQL提供了多个级别的加密,并在保护数据免受数据库服务器盗窃、不择手段的管理员和不安全网络泄露方面提供了灵活性。还可能需要加密来保护敏感数据,如医疗记录或金融交易。
密码加密
数据库用户密码存储为哈希(由设置决定)暗语_加密),因此管理员无法确定分配给用户的实际密码。如果使用SCRAM或MD5加密进行客户端身份验证,未加密的密码甚至不会临时出现在服务器上,因为客户端会在通过网络发送之前对其进行加密。首选SCRAM,因为它是一种互联网标准,比PostgreSQL特定的MD5身份验证协议更安全。
特定列的加密
这个pgcrypto模块允许对某些字段进行加密存储。如果只有部分数据是敏感的,这是有用的。客户端提供解密密钥,数据在服务器上解密,然后发送到客户端。
解密后的数据和解密密钥在客户端和服务器之间进行解密和通信时,会在服务器上短暂存在一段时间。这是一个短暂的时刻,数据和密钥可以被完全访问数据库服务器的人截获,比如系统管理员。
数据分区加密
存储加密可以在文件系统级别或块级别执行。Linux文件系统加密选项包括eCryptfs和EncFS,而FreeBSD使用PEFS。块级或全磁盘加密选项包括Linux上的dm crypt+LUKS和FreeBSD上的GEOM模块geli和gbde。包括Windows在内的许多其他操作系统都支持此功能。
如果驱动器或整个计算机被盗,此机制可防止从驱动器读取未加密的数据。这并不能在文件系统装载时防止攻击,因为装载时,操作系统会提供数据的未加密视图。但是,要装载文件系统,需要某种方式将加密密钥传递到操作系统,有时密钥存储在装载磁盘的主机上的某个位置。
通过网络加密数据
SSL连接对通过网络发送的所有数据进行加密:密码、查询和返回的数据。这个pg_hba。形态
文件允许管理员指定哪些主机可以使用非加密连接(主办
)并且需要SSL加密的连接(hostssl
)。此外,客户端可以指定它们仅通过SSL连接到服务器。
GSSAPI加密连接对通过网络发送的所有数据进行加密,包括查询和返回的数据。(不通过网络发送密码。)这个pg_hba。形态
文件允许管理员指定哪些主机可以使用非加密连接(主办
)并且需要GSSAPI加密连接(格森酒店
)。此外,客户端可以指定它们仅在GSSAPI加密连接上连接到服务器(gssencmode=require
).
Stunnel或SSH也可用于加密传输。
SSL主机身份验证
客户端和服务器都可以相互提供SSL证书。每一方都需要一些额外的配置,但这比仅仅使用密码提供了更强的身份验证。它可以防止计算机伪装成服务器,只需要足够长的时间就可以读取客户端发送的密码。它也有助于防止“中间人”攻击,客户端和服务器之间的计算机假装是服务器,并读取和传递客户端和服务器之间的所有数据。
客户端加密
如果无法信任服务器机器的系统管理员,则客户端需要加密数据;这样,未加密的数据就不会出现在数据库服务器上。数据在发送到服务器之前在客户机上加密,数据库结果在使用之前必须在客户机上解密。