数据库是黑客眼中的“圣杯”,需要我们像对待“花朵”一样精心呵护它。本文主要介绍数据库保护的最佳实践。首先,从最常用的开源数据库PostgreSQL开始,我们将一一介绍诸位需要考虑的几个安全层级:
PostgreSQL中网络层的安全
防火墙
理想情况下,PostgreSQL服务器应当是完全隔离,不允许任何入站申请、SSH或psql的。然而,PostgreSQL没有对这类网闸设置提供开箱即用的支持。
我们最多也只能通过设置防火墙,锁定数据库所在节点的端口级访问来提升数据库服务器的安全性。默认情况下,PostgreSQL监听TCP端口5432。而根据操作系统的不同,锁定其他端口的方式也会有所不同。以Linux最常用的防火墙为例,下面这几行代码就可轻松完成任务:
# 确保已有连接不被drop
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH.
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# 允许PostgreSQL.
iptables -A INPUT -p tcp -m state --state NEW --dport 5432 -j ACCEPT
# 允许所有出站,drop所有入站
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
在更新iptables的规则时,建议使用工具。这样,哪怕你不小心把自己也锁在外面了,它也能自动回滚更改。
这条PostgreSQL规则会允许所有人连接到端口5432上。当然,你也可以将其修改为只接受特定IP地址或子网让限制更加严格:
# 仅允许本地子网访问PostgreSQL端口
iptables -A INPUT -p tcp -m state --state NEW --dport 5432 -s 192.168.1.0/24 -j ACCEPT
继续讨论我们的理想情况。想要完全限制到5432端口的所有入站连接需要一个某种类型的本地代理,由它维持一个到客户端节点的持久出站连接,并且能将流量代理到本地PostgreSQL实例。
这种代理被称作是“反向通道”。具体使用方法可以通过SSH远程端口转发的功能进行演示。运行下列指令可以在PostgreSQL数据库运行的节点上打开一个反向通道:
ssh -f -N -T -R 5432:localhost:5432 user@<client-host>
PostgreSQL的节点需要能访问<client-host>,其上的SSH守护进程(daemon)也要处于运行状态。下列指令会将数据库服务器上端口5432转发到客户端机器的端口5432上,这样你就可以通过这个通道连接数据库了:
psql "host=localhost port=5432 user=postgres dbname=postgres"
PostgreSQL监听地址
通过配置文件指令来限制服务器监听客户端连接的地址是个好习惯。如果运行PostgreSQL的节点上有多个网络接口,可以确保服务器只会监听客户端所连接的一个或多个接口:
listen_addresses = 'localhost, 192.168.0.1'
如果连接到数据库的客户端总是驻留在同一节点上,或是与数据库共同驻留在同一个Kubernetes pod上,PostgreSQL作为 sidecar 容器运行,禁用套接字监听(socket)可以完全消除网络的影响。将监听地址设置为空字符串可以使服务器只接受Unix域的套接字连接:
listen_addresses = ''
PostgreSQL中传输层级的安全
当世界上大部分的网络都转投向HTTP的怀抱时,为数据库连接选择强传输加密也变成了一个必备项目。PostgreSQL本身即支持TLS(因为历史遗留问题,在文档、配置文件,以及CLI中仍被称作是SSL),我们也可以使用它进行服务器端和客户端认证。
服务器端TLS
对于服务器的认证,我们首先需要为服务器准备一份用于和相连接的客户端认证的证书。在Let's Encrypt上,我们可以找到免费提供的X.509证书,具体使用方法以的命令行工具为例:
certbot certonly --standalone -d postgres.example.com
需要注意的是,certbot默认使用ACME规范的HTTP-01挑战来验证证书请求,这里我们就需要确保请求域指向节点的DNS有效,并且端口80处于开放状态。
除了Let's Encrypt之外,如果想在本地生成所有的信息,我们还可以选择openssl命令行工具:
# 生成一个自签名的服务器CA
openssl req -sha256 -new -x509 -days 365 -nodes \
-out server-ca.crt \
-keyout server-ca.key
# 生成服务器CSR,CN里填需要连接到数据库的主机名
openssl req -sha256 -new -nodes \
-subj "/CN=postgres.example.com" \
-out server.csr \
-keyout server.key
# 签证书
openssl x509 -req -sha256 -days 365 \
-in server.csr \
-CA server-ca.crt \
-CAkey server-ca.key \
-CAcreateserial \
-out server.crt
在生产环境中记得在证书过期前更新。
客户端TLS
通过验证客户端提供的X.509证书是由可信的证书颁发机构(CA)签名,服务器便可以验证连接客户端的身份。
建议使用不同的CA来分别给客户端和服务器端发证书。下列代码创建了一个客户端CA,并用它来给客户签证书:
# 生成一个自签名的客户端CA
openssl req -sha256 -new -x509 -days 365 -nodes \
-out client-ca.crt \
-keyout client-ca.key
# 生成客户端CSR。CN必须填用于连接的数据库角色名
openssl req -sha256 -new -nodes \
-subj "/CN=alice" \
-out client.csr \
-keyout server.key
# 签证书
openssl x509 -req -sha256 -days 365 \
-in client.csr \
-CA client-ca.crt \
-CAkey client-ca.key \
-CAcreateserial \
-out client.crt
这里需要注意,客户端证书里的CommonName(CN)字段必须要包含用于连接的数据库账号。PostgreSQL服务器将用CN来创建客户端的身份。
TLS配置
小结一下,我们现在可以配置PostgreSQL服务器来接收TLS连接了:
ssl = on
ssl_cert_file = '/path/to/server.crt'
ssl_key_file = '/path/to/server.key'
ssl_ca_file = '/path/to/client-ca.crt'
# 这里默认是on,但出于安全考虑,特意写出来总是没错的
ssl_prefer_server_ciphers = on
# TLS 1.3能提供最强的安全保护。在控制服务器和客户端时建议使用ssl_min_protocol_version = 'TLSv1.3'
我们还需要再配置的就只剩下用于更新PostgreSQL服务器的基于主机的认证文件()了。它可以要求所有的连接使用TLS,并通过X.509证书对客户端进行认证。
# TYPE DATABASE USER ADDRESS METHOD
hostssl all all ::/0 cert
hostssl all all 0.0.0.0/0 cert
现在,连接到数据库服务器的客户端就需要提供由客户端CA签名的有效证书了:
psql "host=postgres.example.com \
user=alice \
dbname=postgres \
sslmode=verify-full \
sslrootcert=/path/to/server-ca.crt \
sslcert=/path/to/client.crt \
sslkey=/path/to/client.key"
需要注意的是,默认情况下,psql不会进行服务器证书认证,所以我们需要将“sslmode”设置为“”或者“”。具体设置要看你是否使用了编码后的X.509中CN字段的主机名对服务器进行连接。
为了简化指令,并且避免在每次连接到数据库时都要重新输入一遍到TLS的路径,可以通过使用PostgreSQL的连接服务文件来解决。它可以将连接参数分组到“services”中,通过连接字符串中的“service”参数进行引用。
用下列代码创建“”文件:
[example]
host=postgres.example.com
user=alice
sslmode=verify-full
sslrootcert=/path/to/server-ca.crt
sslcert=/path/to/client.crt
sslkey=/path/to/client.key
现在,当连接到数据库时,我们只需要指定服务名和想要连接的数据库名即可:
psql "service=example dbname=postgres"
PostgreSQL中数据库层级安全
角色
目前为止,我们已经探讨的内容有以下几点:如何从未认证的网络连接中保护PostgreSQL数据库,如何使用强加密进行数据传输,以及如何通过共同的TLS认证让服务器与客户互相信任对方身份。接下来,我们将继续分析用户在这里能做什么,连接到数据库后他们可以访问什么,以及如何验证他们的身份。这一步通常被称作是“授权”。
PostgreSQL有一套完整的、依据角色(role)建立的用户权限系统。在现代的PostgreSQL(8.1及以上版本)中,“角色”是“用户”的同义词。无论你用什么样的数据库账户名,比如psql中的"user=alice",它其实都是一个可以连接数据库的、拥有LOGIN属性的角色。也就是说,下面两条指令其实效果一样:
CREATE USER alice;
CREATE ROLE alice LOGIN;
除了登入的权限外,角色还可以拥有其他属性:可以通过所有的权限检查的,可以创建数据库的,可以创建其他角色的,等等。
除了属性外,角色被授予的权限可以分为两大类:一是其他角色的成员身份(membership),二是数据库对象的权限。下面我们将介绍这两类都是如何工作的。
授予角色权限
假设,我们需要跟踪服务器清单:
CREATE TABLE server_inventory (
id int PRIMARY KEY,
description text,
ip_address text,
environment text,
owner text,
);
默认情况下,PostgreSQL安装会包含一个用于引导数据库的超级用户角色,通常被称作是“postgres”。使用这一角色进行所有的数据库操作相当于在Linux系统中经常使用“root”登入,永远不是个好主意。所以,我们要创建一个无权限角色,根据需要为其授予最小权限。
通过创建一个“组角色”并授权其他角色(角色与用户一一对应)为组内成员,可以避免为每一个用户或角色单独分配权限的麻烦。假如说,我们想要授予开发者Alice和Bob查看服务器清单,但不允许其修改的权限:
-- 创建一个自身没有登入能力的组角色,授予其在服务器清单表中进行SELECT的权限
GRANT SELECT ON server_inventory TO developer;
-- 创建两个用户账号,在登入权限的基础上继承“developer”权限
CREATE ROLE alice LOGIN INHERIT;
CREATE ROLE bob LOGIN INHERIT;
-- 分配给两个用户账号“developer”组角色
GRANT developer TO alice, bob;
现在,当连接到数据库时,Alice和Bob都会继承“developer”组角色中的权限,并且可以查询数据库清单表。
权限默认对表的所有列有效,但这一点也是可以更改的。假设我们只想让实习生查看服务器的大致信息但又不想让他们连接到服务器,那么就可以选择隐藏IP地址:
CREATE ROLE intern;
GRANT SELECT(id, description) ON server_inventory TO intern;
CREATE ROLE charlie LOGIN INHERIT;
GRANT intern TO charlie;
其他常用数据库对象权限还有“”、“”、“”,以及“”,分别对应它们各自的SQL语句。我们还可以为连接到特定数据库、新建模式或模式中新建对象、执行函数等等分配权限。PostgreSQL文档中的章节提供了完整列表。
行级安全策略
PostgreSQL权限系统的更高级的玩法是行级安全策略(RLS),它允许你为表中的部分行分配权限。这既包括可以用查询的行,也包括可以、以及的行。
想要使用行级安全,我们需要准备两件事情:在表中启用RLS,为其定义一个用于控制行级访问的策略。
继续之前的例子,假设我们只想允许用户更新他们自己的服务器。那么,第一步,启用表中的RLS:
ALTER TABLE server_inventory ENABLE ROW LEVEL SECURITY;
如果没有定义任何策略的话,PostgreSQL会默认到“拒绝”策略上,这就意味着除了表的创建者/所有者之外,没有任何角色能够访问。
行安全策略是一个布尔表达式,是PostgreSQL用于判定所有需要返回或更新的行的条件。SELECT语句返回的行将对照USING子语句所指定的表达式进行检查,而通过INSERT,UPDATE或DELETE语句更新的行将对照WITH CHECK表达式进行检查。
首先,让我们定义几个策略,允许用户查看所有服务器,但只能更新他们自己服务器,这个“自己”是由表中的“owner”字段决定的。
CREATE POLICY select_all_servers
ON server_inventory FOR SELECT
USING (true);
CREATE POLICY update_own_servers
ON server_inventory FOR UPDATE
USING (current_user = owner)
WITH CHECK (current_user = owner);
注,只有表的所有者可以创建或更新RLS。
审计
到目前为止,我们主要都在讨论先手防御的安全措施。根据其中一项基本的安全原则——深度防御,我们分析了这些措施是如何通过互相叠加,帮助减缓(假想中的)攻击者进攻系统的进程。
留存准确且详细的审计追踪记录是系统安全属性中常常被忽视的一点。监控数据库服务器端的网络层或节点层访问并不在本文的讨论范围内,但当涉及到PostgreSQL服务器本身时,不妨先来看看我们有什么可选项。
想要更清晰地观测数据库内情况时,最常用的方法是启用详细日志记录。在服务器配置文件中添加以下指令,开启对所有连接尝试以及已执行SQL的日志记录。
; 记录成功与非成功连接尝试
log_connections = on
; 记录终止对话
log_disconnections = on
; 记录所有执行过的SQL语句
log_statement = all
不幸的是,对于标准的自托管PostgreSQL,这几乎是在不安装其他插件的情况下你能做到的全部了。虽然总比没有强,但在少数数据库服务器和简单的“grep”之外,它的延展性并不好。
如果想要更高级的PostgreSQL审计解决方案,诸如这样的第三方插件是个不错的选择。自托管的PostgreSQL需要手动安装,但对于一些托管版本的PostgreSQL,比如AWS RDS这些,本身就有,我们只需启用即可。
对于记录的语句,pgAudit提供了更多的结构和粒度。但要记住,它并没有脱离日志的范围,也就是说,如果需要将审计日志以结构化的格式传输到外部SIEM系统以作更详细的分析时,恐怕会很难。
PostgreSQL中基于证书的访问
(Teleport for Database Access)是一款开源项目,在它的帮助下,我们可以实现本文中介绍的所有用于保护PostgreSQL和其他数据库的最佳实践。
结语
与任何以安全为前提设计的系统一样,正确地保护对数据库实例的访问需要在网络协议栈的多个层次上采取保护措施。在这篇文章中,我们从网络和传输安全开始,探讨了如何使用PostgreSQL灵活的用户权限系统。
相关推荐
22、PostgreSQL安全配置与认证最佳实践
本文深入探讨了PostgreSQL数据库的安全配置与认证最佳实践,涵盖了认证方式、监听地址设置、角色权限管理、数据加密策略以及安全维护建议。通过详细的配置示例和流程图,帮助用户全面了解如何构建安全的PostgreSQL环境,适用于不同规模和需求的应用场景。
Postgresql数据库安全测试与实践
课程中将介绍关于Postgresql的安全测试与实践技术。
BUCK降压电路设计实战:从理论到PCB的完整指南
本文详细介绍了BUCK降压电路的设计实战,从基础原理到PCB布局的完整指南。通过关键部件选型、PCB布局黄金法则和调试技巧,帮助工程师高效设计稳定可靠的开关电源。特别针对电感、MOSFET和电容选型提供实用公式和避坑指南,并分享高温环境下的工程经验与测试方法。
提高postgresql安全性(一、关于权限)
以下讨论以postgresql 10版本为例 关于权限: 如果没有授权,默认情况下:所有表、schema都无法读取,但数据库任何用户都可以连接,函数任何用户可以执行。默认权限可用 ALTER DEFAULT PRIVILEGES进行修改,但修改默认权限只是对新建的对象起作用,对已建立的对象不起作用。 默认情况下,数据库任何人都可以连接,若要提高安全性,需用 REVOKE ALL ON DATABASE .. FROM PUBLIC, 再对特定的用户一个个授权。除此外,也可以通过pg_hba.conf..
告别底噪和发热:TPA3255的PCB布局与散热设计保姆级教程(附嘉立创EDA文件)
本文详细解析TPA3255 Class D音频功放的PCB布局与散热设计,提供从电源系统分层架构到热管理系统的全流程优化方案。通过实战案例展示如何消除底噪、降低发热,并附嘉立创EDA文件,助力工程师快速设计高性能音频功放。
迈德威视相机调用( 基于 Linux系统+ OpenCV )
迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言 此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。 一、登录迈德威视官网,下载官方SDK 迈德威视官网 : http://www.mindvision.com.cn/ 1. 进入官网后,在服务支持中选择软件下载。 2. 选择Linux系统S.
postgresql 渗透测试_WEB安全渗透测试基础知识(二十三)
免责声明:本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安全+的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!SQLMap基本使用8.3. SQLMap使用安装 git clone https://github.com/sqlmapproject/sqlmap.git sqlmap8.3.1. 常用参数...
Windows环境Oracle19C安装与配置全攻略
本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。
PostgreSQL渗透测试总结
一、前言 PostgreSQL是一个开源数据库,主要部署于Linux操作系统中。然而,PostgreSQL的兼容性非常好,可以兼容多个操作系统,也能在Windows及MacOS操作系统上运行。如果PostgreSQL数据库没有被正确配置,并且攻击者已经事先获取了凭证信息,那么他们就可以实施各类攻击行为,比如读写系统文件以及执行任意代码等。 来演示的目标系统是Metasploitable 2,因...
天龙八部TLBB系列 - 网单用数据库修改为其他门派
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派
Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written
Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written
PostgreSQL最佳实践
其中需要在/usr/local/datakit/conf.d/postgresql.conf部分配置。注意:address定义了连接到 PostgreSQL 服务器的 URI,这里的。接入datakit后可以通过datakit monitor命令查看数据是否正常上报。使用CM挂载的方式开启PostgreSQL采集器,配置datakit.yaml。注意:日志采集仅支持已安装 DataKit 主机上的日志。开启日志采集后,默认会产生日志来源()为 postgresql 的日志。进入Datakit安装目录下的。
11、体内皮质功能的电压敏感染料成像技术
本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。
《确保安全:PostgreSQL安全配置与最佳实践》
PostgreSQL入门 PostgreSQL性能优化 PostgreSQL与MySQL比较 PostgreSQL备份恢复 PostgreSQL索引策略 PostgreSQL扩展插件 PostgreSQL数据分区 PostgreSQL与NoSQL PostgreSQLJSON处理 PostgreSQL安全实践 PostgreSQL高可用 PostgreSQL事务管理 PostgreSQL物化视图 PostgreSQL存储引擎 PostgreSQL远程连接 PostgreSQL复制策略 PostgreSQL空
vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板
想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
如何在Rust中安全执行PostgreSQL查询?5个最佳实践让你远离SQL注入
掌握Rust中安全操作PostgreSQL的核心方法,避免SQL注入风险。通过参数化查询、使用sqlx等异步驱动、连接池管理与类型安全校验,结合实际Rust PostgreSQL示例,提升应用安全性与性能。最佳实践汇总,值得收藏。
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
pg_durable终极指南:PostgreSQL中安全调用外部API的5个最佳实践 [特殊字符]
PostgreSQL持久化执行扩展pg_durable让数据库开发者能够直接在SQL中安全调用外部HTTP API,彻底改变了传统应用架构。pg_durable通过其强大的`df.http()`函数和内置的安全机制,为PostgreSQL用户提供了企业级的HTTP集成解决方案。本文将深入探讨如何利用pg_durable安全高效地调用外部API,避免常见的SSRF攻击风险,并分享5个关键的**安全最
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
如何用PHP构建安全可靠的PostgreSQL应用?8个生产级最佳实践
掌握PHP与PostgreSQL高效协作的关键方法,本文提供8个生产级最佳实践,涵盖连接管理、SQL注入防护与性能优化,并附实用PHP PostgreSQL示例,助你构建安全可靠的应用,值得收藏。
JumpServer数据库连接器:安全访问MySQL/PostgreSQL最佳实践
在企业数字化转型的浪潮中,数据库作为核心数据资产的安全访问成为重中之重。传统的直接连接方式存在诸多安全隐患:密码泄露、权限滥用、操作无审计等问题频发。JumpServer作为开源堡垒机(Privileged Access Management, PAM)解决方案,提供了专业级的数据库连接器功能,帮助企业实现安全、可控的数据库访问管理。 通过本文,您将掌握: - ✅ JumpServer数据库连接...
PgAssistant安全最佳实践:保护你的PostgreSQL数据库配置
PgAssistant是一款开源工具,专为帮助开发者理解和优化PostgreSQL数据库性能而设计。在使用这款强大工具的同时,保护数据库配置安全至关重要。本文将分享一系列实用的安全最佳实践,帮助你在使用PgAssistant时确保数据库配置的安全性。 ## 为什么数据库配置安全至关重要 数据库配置包含了连接数据库的关键信息,如用户名、密码、主机地址等。一旦这些信息泄露,可能导致未授权访问、数据
Temboard安全最佳实践:保护PostgreSQL远程控制平台的关键策略
Temboard作为一款强大的PostgreSQL远程控制平台,为数据库管理员提供了便捷的监控和管理功能。然而,随着数据库在业务中的核心地位日益凸显,保障Temboard平台的安全性成为至关重要的任务。本文将分享保护Temboard平台的关键安全策略,帮助管理员构建一个安全可靠的PostgreSQL远程管理环境。 ## 一、强化网络通信安全 Temboard平台采用HTTPS协议进行通信,确保
PostgreSQL JDBC Driver高级特性:SSL加密与安全连接最佳实践
PostgreSQL JDBC Driver(pgjdbc)是连接Java应用程序与PostgreSQL数据库的核心组件,其SSL加密功能为数据传输提供了关键安全保障。本文将详细介绍如何通过SSL加密保护数据库连接,包括配置方法、安全最佳实践及常见问题解决方案,帮助开发者构建安全可靠的数据库连接环境。 [


被折叠的 条评论
为什么被折叠?



