Postgres 安全最佳实践

免费试用

立即开始提升 PostgreSQL 的性能。

A vault with several engraved elephants on its door.

作者:Juan José Gouvêa

作为 PostgreSQL 用户,您需要深入了解许多主题才能充分利用 PostgreSQL 数据库,从 复制模式性能。但是,没有比 Postgres 安全更重要的了。确保数据库安全对于保护组织的数据资产至关重要。这意味着不仅要保护数据完整性和抵御恶意威胁 ,还要遵守与访问权限和隐私法规相关的法律义务

在本文中,我们将介绍一些关于保护 PostgreSQL 数据库、降低风险和确保数据免受未经授权的访问和潜在漏洞的安全最佳实践。

PostgreSQL 访问控制

为了确保只有授权的进程和远程连接才能访问 PostgreSQL 数据库——为所有 PostgreSQL 部署提供安全的基础——您需要通过 Unix 域套接字 (UDS) 和 TCP/IP 来保护访问。两者都需要仔细配置套接字参数和防火墙规则。

Unix 域套接字

Unix 域套接字 (UDS) 提供基于文件的访问控制系统,管理同一主机上进程之间的权限。它们促进进程之间的数据交换,为本地进程间通信建立安全有效的方法。

PostgreSQL UDS 配置: PostgreSQL 允许通过 unix_socket_directoriesunix_socket_groupunix_socket_permissions 等参数来配置 Unix 域套接字。这些参数允许精确控制套接字文件的放置位置、访问组和权限,从而增强数据库连接的安全性。

  • unix_socket_directories: 定义将放置用于客户端连接的 Unix 域套接字的目录。

  • unix_socket_group: 设置 Unix 域套接字的所有者组。

  • unix_socket_permissions: 指定 Unix 域套接字的访问权限。

TCP/IP

TCP/IP 协议对于管理远程数据库连接至关重要,它定义了如何在网络上传输数据。它包括指定端口访问以确保对 PostgreSQL 数据库的安全和受控访问。

防火墙配置: 默认情况下,PostgreSQL 在端口 5432 上监听传入连接。配置防火墙以限制对该端口的访问对于防止未经授权的访问至关重要。只允许已知且受信任的 IP 地址连接,可以显著降低外部攻击的风险。

防火墙规则示例:

sudo iptables -A INPUT -p tcp --dport 5432 -s trusted_ip_address -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5432 -j DROP

此设置允许从受信任的 IP 地址连接到端口 5432,同时丢弃来自未知来源的请求。

PostgreSQL 用户角色和组

创建用户

在 PostgreSQL 中创建用户是数据库访问管理的基础。用户与操作系统用户不同,它们在整个数据库集群中具有全局范围,而不是限制在单个数据库中。此操作的主要 SQL 命令是 CREATE USER,它允许指定用户名以及可选的用户的密码。该过程非常简单

CREATE USER username WITH PASSWORD 'password';

此命令创建一个具有登录功能的新数据库用户,为定义访问级别和特定于数据库操作的权限奠定基础。

创建角色

PostgreSQL 中的角色充当管理数据库权限的通用机制。它们可以代表单个用户、用户组或一组权限。本质上,角色允许在数据库系统中分配访问权限和责任。创建角色是使用 CREATE ROLE 命令完成的,它可以包含登录权限、数据库创建权限和角色管理功能等属性

CREATE ROLE role_name WITH LOGIN CREATEDB;

此示例演示了创建具有登录和创建数据库功能的角色。角色简化了权限管理,使其更容易通过集中的基于角色的访问控制系统来执行安全策略。

行级权限

PostgreSQL 的行级安全 (RLS) 功能增加了访问控制的细粒度,允许管理员定义策略以限制对表中特定行的访问。这在多租户环境中特别有用,在多租户环境中,用户应该只能看到自己的数据。要启用 RLS,您使用 ALTER TABLE 命令

ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;

之后,可以使用 CREATE POLICY 命令定义策略以指定特定角色或用户可以查看或修改行的条件。这允许精确控制谁可以访问或修改表中的单个行,从而增强 PostgreSQL 数据库中存储数据的安全性与隐私。

实施全面的用户角色和组以及行级权限对于保护 PostgreSQL 数据库至关重要。这些机制共同提供了一个强大的访问控制管理框架,确保用户拥有适合其在组织中角色的适当权限。

PostgreSQL 加密

SSL 加密

SSL (安全套接字层) 加密是保护传输中数据的基本安全功能,它提供端到端安全性以防止中间人攻击。虽然 PostgreSQL 本身不实现 SSL,但它支持 SSL 连接以加密客户端和服务器之间的数据。这确保敏感信息在传输过程中保持安全。有关为 PostgreSQL 配置 SSL 的完整教程对于这篇博文来说过于庞大,但概述包括生成 SSL 证书、为 PostgreSQL 服务器配置 SSL 以及为客户端强制执行 SSL 连接。

使用 pgcrypto 对数据库进行加密

pgcrypto 扩展 在 PostgreSQL 中直接添加了强大的加密功能,允许对单个字段、整个表或数据事务进行加密。这对于需要静止加密的敏感数据(例如医疗记录或个人识别信息)特别有用。

