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

[译文] PostgreSQL 数据库安全:身份验证

原创 Ibrar Ahmed 2021-09-01
1079

最近,我写了一篇关于您需要了解的有关PostgreSQL 安全性的概述。对于这篇文章,我想写一篇关于 PostgreSQL 身份验证的文章。它分为三类:1. PostgreSQL 内部身份验证,2. 基于操作系统的身份验证,和 3. 基于外部服务器的身份验证。在大多数情况下,PostgreSQL 被配置为与内部身份验证一起使用,因此我们将在这里详细讨论每种内部身份验证方法。下一篇文章将介绍操作系统身份验证方法,例如 PAM、Peer 和 Ident。

image.png

以下是 PostgreSQL 内部认证支持的方法列表。

  • 相信
  • 拒绝
  • MD5
  • 随机存取存储器
  • 证书

PostgreSQL 有一个配置文件来配置名为 pg_hba.conf 的身份验证。所有与身份验证相关的设置都是此配置文件的一部分。这是示例 pg_hba.conf 文件:

host database user address auth-method [auth-options] ------+--------------- +-----------------+----------------+--------------+--------------- Local | all | all | | trust host | all | all | 127.0.0.1/32 | trust host | postgres | postgres | 192.168.1.1/24 | md5 host | replication | postgres | 127.0.0.1/32 | md5

“ pg_hbaa.conf ”文件的第一列是“主机”. 它可以是本地或主机。local为Unix-Domain socket是固定的,如果是主机,则需要在地址栏中指定主机IP地址。第二列是数据库,用于指定数据库名称。您可以设置基于数据库的身份验证方法,这意味着您的数据库可以有自己的身份验证方法。如果将这些值设置为 all,则所有数据库都将使用相同的身份验证方法。文件的第三列是用户,这意味着您可以为不同的用户设置单独的身份验证方法,“全部”表示适用于所有用户。第四个参数是指定IP地址,表示哪个IP地址可以使用该认证方式。下一列是身份验证方法,它可以是图 1 中所示的任何身份验证方法。

信任与拒绝

当您指定身份验证方法Trust 时,任何满足要求的用户都不需要任何密码。同样,在拒绝的情况下,任何满足要求的用户都将不被允许登录系统。以下是信任和拒绝的示例:

host        database          user    address        auth-method    [auth-options] ------+-----------------+-----------------+----------------+-------------------------+-------------------- host  |    all          |     all   | 127.0.0.1/32    |   trust host  |    all          |     all   | 127.0.0.1/32    |   Reject

pg_hba.conf 文件有两个条目;第一个具有身份验证方法信任,第二个具有身份验证方法拒绝。本地主机用户不再需要密码,将被授予无需密码即可登录系统的权限。但是除了 localhost 之外的任何计算机都会被拒绝,因为 pg_hba.conf 文件的第二行。

信任认证

postgres@127.0.01:~$ psql postgres -h 127.0.0.1 -U postgres psql (12.4) Type "help" for help. postgres=>

拒绝认证

postgres@10.0.2.2:~$ psql postgres -h 10.0.2.1 -U postgres psql: error: could not connect to server: FATAL: pg_hba.conf rejects connection for host "10.0.2.2", user "postgres", database "postgres"

MD5

在md5认证的情况下,需要提供密码。让我们看一个简单的例子。

host database user address auth-method [auth-options] ------+-----------------+-----------------+-----------+-------------------------+-------------------- host | all | all | 10.0.2.2/32 | md5
vagrant@vagrant:~$ psql postgres -h 10.0.2.1 -U postgres Password for user postgres:  psql (12.4) Type "help" for help. postgres=>

随机存取存储器

SCRAM,或者更具体地说是 scram-sha-256,是一种质询-响应方案,可防止对不受信任的连接进行密码嗅探。它是最安全的身份验证方法之一,使用安全的、加密散列的安全性将密码存储在服务器上。

第一步:修改用户密码

