暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

确保PostgreSQL成为企业级环境

飞象数据 2019-12-06
584

在这篇文章中,我们将介绍如何使用社区软件构建一个增强的、安全的PostgreSQL数据库环境。我们研究了PostgreSQL中可用的、在实施后可提供更高安全性的特性。

认证层

客户端使用基于主机的身份验证与PostgreSQL 服务端连接

PostgreSQL使用一个基于主机的身份验证文件(pg_hba.conf)来对进入的连接进行授权。该文件包含5个类别的组合条目:type,database,user,address和method。仅当客户端的用户名,数据库和主机名与pg_hba.conf文件中的条目相匹配时,才允许客户端连接到数据库。

参考pg_hba.conf文件中的以下条目:

# TYPE DATABASE USER ADDRESS METHODhost percona pguser 192.168.0.14/32 md5

此条目表示仅允许来自服务器192.168.0.14的以pguser用户连接到数据库percona。md5认证方式强制进行密码验证。

pg_hba.conf文件中条目的顺序很重要,如果你有一个条目拒绝来自给定服务器的连接,然后有另一个条目允许来自该服务器的连接,则考虑该顺序中的第一个条目。因此,在本例中,连接会被拒绝。

这是身份验证的第一层保护。如果该访问控制列表(ACL)中不满足此条件,则PostgreSQL将放弃该请求,甚至不考虑服务器身份验证。

服务身份验证

过去,PostgreSQL默认使用MD5摘要作为密码哈希。纯MD5哈希的问题在于,对于给定的密码,此函数将始终返回相同的哈希,这使MD5摘要作为密码更容易被破解。更新版本的PostgreSQL实现了SCRAM身份验证(简单身份验证和安全层),将密码以固定和迭代的哈希格式存储,以增强PostgreSQL抵抗离线攻击的能力。在PostgreSQL 10中引入了对SCRAM-SHA-256的支持。就“企业级”安全性而言,最重要的是PostgreSQL支持简便即用的行业标准身份验证方法。例如SSL证书,PAM/LDAP,Kerberos等。

授权层

通过角色和特权进行用户管理

始终建议通过角色和特权实现用户隔离。在你的PostgreSQL服务器中可能有多个用户账户。其中只有少数几个是应用程序账户,其余的是开发人员或管理员账户。在这种情况下,PostgreSQL允许你创建多个用户。可以为它们分配一组特权。因此,可以维护标准角色,并将列表中的适当角色分配给用户,而不是单独管理用户特权。通过角色,可以对数据库访问进行标准化,这有助于用户管理,并避免向给定用户授予过多或过少的特权。

例如,我们可能有六个角色:

app_read_writeapp_read_onlydev_read_writedev_read_onlyadmin_read_writeadmin_read_only

现在,如果你需要创建一个只有读权限的新dev用户,请在适当的角色中授予一个访问权限,比如dev_read_only

GRANT dev_read_only to avi_im_developer;

行级安全性

从9.5版本开始,PostgreSQL实现了行级安全性,它可以限制对表中记录/行的子集的访问。通常,授予用户混合使用给定表上的SELECT,INSERT,DELETE和UPDATE权限,这允许访问表中的所有记录。但是,通过行级安全性,可以通过策略将此类特权限制为记录的一个子集,然后将其分配给一个角色。

在下一个示例中,我们将创建一个employee表和两个管理人员账户。然后,我们在表上启用行级安全性,并创建一个策略,允许管理人员仅查看/修改他们自己下属的记录:

CREATE TABLE scott.employee (id INT, first_name VARCHAR(20), last_name VARCHAR(20), manager VARCHAR(20));INSERT INTO scott.employee VALUES (1,'avinash','vallarapu','carina');INSERT INTO scott.employee VALUES (2,'jobin','augustine','stuart');INSERT INTO scott.employee VALUES (3,'fernando','laudares','carina');CREATE USER carina WITH ENCRYPTED PASSWORD 'carina';CREATE USER stuart WITH ENCRYPTED PASSWORD 'stuart';CREATE ROLE managers;GRANT managers TO carina, stuart;GRANT SELECT, INSERT, UPDATE, DELETE ON scott.employee TO managers;GRANT USAGE ON SCHEMA scott TO managers;ALTER TABLE scott.employee ENABLE ROW LEVEL SECURITY;CREATE POLICY employee_managers ON scott.employee TO managers USING (manager = current_user);