使用pgcrypto的基本示例: 要加密数据而不显式指定密钥,可以使用 pgp_sym_encrypt 函数。以下是一个简单的示例,它加密文本字符串

SELECT pgp_sym_encrypt('Sensitive data here', 'encryption_key_here') AS encrypted_data;

可以使用相应的 pgp_sym_decrypt 函数来解密数据

SELECT pgp_sym_decrypt(encrypted_data, 'encryption_key_here') AS original_data
FROM (SELECT pgp_sym_encrypt('Sensitive data here', 'encryption_key_here') AS encrypted_data) AS subquery;

这些示例突出了 PostgreSQL 在管理数据安全方面的灵活性,它提供了用于使用 SSL 保护传输中数据以及使用 pgcrypto 保护静止数据的工具。实施这些安全措施可以显著增强 PostgreSQL 数据库的整体安全态势,确保敏感信息免遭未经授权的访问或泄露。

使用 Timescale 实现 PostgreSQL 安全

PostgreSQL 安全支持

Timescale 通过与 PostgreSQL 无缝集成来增强 PostgreSQL,继承了其强大的安全框架,同时引入了自己的高级功能。这种集成确保用户可以从 PostgreSQL 著名的基础安全措施中受益,包括身份验证、授权和数据加密功能。

在 Timescale 中使用 pgcrypto

pgcrypto 扩展是 PostgreSQL 安全性的关键组成部分,它提供了直接在数据库中执行的加密、解密和哈希等加密功能。Timescale 完全支持 pgcrypto,使用户能够有效地保护时间序列数据。在 Timescale 中实施 pgcrypto 涉及几个简单步骤,可以大大增强数据安全性。

如何在 Timescale 中使用 pgcrypto

在确保 Timescale 和 PostgreSQL 正确安装后,您可以通过执行以下命令来激活 pgcrypto

CREATE EXTENSION IF NOT EXISTS pgcrypto;

这允许您在 Timescale 数据库环境中使用各种加密操作。例如,要加密超表的传感器读数,您可以使用以下方法

-- Create a table for sensor readings
CREATE TABLE sensor_readings (
  time TIMESTAMPTZ NOT NULL,
  device_id BIGINT,
  reading BYTEA
);

-- Convert the table into a hypertable
SELECT create_hypertable('sensor_readings', 'time');

-- Insert an encrypted reading
INSERT INTO sensor_readings (time, device_id, reading)
VALUES (NOW(), 1, pgp_sym_encrypt('20.5', 'supersecretkey'));

要解密数据以供使用,您可以使用

SELECT time, device_id, pgp_sym_decrypt(reading, 'supersecretkey') AS reading
FROM sensor_readings
WHERE device_id = 1;

这些示例展示了 pgcrypto 函数在加密和解密数据方面的直接应用,确保敏感信息即使存储在备份或转储中也能保持安全。

Timescale 安全特性

Timescale 除了 PostgreSQL 提供的基本安全功能外,还提供了一些高级功能,以确保数据的全面保护。

  • 数据加密:Timescale 中的数据始终使用行业标准算法进行加密,包括传输中和静止状态。这包括活动数据库和备份,加密密钥由 AWS 密钥管理服务 (KMS) 安全管理。

  • 网络安全:对 Timescale 服务的访问严格限制在通过 TLS 加密的连接,没有未加密明文连接的选项。这适用于所有客户与 Timescale 服务的交互。

  • 维护访问协议:Timescale 采用严格的维护访问协议,所有操作员操作都会进行审计日志记录。这确保了所有必要的故障排除都以安全透明的方式进行。

  • 隐私合规性:Timescale 致力于客户数据隐私,遵守 GDPR 等法规。这一承诺体现在 Timescale 的隐私政策和服务条款中,确保以最谨慎和尊重的态度处理客户数据。

  • SOC 2 Type 2 合规性:Timescale 符合 SOC 2 Type 2,我们的 SOC 2 报告可供企业级所有客户使用。

  • VPC 对等连接:使用 虚拟专用云 (VPC) 对等连接,您可以(尽可能地)复制自托管部署的隔离性,并访问您的云数据,而无需担心您的服务暴露在公共互联网中。

查看我们的文档Timescale 安全页面 以了解更多信息。

结论

在本文中,我们探讨了保护 PostgreSQL 数据库的基本最佳实践。我们深入研究了访问控制、用户角色和组以及加密技术,为有效保护您的数据奠定了基础。通过了解如何配置 Unix 域套接字、TCP/IP 协议、实现行级安全以及使用 pgcrypto 进行加密,您可以降低风险并增强 PostgreSQL 数据库的整体安全态势。

Timescale 进一步扩展了 PostgreSQL 强大的安全框架,提供了包括 pgcrypto 用于加密函数的无缝集成在内的先进功能,以及涵盖传输中和静止状态数据的全面数据保护策略。这些增强功能对于安全管理时间序列数据至关重要,确保您的敏感信息免受未经授权的访问或泄露。

如果您希望使用顶级的安全性来最大化您的时间序列数据,请 立即试用 Timescale