postgres=# SET password_encryption = 'scram-sha-256'; SET postgres=# ALTER USER postgres WITH PASSWORD 'test'; ALTER ROLE

第 2 步:更改 pg_hba.conf 文件。

host database user address auth-method [auth-options] ------+-----------------+-----------------+-----------+-------------------------+-------------------- host | all | all | 10.0.2.2/32 | <span class="s1">scram-sha-256</span>

第 3 步:测试连接

$ psql postgres -U postgres Password for user postgres: psql (13.0) Type "help" for help.

Percona Distribution for PostgreSQL 可以免费下载和使用

认证中心

服务器密钥和证书
第 1 步:生成服务器密钥

$ openssl genrsa -des3 -out server.key 1024 Generating RSA private key, 1024 bit long modulus (2 primes) .+++++ ..................+++++ e is 65537 (0x010001) Enter pass phrase for server.key: Verifying - Enter pass phrase for server.key: $ openssl rsa -in server.key -out server.key Enter pass phrase for server.key: writing RSA key $ chmod og-rwx server.key

第 2 步:生成服务器证书

$ openssl req -new -key server.key -days 3650 -out server.crt -x509 ----- Country Name (2 letter code) [AU]:PK State or Province Name (full name) [Some-State]:ISB Locality Name (eg, city) []:Islamabad Organization Name (eg, company) [Internet Widgits Pty Ltd]:Percona Organizational Unit Name (eg, section) []:Dev Common Name (e.g. server FQDN or YOUR name) []:localhost Email Address []:ibrar.ahmad@gmail.com $ cp server.crt root.crt

客户端密钥和证书

第 3 步:生成客户端证书

$ openssl genrsa -des3 -out /tmp/postgresql.key 1024 Generating RSA private key, 1024 bit long modulus (2 primes) ..........................+++++ .....................................................+++++ e is 65537 (0x010001) Enter pass phrase for /tmp/postgresql.key: Verifying - Enter pass phrase for /tmp/postgresql.key: $ openssl rsa -in /tmp/postgresql.key -out /tmp/postgresql.key Enter pass phrase for /tmp/postgresql.key: writing RSA key $ openssl req -new -key /tmp/postgresql.key -out /tmp/postgresql.csr ----- Country Name (2 letter code) [AU]:PK State or Province Name (full name) [Some-State]:ISB Locality Name (eg, city) []:Islamabad Organization Name (eg, company) [Internet Widgits Pty Ltd]:Percona Organizational Unit Name (eg, section) []:Dev Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1 Email Address []:ibrar.ahmad@gmail.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:pakistan An optional company name []:Percona

步骤 4:将 root.crt 复制到客户端。

$ cp $PGDATA/root.crt /tmp/

PostgreSQL 设置

第 5 步:在 postgrsql.conf 文件中设置 ssl = on

# - SSL - ssl = on #ssl_ca_file = '' #ssl_cert_file = 'server.crt'

第 6 步:重启 PostgreSQL

pg_ctl restart

联系

现在,一切都设置在这里,您可以使用 psql 命令测试连接。

Shell $ psql 'host=localhost port=5432 dbname=postgres user=vagrant sslmode=verify-full sslcert=/tmp/postgresql.crt sslkey=/tmp/postgresql.key sslrootcert=/tmp/root.crt' psql (13.0) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=# 1 2 3 4 5 $ psql 'host=localhost port=5432 dbname=postgres user=vagrant sslmode=verify-full sslcert=/tmp/postgresql.crt sslkey=/tmp/postgresql.key sslrootcert=/tmp/root.crt' psql (13.0) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=#

结论

这是安全系列博客的第二部分,在第一篇博文中,我们看到了我们需要考虑的安全的主要特性。在这篇博客中,我们从身份验证开始,只关注 PostgreSQL 身份验证机制,仍然需要了解外部身份验证方法在 PostgreSQL 中是如何工作的。敬请关注!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论