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

以下是 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 中是如何工作的。敬请关注!




