云网牛站
所在位置:首页 > Linux云数据库 > 在PostgreSQL中启用SSL加密和SCRAM-SHA-256密码验证的步骤

在PostgreSQL中启用SSL加密和SCRAM-SHA-256密码验证的步骤

2021-03-08 09:20:20作者:张天启稿源:云网牛站

本文将研究如何通过在数据库上启用SSL,然后将证书添加到客户端以进行安全连接,来启用与PostgreSQL数据库的SSL/TLS连接。此外,我们将在PostgreSQL数据库中启用SCRAM-SHA-256密码验证。下面我们将按照以下步骤继续进行SSL和SCRAM-SHA-256密码认证。注意:在本示例中,我们将使用CentOS Linux操作系统,在不同的发行版中,显示的目录路径可能有所不同。

 

步骤1:安装PostgreSQL数据库的参考

如果您没有PostgreSQL数据库,则参考在CentOS 8服务器上安装及配置PostgreSQL数据库的方法在CentOS 8/RHEL 8系统上安装PostgreSQL 11的方法

完成后,我们就可以继续在PostgreSQL数据库上实现SSL。

 

步骤2:创建证书

PostgreSQL对使用SSL连接来加密客户端/服务器通信以提高安全性提供了本机支持。如果您没有购买证书,请创建服务器证书,其身份可以由客户端验证。为此,首先创建一个证书签名请求(CSR)和一个公共/私有密钥文件,如下所示

openssl req -new -nodes -text -out root.csr \

 -keyout root.key -subj "/CN=root.computingforgeeks.com"

注意,请确保更改“root.computingforgeeks.com”以匹配您的域名。创建根密钥后,请确保其权限设置为尽可能安全。确保“group”和“others”将无法读取、写入和执行:

sudo chmod og-rwx root.key

完成之后,使用密钥对请求进行签名以创建根证书颁发机构(使用Linux上的默认OpenSSL配置文件位置)。您可以通过运行“openssl version -d”命令来检查Linux上OpenSSL配置文件的位置:

openssl x509 -req -in root.csr -text -days 3650 \

 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca \

 -signkey root.key -out root.crt

最后,创建由新的根证书颁发机构签名的服务器证书:

\##生成私有服务器密钥并设置安全权限

openssl req -new -nodes -text -out server.csr \

 -keyout server.key -subj "/CN=datab.computingforgeeks.com"

sudo chmod og-rwx server.key

然后还创建由新的根证书颁发机构签名的服务器证书:

openssl x509 -req -in server.csr -text -days 365 \

 -CA root.crt -CAkey root.key -CAcreateserial \

 -out server.crt

上面的命令将生成server.crt和server.key。这些是我们将要添加到PostgreSQL的服务器证书。另一方面,root.crt应该存储在客户端上,以便客户端可以验证服务器的证书已由其受信任的根证书签名。现在,root.crt应该嵌入用Java和任何其他编程语言编写的应用程序中。对于Java,应将其添加到其密钥库中。

将root.key保留在安全的位置,因为它可用于创建将来的证书。

为方便起见,我们将服务器和根证书复制到PostgreSQL保留其主要配置文件的位置。这样,Postgres将能够在读取其配置文件的相同位置读取它们。CentOS中的位置对于PostgreSQL 13是/var/lib/pgsql/13/data/,对于PostgreSQL 12是/var/lib/pgsql/12/data/,对于PostgreSQL 11是/var/lib/pgsql/11/data/。在本示例中,我们将使用PostgreSQL 11:

sudo cp server.* root.crt /var/lib/pgsql/11/data/  ##For PostgreSQL 11

 

步骤3:配置PostgreSQL数据库以启用SSL

现在我们有了证书,没有什么可以拒绝我们在PostgreSQL服务器中启用SSL的机会了。根据PostgreSQL数据库的版本,打开其配置文件。我们将在这里以11版本为例。查找文件中已注释的与ssl相关的行,然后取消注释。这些行在下面共享:

