立即开始为您的 PostgreSQL 增压。
PostgreSQL 数据库是所有应用程序的核心,而其中保存的数据是所有组织的生命线。安全漏洞会导致信任破裂、个人信息泄露并造成不可挽回的损害,从而带来灾难性后果。在本文中,我们将了解为什么需要安全性、保护 PostgreSQL 的不同步骤,以及这些安全概念如何转移到 Timescale。
数据库存储着应用程序最宝贵的资产:数据。这些数据包括姓名、密码和街道地址等个人信息,但也可能包括公司机密。数据库不安全会造成灾难性后果,原因如下:
泄露个人数据会损害用户和客户的信任
股价下跌或收入损失
您可能会受到监管处罚(例如 GDPR)
在特定领域,漏洞可能被用来造成人身伤害
2017 年 9 月,美国信用报告机构 Equifax 宣布 1.47 亿人的个人信息被泄露,包括姓名、地址、社会保障号码和驾照号码。此次泄露事件导致 Equifax 信任度下降,每个数据被泄露的人都面临危险,达成和解,并花费 14 亿美元的清理成本。虽然 Equifax 事件并非直接由 PostgreSQL 造成,但它表明了良好安全实践的严重性和重要性。
安全研究人员和黑客之间展开着一场猫捉老鼠的游戏。黑客试图利用系统漏洞,而研究人员则寻找防止漏洞被利用的解决方案。尽管底层细节可能会随着这场猫捉老鼠的游戏而改变,但保护 PostgreSQL 的永恒最佳实践可以防止大多数攻击。
我们将介绍保护 PostgreSQL 数据库的五个核心组成部分。其中包括:
网络安全
访问控制
加密
故障转移和备份
审计和日志记录
每个组成部分的坚实基础都将增强 PostgreSQL 的安全态势。
网络安全是抵御未经授权访问数据库的第一道防线。阻止所有网络连接的服务器比可公开访问的服务器安全得多。但是,无法接受连接的数据库毫无用处。每个 PostgreSQL 都需要一个暴露的网络。保护网络的目标是限制和锁定访问 PostgreSQL 的方式和位置,使其仅限于必要范围。
pg_hba.conf
是 PostgreSQL 使用的配置文件,用于控制客户端身份验证和对任何数据库的访问(HBA 代表基于主机的身份验证)。可以将其视为配置防火墙。 pg_hba.conf
中的每条记录都定义了一种连接类型、客户端可以连接的 IP 地址范围、客户端可以连接的数据库、用户名等。这使我们能够非常精细地控制允许哪些 IP 地址进行连接以及如何进行连接。
与 pg_hba.conf
一起, postgresql.conf
提供了更多选项来锁定 PostgreSQL 网络
listen_addresses
控制 PostgreSQL 侦听哪些网络接口以获取连接。默认情况下,此设置设置为 localhost
,这会将访问限制为本地计算机。指定特定的 IP 地址可以将访问权限仅限于受信任的主机。这种选择性侦听进一步减少了潜在的攻击面。
max_connections
限制并发连接数,以帮助防止未经授权的访问尝试。确保数据库不会因过多的连接请求而过载,从而降低拒绝服务 (DoS) 攻击的风险。
当我们想到数据库安全时,您首先想到的可能是访问控制:创建用户帐户并通过权限限制访问。在 PostgreSQL 中,我们有 角色
和 权限
。角色
可以被视为与用户或组相同。我们的数据库可以有一个 程序员
角色,所有程序员都使用该角色来访问 PostgreSQL。或者,我们可以有一个 dylan
角色,我只能使用该角色来查询数据。然后,为角色分配 权限
,这些权限提供或限制对数据库的功能。
要创建新角色,我们可以使用 CREATE ROLE
表达式
CREATE ROLE analyst LOGIN;
这将创建一个可用于登录数据库的 analyst
(分析师)角色。该角色没有密码,但我们可以通过包含 PASSWORD [password]
(密码 [密码])来创建/要求密码。
CREATE ROLE analyst LOGIN PASSWORD 'unicorncat';
等等,难道没有 CREATE USER
(创建用户)吗?通过查阅 PostgreSQL 文档,你会发现用于方便地创建用户的 SQL 语句,称为 CREATE USER
。这将创建一个分配了 LOGIN
(登录)权限的角色,允许该角色登录到数据库。但是,它只是 CREATE ROLE
(创建角色)的便捷包装器,并不会*实际*创建用户。
RBAC(基于角色的访问控制)对于减少恶意行为者、心怀不满的员工,甚至是善意的员工因意外操作而造成的攻击面至关重要。网络安全中的一种常见做法是使用最小权限原则。换句话说,我们只授予角色完成其工作所需的最基本权限,不多也不少。这可以防止数据分析师意外删除行,或防止被黑的开发者帐户移动卷。
要向角色添加权限,请在任何数据库对象(表、列、视图等)上使用 GRANT
(授予)命令。例如,我们可以通过运行以下命令,仅授予 analyst
(分析师)角色对单个表的 SELECT
(选择)权限
GRANT SELECT ON [my_table] TO analyst;
或者,授予角色所有权限的快捷方式是使用 ALL PRIVILEGES
(所有权限)
GRANT ALL PRIVILEGES ON [view_name] TO analyst;
我们可以向角色分配多种权限,以微调访问权限并实施最小权限原则。
加密是对数据进行编码,以便只有授权人员才能解密和理解。可以将加密想象成将机密文档放在保险箱中。使用钥匙,您就可以访问这些文档。与朋友共享钥匙也可以让他们访问这些文档。但是,如果窃贼偷走了保险箱,没有您的钥匙,他们将无法阅读您的机密文档。您可能丢失了文档(和保险箱),但至少窃贼无法访问您的重要文档!数据加密是保护数据库安全的一项重要措施,也是一项额外的安全措施。
您通常会听到两种数据加密类别
**传输中加密**:对在两个系统之间移动的数据进行混淆处理(例如,从您的应用程序到 PostgreSQL)
**静态加密**:对存储在硬盘驱动器上的数据进行混淆处理(例如,PostgreSQL 数据库中的数据)
SSL(安全套接字层)现在主要由 TLS(传输层安全)协议取代,它通过加密客户端和 PostgreSQL 服务器之间传输的数据,成为抵御数据泄露的关键防御机制。这种加密对于阻止中间人攻击至关重要,在中间人攻击中,攻击者可能会拦截并潜在地更改或窃取传输中的数据。通过实施 SSL/TLS,PostgreSQL 确保所有数据交换都经过加密,从而使任何被拦截的通信对于窃听者来说都不可读且毫无用处。对所有连接强制执行 SSL 可以增强数据在网络中传输时的安全性,并增强数据库环境的完整性和可信度。
要设置 SSL,请通过终端 (SSH) 连接到您的 PostgreSQL 实例,或在服务器上打开终端实例。我们需要 OpenSSL,您可以通过运行 openssl -v
检查它是否已安装(如果未安装,请查看OpenSSL 网站)。
导航到 PostgreSQL 的 /data
目录,该目录包含 postgresql.conf
文件(在 Homebrew 中,该文件位于 /usr/local/var/postgresql@14
下,具体位置取决于您如何安装 PostgreSQL 以及使用的是哪个操作系统)。
我们需要创建三个证书:server.key
(服务器私钥)、server.crt
(服务器证书)和 root.crt
(受信任的根证书)。
通过运行以下命令创建 server.key
和 server.crt
证书(由于我们是自签名证书,因此可以使用一个命令完成此操作)
openssl req -nodes -new -x509 -keyout server.key -out server.crt
系统将提示您输入要写入证书的信息。接下来,我们将通过复制 server.crt
证书来创建 root.crt
证书
cp server.crt root.crt
为了提高安全性,并且由于 PostgreSQL 要求降低 server.key
的权限,请运行 chmod 以将 server.key
的权限分配为只读
chmod 400 server.key
最后,我们必须告诉 PostgreSQL 启用 SSL 以及在哪里可以找到证书。为此,请打开 postgresql.conf
(位于我们创建证书的同一目录中)。取消注释以下参数
ssl = on
ssl_ca_file = 'root.crt'
ssl_cert_file = 'server.crt'
ssl_crl_file = ''
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
ssl_prefer_server_ciphers = on
pg_hba.conf
,并更新 IPv4 本地连接
下的部分,将以下内容更改为启用 SSLhost all all 0.0.0.0/0 md5
至
hostssl all all 0.0.0.0/0 md5
现在重新启动 PostgreSQL 并连接到它。如果 SSL 设置正确,您将看到确认我们正在使用 SSL 连接的输出。恭喜!
我们通常希望对存储在 PostgreSQL 中的实际数据进行加密。例如,我们的数据库可能非常擅长控制访问权限并锁定对个人表的访问权限,例如存储用户名和密码的身份验证表。管理员永远不应该访问以纯文本形式存储的单个用户密码(如果有人在 DBA 的肩膀后偷看怎么办?)。为了解决这个问题,我们应该对存储在敏感列中的数据进行加密。
PostgreSQL 具有 pgcrypto
模块,该模块提供加密和哈希函数。这允许我们加密存储在列中的数据。例如,pgcrypto
公开了 crypt()
和 gen_salt()
函数。这两个函数一起允许我们通过运行 INSERT INTO accounts (password) VALUES (crypt('[用户秘密密码]', gen_salt('md5')));
在 PostgreSQL 中对用户密码进行加盐和加密。
要了解更多信息,请阅读我们 关于如何利用 pgcrypto
的文章!
故障转移是指在主数据库发生故障时可以处理流量的副本或备用 PostgreSQL 实例。在故障转移过程中,您的主数据库会遇到故障或崩溃。主数据库的精确副本(副本)将被分配到任何新的数据库连接,并在主数据库恢复正常之前取代它。
在 PostgreSQL 中实现故障转移副本虽然不是内置功能,但对于确保恶意攻击期间的高可用性、数据冗余和系统弹性至关重要。
尽管 PostgreSQL 没有内置的故障转移功能,但可以使用一些工具来创建它。在 PostgreSQL 中实现故障转移的主要工具是流复制和 WAL 归档。流复制实时地将更新从主数据库镜像到副本数据库,确保任何副本实例在任何时候都与主数据库保持一致。
WAL 归档是一种保障措施,用于在发生故障时恢复尚未流式传输到副本的任何事务。流复制和 WAL 归档提供了一种弹性方法来创建用于故障转移的副本。但是,我们仍然必须检测何时发生故障,并将流量从主数据库路由到副本。
像 repmgr、pg_auto_failover 和 Patroni 这样的工具通过监控数据库运行状况、检测故障以及切换到副本数据库来自动执行故障转移过程。当然,Timescale 通过高可用性副本提供自动故障转移支持。
将故障转移纳入您的 PostgreSQL 设置可以增强其应对操作故障的弹性,并且是对抗恶意入侵的额外防御措施,从而使您的数据基础架构更加强大和安全。
拥有数据库备份对于恢复模式非常重要,并且在棘手的安全事件中可能是一项重要资产。如果恶意行为者能够访问您的 PostgreSQL 服务器,他们可能会阻止所有人连接到服务器,并要求您支付赎金才能重新访问服务器,这称为勒索软件攻击。勒索软件攻击非常可怕。但是,如果我们在单独的服务器上有数据库备份,我们可以在新服务器上重建数据库,以减少客户的停机时间。
PostgreSQL 提供了逻辑和物理两种流程来备份您的数据库。
逻辑备份包含用于重新创建数据库的 SQL 语句。pg_dump
是一个 CLI 实用程序,可以生成重新创建数据库所需的所有 SQL 命令。从 PostgreSQL 服务器终端运行 pg_dump [数据库名称] > backup.sql
。在任何时候,我们都可以运行 psql [数据库名称] < backup.sql
从备份还原数据库。逻辑备份提供了对备份内容的精细控制,并且高度可靠,但是运行 SQL 语句来重新创建大型数据库可能会很慢。
物理备份涉及克隆服务器文件系统上 PostgreSQL 的数据文件。由于这些文件就是数据库,因此这些时间点备份可以快速恢复。PostgreSQL 附带 pg_basebackup
,这是一个 CLI 实用程序,用于执行物理数据和 WAL 的物理备份。
保护备份和制定审查备份的流程与进行备份本身同样重要。将备份存储在 PostgreSQL 服务器之外的异地位置,以防止在您无法访问 PostgreSQL 时丢失数据。对备份进行加密以防止未经授权的访问 - 备份仍然包含敏感数据!此外,还要花时间测试和恢复备份。这可以确保您的备份有效,并在灾难发生时使您熟悉恢复过程。
审计是一个难以实施的安全组件,因为它不是技术上的改变,而是一个人工流程。应建立定期检查,以审查日志中的异常情况,重新评估访问控制权限,并寻找改进安全措施的机会。您运行审计的频率完全取决于您自己。但是,定期运行审计符合您的最佳利益,以便跟上不断变化的安全形势。
审计过程的一部分应该是审查 PostgreSQL 的日志。很多时候,我们只关心崩溃日志和错误报告。但是,日志还提供了 PostgreSQL 操作和角色进行的数据库更改的时间线。彻底审查日志将揭示任何可疑行为。审查您的 postgresql.conf
文件的设置,以确保启用了日志记录、备份了日志,并且 PostgreSQL 记录了监视可疑行为所需的信息。
建议对 postgresql.conf
进行的一些更改
logging_collector = on
打开日志收集器,它会捕获 stderr 输出并将其写入单独守护进程中的文件 - 确保日志不会阻塞 PostgreSQL 的常规数据库操作
log_line_prefix = "%m [%p] user=%u db=%d: "
默认情况下,PostgreSQL 会在日志前缀中添加 %m [%p]
,即时间戳 (%m) 和进程 ID (%p),但我们可以 更改 PostgreSQL 提供的内容,以提高对谁在做什么的可见性。
log_connections = on
使 PostgreSQL 能够记录连接和连接尝试。默认为 off
。启用 log_connections
将使您能够洞察试图暴力破解 PostgreSQL 数据库的恶意行为者。
除了 PostgreSQL 本身之外,像 pgAudit 这样的工具还提供了用于审计数据库访问和使用的附加功能。
Timescale 内置了五个安全组件,无需您手动配置 PostgreSQL。例如,与 Timescale 数据库的所有连接都通过 SSL 加密,并且所有数据卷都已加密,因此您的数据库在静态和传输过程中都已加密。需要大量维护工作才能完成的任务(例如 创建备份)会自动处理,无需您干预。Timescale 每周进行一次备份,每天进行增量备份。Timescale 通过 多因素身份验证 以及全天候支持和监控来增强安全性。
安全性对于管理 PostgreSQL 至关重要,因为数据是公司最重要的资源。加强 PostgreSQL 安全性的五个组件可以帮助您通过审计、留住客户并防止罚款。幸运的是,Timescale 使安全性变得容易,甚至提供了额外的安全措施。
立即访问 https://console.cloud.timescale.com/signup 免费试用 Timescale。