保护您的PostgreSQL数据库

2021-04-03 04:08:06

数据库是黑客的圣杯,因此,必须遵守最大的小心。这是一系列文章中的第一个,其中我们将介绍保障您的数据库的最佳实践概述。我们开始符合最受欢迎的开源数据库,PostgreSQL,并将过度达到您需要思考的安全水平:

在理想的世界中,您的PostgreSQL服务器将完全孤立,并不允许任何入站连接,SSH或PSQL。遗憾的是,这种类型的空中安装程序不是PostgreSQL的东西支持的东西。

您可以做的下一个最佳方法可以改善数据库Server的安全性,以锁定对数据库正在运行的节点的端口级访问。默认情况下,PostgreSQL在TCP端口5432上侦听。根据操作系统,可能会有不同的方法来阻止其他端口。但是使用inlux最广泛使用的防火墙实用程序,以下将成为技巧:

#确保不要删除已建立的连接。-A输入-M状态--State已建立,相关--j接受#允许ssh.ptables -a输入-p tcp-m状态 - state new --dport 22 -j接受#允许postgreesql.partabes-a输入-p tcp-m状态--state new --dport 5432 -j接受#允许所有出站,删除其他inbound.past -a-a output -j acceptiptables -a输入-j dropiptables -a转发-J降

注意:更新iptables规则时,使用iptables-applytool是一个好主意,它会自动滚动更改,以防您锁定自己。

上面的PostgreSQL规则将允许任何人连接到端口5432.只需接受来自某些IP地址或SUBNETS的连接即可更严格:

#只允许访问本地子网的PostgreSQL端口。-a输入-p tcp-m状态 - state new --dport 5432-s 192.168.1.0/24 -J接受

回到我们理想的方案,能够完全防止端口5432的inboundConnection将需要某种本地代理,该代理将持久的出站连接与客户端节点(-s)进行持久的出站连接,并且可以举办到本地PostgreSQL实例的代理流量。

此技术称为“反向隧道”,可以使用SShremote端口转发功能进行演示。您可以通过从PostgreSQL数据库运行的节点运行文件来打开反向隧道:

当然,< client-host>应该从PostgreSQL节点访问,并运行SSH守护程序。该命令将在客户端计算机上的端口5432上将端口5432转发到端口5432,并且您将能够通过隧道将数据库连接到数据库:

一个很好的做法,可以使用listens_addresses配置文件指令限制服务器正在侦听前链接连接的地址。如果节点PostgreSQL运行有多个网络接口,请使用它捣碎,确保服务器仅在侦听该界面(-S)上,以其将连接到它:

如果连接到数据库的客户端始终驻留在同一节点上(或者说,请与作为侧面配置文件运行的PostgreSQL一起使用的Poctgr​​eSQL),则禁用TCP套接字侦听可以完全消除来自图片的网络。将收听地址设置为空字符串使服务器接受acceptonly unix-domain套接字连接:

随着世界上大部分网络迁移到HTTPS,还有很少的借口,使用强大的传输加密,对于数据库连接而不是,因此PostgresQL支持TLS(仍称为文档,配置和CLI的SSL)本地性和提供了使用它的方法,包括服务器和客户端身份验证。

对于服务器身份验证,您首先需要获取提供给连接客户端的ServerWill的证书。让我们加密使得它真的很容易忘记免费X.509证书,例如使用CESTBOTCLI工具:

请记住,默认情况下,默认情况下使用HTTP-01ACME挑战来验证证书请求,该挑战需要指向要打开的节点和端口80的所请求域的有效DNS的证书请求。

如果您无法使用允许员加密某种原因并希望生成所有秘密接种,则可以使用OpenSSL CLI工具来执行以下操作:

#制作自签名服务器ca.openssl req -sha256 -new-x509 -days 365-nodes \ -out server-ca.crt \ -keyout server-ca.key#生成服务器csr。将主机名置于CN Fields.Openssl req -sha256中的#todation to to to#the divels。 \ -out server.csr \ -keyout server.key#sign一个服务器证书。apenssl x509 -req -sha256 -days 365 \ -in server.csr \ -ca server-ca.crt \ -cakey server-ca.key \ -cacreateserial \ -out server.crt

当然,在生产环境中,您要确保在到期日之前更新复杂化物。