$ sudo vim /var/lib/pgsql/11/data/postgresql.conf 

ssl = on

ssl_ca_file = 'root.crt'

ssl_cert_file = 'server.crt'

ssl_key_file = 'server.key'

ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'

ssl_prefer_server_ciphers = on

ssl_ecdh_curve = 'prime256v1'

完成此操作后,我们需要在pg_hba.conf文件中启用hostssl记录,该记录将与使用TCP/IP进行的连接尝试匹配,但仅当使用SSL加密进行连接时才如此。打开文件并进行如下编辑:

$ sudo vim /var/lib/pgsql/11/data/pg_hba.conf

hostssl    all             all             10.38.87.40/32       md5   clientcert=verify-full

hostssl    all             all             10.38.87.41/32       md5   clientcert=verify-full

hostssl    all             all             10.38.87.42/32       md5   clientcert=verify-full

hostssl    all             all             10.38.87.43/32       md5   clientcert=verify-full

要保留到目前为止所做的更改,我们需要这样重启PostreSQL服务:

sudo systemctl restart postgresql-<version>

以下将确认已启用SSL。

为了确保SSL设置有效,我们将登录数据库并检查将显示给我们的消息。您可以在服务器内部或从安装了psql并允许连接到数据库的另一台服务器上运行以下命令。您应该会看到类似以下截图的内容,说明已成功启用了SSL:

$ psql -U postgres -h 10.38.87.46 -d postgres

在PostgreSQL中启用SSL加密和SCRAM-SHA-256密码验证的步骤

 

步骤4:配置PostgreSQL数据库以启用SCRAM-SHA-256

现在已启用SSL并按配置工作,现在让我们通过启用SCRAM-SHA-256密码身份验证来增加另一层安全性。这是一个非常简单的过程。首先,打开主postgresql配置文件,并将下面的行更改为如下所示:

$ sudo vim /var/lib/pgsql/11/data/postgresql.conf

password_encryption = scram-sha-256

完成此操作后,我们需要通过编辑pg_hba.conf文件来强制客户端通过此新方案进行身份验证,如下所示。您会注意到,所有出现的md5都已替换为scram-sha-256:

$ sudo vim /var/lib/pgsql/11/data/pg_hba.conf

hostssl    all             all             10.38.87.40/32      scram-sha-256   clientcert=verify-full

hostssl    all             all             10.38.87.41/32      scram-sha-256   clientcert=verify-full

hostssl    all             all             10.38.87.42/32      scram-sha-256   clientcert=verify-full

hostssl    all             all             10.38.87.43/32      scram-sha-256   clientcert=verify-full

要保留到目前为止所做的更改,我们需要这样重启PostreSQL服务:

sudo systemctl restart postgresql-11

完成这些更改后,我们将必须更新数据库中所有用户的密码,否则您将无法登录。为此,请按以下方式访问数据库。您必须具有sudo权限,运行以下命令:

$ sudo su - postgres

在PostgreSQL中启用SSL加密和SCRAM-SHA-256密码验证的步骤

然后像这样运行password命令,然后按Enter。系统将提示您输入两次密码。您可以输入与之前相同的密码。现在将使用新的scram-sha-256方案对其进行加密。

postgres=#\password <db_user>

Enter new password:

Enter it again:

postgres=#

一旦完成,剩下的唯一步骤就是将证书添加到客户端应用程序。对于* nix系统,可以将客户端证书放在${user.home}/.postgresql/目录下。

使用JDBC驱动程序进行连接时,连接字符串应符合以下格式。注意添加了ssl=true选项:

jdbc:postgresql://<database-server-ip-or-fqdn>:<database-port>/<database-name>?ssl=true

##For example

jdbc:postgresql://datab.computingforgeeks.com:5432/all_cent_customers?ssl=true

至此,达到了本文预期的目标,操作完成。

 

相关主题

在Linux下安装和使用Adminer,用它管理MySQL/MariaDB和PostgreSQL

精选文章
热门文章