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

PostgreSQL 12.2 官方手册学习(第 18 章 加密选项之跨网络加密数据-SSL连接)

PostgreSQL数据库工作学习随笔 2021-07-21
236

    PostgreSQL 有一个对使用 SSL 连接加密客户端/服务器通讯的本地支持,它可以增加安全性。这个特性要求在客户端和服务器端都安装 OpenSSL 并且在编译 PostgreSQL 的时候打开这个支持。

    --with-openssl

    编译SSL(加密)连接支持。这个选项需要安装OpenSSL包。configure将会检查所需的头文件和库以确保你的 OpenSSL安装足以让配置继续下去。



1. 基本配置

    当SSL支持被编译在PostgreSQL中时,可以通过将postgresql.conf中的 ssl设置为on让PostgreSQL服务器带着SSL支持被启动。服务器在同一个 TCP 端口监听普通连接和SSL连接,并且将与任何正在连接的客户端协商是否使用SSL。默认情况下,这是客户端的选项,关于如何设置服务器来要求某些或者所有连接使用SSL请见第 20.1 节 。


    要SSL模式中启动服务器,包含服务器证书和私钥的文件必须存在。默认情况下,这些文件应该分别被命名为server.crt和server.key并且被放在服务器的数据目录中,但是可以通过配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。


    在 Unix 系统上,server.key上的权限必须不允许所有人或组的任何访问,通过命令chmod 0600 server.key可以做到。或者,该文件可以由root 所拥有并且具有组读访问(也就是0640权限)。这种设置适用于由操作系统管理证书和密钥文件的安装。用于运行PostgreSQL服务器的用户应该被作为能够访问那些证书和密钥文件的组成员。


    如果数据目录允许组读取访问,则证书文件可能需要位于数据目录之外,以符合上面概述的安全要求。通常,启用组访问权限是为了允许非特权用户备份数据库,在这种情况下,备份软件将无法读取证书文件,并且可能会出错。


    如果私钥被一个密码保护着,服务器将提示要求这个密码,并且在它被输入前不会启动。默认情况下,使用密码禁用在不重启服务器的情况下更改服务器的SSL配置的功能,并且参见 ssl_passphrase_command_supports_reload。此外,密码保护的私钥在Windows上根本无法使用。


    server.crt中的第一个证书必须是服务器的证书,因为它必须与服务器的私钥匹

配。“intermediate”的证书颁发机构,也可以追加到文件。假设根证书和中间证书是使用v3_ca扩展名创建的,那么这样做避免了在客户端上存储中间证书的必要。这使得中间证书更容易到期。

    无需将根证书添加到中server.crt。相反,客户端必须具有服务器证书链的根证书。


2. OpenSSL配置

    PostgreSQL读取系统范围的OpenSSL配置文件。默认情况下,该文件被命名为openssl.cnf并位于openssl version -d报告的目录中。通过将环境变量设置OPENSSL_CONF为所需配置文件的名称,可以覆盖此默认值。OpenSSL支持各种强度不同的密码和身份验证算法。虽然许多密码可以在OpenSSL的配置文件中被指定,您可以通过修改postgresql.conf配置文件中指定专门针对数据库服务器使用密码的ssl_ciphers 配置。


3. 创建证书

    要为服务器创建一个有效期为365天的简单自签名证书,可以使用下面的OpenSSL命令,将dbhost.yourdomain.com替换为服务器的主机名:


    openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=dbhost.yourdomain.com"

    然后执行:

    chmod og-rwx server.key

    如果文件的权限比这个更自由,服务器将拒绝该文件。要了解更多关于如何创建你的服务器私钥和证书的细节, 请参考OpenSSL文档。


    尽管可以使用自签名证书进行测试,但是在生产中应该使用由证书颁发机构(CA)(通常是企业范围的根CA)签名的证书。要创建其身份可以被客户端验证的服务器证书,请首先创建一个证书签名请求(CSR)和一个公共/专用密钥文件:

openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=root.yourdomain.com"

chmod og-rwx root.key

    然后,使用密钥对请求进行签名以创建根证书颁发机构(使用Linux上的默认OpenSSL配置文件位置):

openssl x509 -req -in root.csr -text -days 3650 -extfile etc/ssl/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt

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

openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=dbhost.yourdomain.com"

chmod og-rwx server.key

注:CN=dbhost.yourdomain.com为数据库IP或者主机名

openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt

server.crt和server.key应该存储在服务器上,并且root.crt应该存储在客户端上,以便客户端可以验证服务器的叶证书已由其受信任的根证书签名。root.key应该离线存储以用于创建将来的证书。


也可以创建一个包括中间证书的信任链:

# root

    openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=root.yourdomain.com"

    chmod og-rwx root.key

    openssl x509 -req -in root.csr -text -days 3650 -extfile etc/ssl/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt


# intermediate

    openssl req -new -nodes -text -out intermediate.csr -keyout intermediate.key -subj "/CN=intermediate.yourdomain.com"

    chmod og-rwx intermediate.key


    openssl x509 -req -in intermediate.csr -text -days 1825 -extfile etc/ssl/openssl.cnf -extensions v3_ca -CA root.crt -CAkey root.key -CAcreateserial -out intermediate.crt


# leaf

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

-keyout server.key -subj "/CN=dbhost.yourdomain.com"

    chmod og-rwx server.key

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

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

-out server.crt

    server.crt和intermediate.crt应连接成一个证书文件包中并存储在服务器上。server.key还应该存储在服务器上。root.crt应将其存储在客户端上,以便客户端可以验证服务器的叶证书是否已由链接到其受信任根证书的证书链签名。root.key和intermediate.key应离线存储以用于创建将来的证书。


4. SSL 服务器文件用法

    表 18.2总结了与服务器上 SSL 配置有关的文件(显示的文件名是默认的名称。本地配置的名称可能会不同)。

    服务器在服务器启动时以及服务器配置重新加载时读取这些文件。在Windows系统上,只要为新客户端连接生成新的后端进程,它们也会重新读取。

    如果在服务器启动时检测到这些文件中的错误,服务器将拒绝启动。但是,如果在配置重新加载过程中检测到错误,则会忽略这些文件,并继续使用旧的SSL配置。在Windows系统上,如果在后端启动时检测到这些文件中存在错误,则该后端将无法建立SSL连接。在所有这些情况下,错误情况都会在服务器日志中报告。


5. 使用客户端证书

    要求客户端提供受信任的证书,把你信任的根证书颁发机构(CA)的证书放置在数据目录文件中。并且修改postgresql.conf中的参数ssl_ca_file到新的文件名, 还要把认证选项 clientcert=verify-ca或clientcert=verify-full加入到pg_hba.conf文件中合适的hostssl行上。然后将在 SSL 连接启动时从客户端请求该证书(一段对于如何在客户端设置证书的描述请见第 33.18 节 )。


创建客户端证书:

修改数据库服务器pg_hba.conf文件只允许客户端使用hostssl连接:

拷贝client.crt client.key root.crt到客户端,对client.key赋权0600:


验证成功!


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

评论