客户端证书身份验证允许服务器通过验证TheClient呈现的X.509证书来验证AConnecting客户端的标识。由可信证书颁发机构签名。

使用不同的证书机构来发出Client Andserver证书是一个很好的想法,因此让我们创建一个客户端CA并使用它来签署ClientCertificate:

#制作一个自签名的客户端ca.openssl req -sha256 -new-x509 -days 365-nodes \ -out client-ca.crt \ -keyout client-ca.key#生成客户端csr。 CN必须包含您#的数据库角色的名称,您将使用它来连接到Database.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

请注意,客户端证书的公共名称(CN)字段必须包含客户端连接到的数据库帐户的名称。 postgreSQL服务器威尔斯建立客户的身份。

将所有的作品放在一起,您现在可以配置PostgreSQL Server TOACcept TLS连接:

ssl = onssl_cert_file =' /path/to/server.crt' ssl_key_file =' /path/to/server.key' ssl_ca_file =' / path / to / client-ca .crt' #此设置默认情况下,但是当涉及到Security.ssl_prefer_server_ciphers =上,#tls 1.3将提供最强大的安全性,并在#控制服务器和客户端时建议#3.ssl_min_protocol_version =&#39 ; tlsv1.3'

最后一个配置的配置是要更新基于PostgreSQL ServerHost的身份验证文件(PG_HBA.conf),以要求所有连接的TLS使用X.509证书对客户端进行身份验证:

现在,连接到数据库服务器的客户端必须呈现由客户端证书颁发机构签名的validCertificate:

请注意,默认情况下,默认情况下,PSQL不会执行服务器证书验证,因此必须将“SSLMode”设置为验证 - 完全或验证-CA,具体取决于使用与编码X.509证书的相同主机名是否与PostgreSQL服务器连接到PostgreSQL服务器场地。

要减少命令的详细程度,不必输入要连接到数据库的TLS秘密时间的路径,可以使用PostgreSQLConnection服务文件。它允许您将连接参数分组为“服务”,然后通过“服务”参数在连接字符串中引用。

现在,在连接到数据库时,您只需要指定服务命名为要连接的数据库的名称:

到目前为止,我们已经探索了如何保护PostgreSQL数据库服务器从销售网络连接,使用强大的传输加密,并使服务器和客户端可以相互信任相互TLSAuthentication的彼此的身份。另一个拼图是弄清楚用户可以在连接到数据库和HATTHEIR身份验证的情况下访问的内容。这通常被称为授权。

PostgreSQL具有全面的用户权限系统,该系统围绕Colescolscolce构建。在现代PostgreSQL版本(8.1和较新)中“角色”与“用户”签名,因此使用PSQL(例如“User = Alice”)的任何数据库帐户名称,实际上是具有Login属性的角色,允许ITConnect数据库。实际上,以下SQL命令等同于:

除了登录的能力之外,角色可以具有其他属性,允许它们绕过所有权限检查(超级用户),创建数据库(创建的),创建其他角色(CreereeLe)等。

除了属性之外,角色可以被授予可以分离的权限两类:其他角色和数据库对象权限的成员身份.Llet看看这些工作如何行动。

创建表server_inventory(ID INT主键,描述文本,IP_Address文本,环境文本,所有者文本,);

默认情况下,PostgreSQL安装包括用于引导数据库的超级用户角色(通常称为“postgres”)。对所有数据库过程使用此角色相当于始终使用Linux上的“root”登录,这不是一个好主意。相反,让我们在最不特权原则之后根据需要创建一个不特权的角色和分配。

您可以单独为每个新用户/角色分配权限,而不是为每个新用户/角色分配权限,而是Cancreate将“组角色”并授予此组中的其他角色(映射到各个用户)。说,您希望允许您的开发人员,Alice和Bob,查看服务器库存,但不会修改它:

- 创建一个' t的组角色,它具有自己登录的能力 - 授予它在服务器清单表上选择权限。创建角色开发人员;在server_inventory上授予选择到开发人员; - 创建两个将继承的用户帐户"开发人员"权限次登录到数据库。创建角色Alice Login继承;创建角色Bob登录继承; - 将用户帐户分配给"开发人员"团体角色。授予爱丽丝的开发人员,鲍勃;

现在,当连接到数据库时,Alice和Bob都将继承“开发人员”组角色的权限,并能够在服务器库存上运行查询。

