4.5. 在 PostgreSQL 服务器中配置 TLS 加密


默认情况下,PostgreSQL 使用未加密的连接。如需更多安全连接,您可以在 PostgreSQL 服务器中启用传输层安全(TLS)支持,并将客户端配置为建立加密连接。

先决条件

  • 已安装 PostgreSQL 服务器。
  • 初始化数据库集群。
  • 如果服务器运行 RHEL 9.2 或更高版本,并且启用了 FIPS 模式,则客户端必须支持扩展 Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 在 RHEL 9.2 及更高版本上强制执行 TLS 扩展 "Extended Master Secret"

流程

  1. 安装 OpenSSL 库:

    # dnf install openssl
    Copy to Clipboard Toggle word wrap
  2. 生成 TLS 证书和密钥:

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"
    Copy to Clipboard Toggle word wrap

    dbhost.yourdomain.com 替换为您的数据库主机和域名。

  3. 将签名的证书和私钥复制到数据库服务器的所需位置:

    # cp server.{key,crt} /var/lib/pgsql/data/.
    Copy to Clipboard Toggle word wrap
  4. 将签名证书的所有者和组所有权改为 postgres 用户:

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
    Copy to Clipboard Toggle word wrap
  5. 限制私钥的权限,使其只可由所有者读取:

    # chmod 0400 /var/lib/pgsql/data/server.key
    Copy to Clipboard Toggle word wrap
  6. 通过在 /var/lib/pgsql/data/postgresql.conf 文件中更改以下行,将密码哈希算法设置为 scram-sha-256

    #password_encryption = md5              # md5 or scram-sha-256
    Copy to Clipboard Toggle word wrap

    改为:

    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  7. 通过在 /var/lib/pgsql/data/postgresql.conf 文件中更改以下行,将 PostgreSQL 配置为使用 SSL/TLS:

    #ssl = off
    Copy to Clipboard Toggle word wrap

    改为:

    ssl=on
    Copy to Clipboard Toggle word wrap
  8. 通过更改 /var/lib/pgsql/data/pg_hba.conf 文件中的 IPv4 本地连接,将所有数据库的访问限制为只使用 TLS 的客户端的连接:

    host		all		all		127.0.0.1/32		ident
    Copy to Clipboard Toggle word wrap

    改为:

    hostssl 	all		all		127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap

    另外,您可以通过添加以下新行来限制单个数据库和用户的访问:

    hostssl	mydatabase	mydbuser	127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap

    mydatabase 替换为数据库名称,并将 mydbuser 替换为用户名。

  9. 通过重启 postgresql 服务来有效地进行更改:

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap

验证

  • 手动验证连接是否已加密:

    1. mydbuser 用户身份连接到 PostgreSQL 数据库,指定主机名和数据库名称:

      $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
      Password for user mydbuser:
      Copy to Clipboard Toggle word wrap

      mydatabase 替换为数据库名称,并将 mydbuser 替换为用户名。

    2. 获取有关当前数据库连接的信息:

      mydbuser=> \conninfo
      You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
      SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
      Copy to Clipboard Toggle word wrap
  • 您可以编写一个简单的应用程序,验证与 PostgreSQL 的连接是否已加密。本例演示了使用 C 编写的那些使用 libpq 客户端库(由 libpq-devel 软件包提供)的应用程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    
    int main(int argc, char* argv[])
    {
    //Create connection
    PGconn* connection = PQconnectdb("hostaddr=127.0.0.1 password=mypassword port=5432 dbname=mydatabase user=mydbuser");
    
    if (PQstatus(connection) ==CONNECTION_BAD)
        {
        printf("Connection error\n");
        PQfinish(connection);
        return -1; //Execution of the program will stop here
        }
        printf("Connection ok\n");
        //Verify TLS
        if (PQsslInUse(connection)){
         printf("TLS in use\n");
         printf("%s\n", PQsslAttribute(connection,"protocol"));
        }
        //End connection
        PQfinish(connection);
        printf("Disconnected\n");
        return 0;
    }
    Copy to Clipboard Toggle word wrap

    mypassword 替换为密码,将 mydatabase 替换为数据库名称,并将 mydbuser 替换为用户名。

    注意

    您必须使用 -lpq 选项为编译加载 pq 库。例如,使用 GCC 编译器编译应用程序:

    $ gcc source_file.c -lpq -o myapplication
    Copy to Clipboard Toggle word wrap

    其中 source_file.c 包含上面的示例代码,myapplication 是应用程序的名称,用于验证安全的 PostgreSQL 连接。