在日志中我们可以看到,对于每一个管理人员,只有某些记录是可见的:

$ psql -d percona -U carinapsql (10.5)Type "help" for help.percona=> select * from scott.employee ;id | first_name | last_name | manager----+------------+-----------+--------- 1 | avinash    | vallarapu | carina 3 | fernando   | laudares | carina(2 rows)$ psql -d percona -U stuartpsql (10.5)Type "help" for help.percona=> select * from scott.employee ;id | first_name | last_name | manager----+------------+-----------+--------- 2 | jobin      | augustine | stuart(1 row)

你可以在手册页中了解更多有关行级安全性的信息。

数据安全

1. 使用SSL对网络上的数据进行加密数据

PostgreSQL允许你使用SSL启用动态数据加密。此外,你可以启用基于证书的身份验证,以确保在受信方之间进行通信。SSL是由OpenSSL实现的,因此它需要将OpenSSL软件包安装在PostgreSQL服务器中,并且PostgreSQL需要构建-with-openssl支持。

pg_hba.conf文件中的以下条目表示,只要通过SSL对通信进行加密,就允许服务器192.168.0.13上的任何用户连接到任何数据库。此外,只有在提供有效的客户端证书时才建立连接:

# TYPE DATABASE USER ADDRESS METHODhostssl all all 192.168.0.13/32 md5

你也可以选择通过以下方法使用客户端证书身份验证:

# TYPE DATABASE USER ADDRESS METHODhostssl all all 192.168.0.13/32 cert clientcert=1

2. 静态加密——pgcrypto

pgcrypto模块为PostgreSQL提供了加密功能,允许对某些字段进行加密存储。pgcrypto实现了PGP加密,这是OpenPGP(RFC 4880)标准的一部分。它同时支持对称密钥和公钥加密。除了PGP提供的用于加密的高级功能之外,pgcrypto还提供了基于密码运行简单加密的功能。这些功能仅对数据进行加密。

会计和审计

登录PostgreSQL

PostgreSQL允许你根据参数设置记录所有语句或一些语句。当启用logging_collector时,你可以将所有DDL或DML或运行超过一定持续时间的任何语句记录在日志文件中。为了避免对数据目录的写过载,你也可以将log_directory移动到其他位置。在PostgreSQL服务器中记录活动时,应检查以下几个重要参数:

log_connectionslog_disconnectionslog_lock_waitslog_statementlog_min_duration_statement

请注意,详细的日志记录会占用额外的磁盘空间,并且根据PostgreSQL服务器的活动,可能会产生大量的写IO开销。在启用日志记录时,应格外小心,并且只有在了解日志记录可能会导致工作负载的开销和性能下降之后才这样做。

审计-pgaudit和set_user

PostgreSQL中的一些基本审计功能是作为扩展 实现的,可以在具有法规要求的高度安全的环境中随意启用。

pgaudit 帮助审计数据库中发生的活动。如果有任何未经授权的用户故意混淆了DDL或DML,则该用户已通过的语句以及在数据库中实际执行的子语句将记录在PostgreSQL日志文件中。

set_user
提供了一种权限升级的方法。如果正确实现,它可以提供最高级别的审计,甚至可以监视SUPERUSER的操作。

可以在此处阅读有关pgaudit的更多信息。

安全错误修复

PostgreSQL全球开发小组(PGDG)认真考虑了安全漏洞。任何安全漏洞都可以直接报告至security@postgresql.org。所有支持的PostgreSQL版本已修复的安全问题列表都可以在这里找到。PostgreSQL的安全补丁可通过较小的版本升级获得。这也是为什么建议始终维护PostgreSQL服务器升级到最新次要版本的主要原因。

本文翻译自:https://www.percona.com/blog/2018/09/21/securing-postgresql-as-an-enterprise-grade-environment/

文章转载自飞象数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论