默认情况下,SELECT权限适用于所有表列,但它并没有。说,您只想允许您的实习生查看一般的ServerInventory信息而不让他们通过隐藏IP地址来连接:

创建角色实习生;授予server_inventory的select(id,description)到实习生;创建角色查理登录继承;授予查理实习生;

其他最常用的数据库对象权限是插入,更新,删除和截断对应于相应的SQL语句,但也可以分配用于连接到特定数据库,在模式中创建新的数据库,创建函数等的特定数据库的权限,执行函数等。在PostgreSQL文档的特权上拍摄Alook以查看整个列表。

postgreSQL权限系统的更高级功能之一是行 - 水彩安全,允许您授予表中的行的子集。这包括可以用SELECT语句查询的两行,因为可以插入的WELLAS行,更新和删除。

要开始使用行级安全性,您需要两件事:使其能够为表anddefine控制行级访问的策略。

在我们上一个示例的建筑物上,假设您希望允许用户只授予自己的服务器。首先,在表上启用RLS:

没有定义的任何策略,PostgreSQL默认为均扮演角色(表所有者除了创建的角色)的角色(表所有者)有任何访问权限。

行安全策略是PostgreSQL的布尔表达式将评估应该退回或更新的Foreach行。选择语句返回的行按使用子句指定的表达式检查,而通过插入,更新或deleteStatememed更新的行将针对带检查表达式检查。

让我们定义几个策略,允许用户查看所有服务器,而是仅由表的“所有者”字段所确定的:

在server_inventory上创建策略select_all_servers以供选择(true);在server_inventory上创建策略update_own_servers for使用check(current_user =所有者)使用(current_user =所有者)更新;

请注意,只有表的所有者只能为其创建或更新行安全策略。

到目前为止,我们大多符合先发制人的安全措施。在基石安全原则之后,防守深入,我们已经互相探讨了Howthey层,以帮助减慢假设的攻击者通过系统进行前进。

保持准确且详细的审计跟踪是经常被忽视的系统的安全属性之一。监视数据库服务器的网络级别或节点级别是此帖子的范围,但是让我们在PostgreSQL Server本身时获取我们有哪些选项。

您可以做的最基本的事情,以提高对MobileWithIn在数据库中的内容的可见性,以便启用详细日志记录。添加以下DirectIvesto服务器配置文件以打开所有连接尝试的日志记录,所有已执行的SQL语句:

;日志成功和不成功的连接尝试。 log_connections =上;日志终止会话。 log_disconnections =上;记录所有执行的SQL语句。 log_statement =全部

不幸的是,这几乎是您可以在箱子外安装的标准托管的PostgreSQL安装程度。这比无所事事更好,但它不会超越少数数据库服务器和简单的“Grepping”。

对于更高级的PostgreSQL审核解决方案,您可以使用诸如PGAudit的第3个PartyExtension。如果您正在使用自托管的Postgresqlinstance,则您将手动安装分机。一些托管版本,例如AWS RDS支持它的框中,因此您需要启用它。

PGaudit为记录的陈述带来了更多的结构和粒度。但是,请记住,它仍然是基于日志的,这使得使用IFYOU将以结构化格式将您的审计日志运送到外部SIEM System,这使得其挑战是有挑战性的。

传送数据库访问中的开源项目,我们建立了帮助,以帮助您实现在此帖子中呈现的PostgreSQL(和其他)数据库的最值实践。

用户可以通过单点登录流程和useShort Live X.509证书访问数据库,而不是RengalCredentials。

数据库不需要在公共互联网上暴露,并且可以使用Teleport的内置反向隧道系统安全地在空调环境中进行安全。

管理员和审核员可以看到数据库活动,例如与特定用户在审核日志中的特定用户身份相关联的Sessionsand SQL语句,并可选择将其运送到外部系统。

如果您有兴趣,您可以开始使用Teleport Database Access and,浏览演示,读取文档,下载开源版本,并在Github上探索代码。

与任何具有安全性的系统一样,正确保护的访问Toyour数据库实例需要对堆栈的多个级别采取保护措施。

在本文中,我们已经了解了在多个级别保护您的yourpostgresql数据库访问的最佳实践,从网络和触发安全性开始,并探索了如何使用PostgreSQL灵活的用户权限。