例 4.2. 使用 TLS 加密初始化、创建和连接到 PostgreSQL 数据库

本例演示如何初始化 PostgreSQL 数据库,创建数据库用户和数据库,以及如何使用安全连接连接到数据库。

  1. 安装 PosgreSQL 服务器:

    # dnf install postgresql-server
    Copy to Clipboard Toggle word wrap
  2. 初始化数据库集群:

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
    Copy to Clipboard Toggle word wrap
  3. 安装 OpenSSL 库:

    # dnf install openssl
    Copy to Clipboard Toggle word wrap
  4. 生成 TLS 证书和密钥:

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"
    Copy to Clipboard Toggle word wrap

    dbhost.yourdomain.com 替换为您的数据库主机和域名。

  5. 将签名的证书和私钥复制到数据库服务器的所需位置:

    # cp server.{key,crt} /var/lib/pgsql/data/.
    Copy to Clipboard Toggle word wrap
  6. 将签名证书的所有者和组所有权改为 postgres 用户:

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
    Copy to Clipboard Toggle word wrap
  7. 限制私钥的权限,使其只可由所有者读取:

    # chmod 0400 /var/lib/pgsql/data/server.key
    Copy to Clipboard Toggle word wrap
  8. 将密码哈希算法设置为 scram-sha-256。在 /var/lib/pgsql/data/postgresql.conf 文件中,更改以下行:

    #password_encryption = md5              # md5 or scram-sha-256
    Copy to Clipboard Toggle word wrap

    改为:

    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  9. 将 PostgreSQL 配置为使用 SSL/TLS。在 /var/lib/pgsql/data/postgresql.conf 文件中,更改以下行:

    #ssl = off
    Copy to Clipboard Toggle word wrap

    改为:

    ssl=on
    Copy to Clipboard Toggle word wrap
  10. 启动 postgresql 服务:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  11. 以名为 postgres 的系统用户登录:

    # su - postgres
    Copy to Clipboard Toggle word wrap
  12. postgres 用户身份启动 PostgreSQL 互动终端:

    $ psql -U postgres
    psql (13.7)
    Type "help" for help.
    
    postgres=#
    Copy to Clipboard Toggle word wrap
  13. 创建名为 mydbuser 的用户,再为 mydbuser 设置一个密码:

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd';
    CREATE ROLE
    postgres=#
    Copy to Clipboard Toggle word wrap
  14. 创建名为 mydatabase 的数据库:

    postgres=# CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=#
    Copy to Clipboard Toggle word wrap
  15. mydbuser 用户授予所有权限:

    postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser;
    GRANT
    postgres=#
    Copy to Clipboard Toggle word wrap
  16. 从互动终端注销:

    postgres=# \q
    Copy to Clipboard Toggle word wrap
  17. 注销 postgres 用户会话:

    $ logout
    Copy to Clipboard Toggle word wrap
  18. 通过更改 /var/lib/pgsql/data/pg_hba.conf 文件中的 IPv4 本地连接,将所有数据库的访问限制为只使用 TLS 的客户端的连接:

    host		all		all		127.0.0.1/32		ident
    Copy to Clipboard Toggle word wrap

    改为:

    hostssl 	all		all		127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap
  19. 通过重启 postgresql 服务来有效地进行更改:

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap
  20. mydbuser 用户身份连接到 PostgreSQL 数据库,指定主机名和数据库名称:

    $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
    Password for user mydbuser:
    psql (13.7)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    mydatabase=>
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat