在AlmaLinux 9上,通过yum存储库安装PostgreSQL 15,并启用SSL连接

什么?

按照标题所说,我们将尝试使用 AlmaLinx 9 上的 PostgreSQL 的 yum 仓库来安装 PostgreSQL 15。

我想在这个时候尝试一下能否进行SSL连接。

环境

这次的环境就是这个。

$ cat /etc/redhat-release
AlmaLinux release 9.1 (Lime Lynx)


$ uname -srvmpio
Linux 5.14.0-162.23.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 11 10:43:28 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux


$ openssl version
OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

确认安装方法

我们来确认安装方法。

在这个页面上选择”Linux”。

 

当出现Linux发行版的选择时,请选择”Red Hat/Rocky/CentOS”。

然后,您将被转至此页面。

 

在此页面中,涉及的Linux发行版如下所示,不过由于AlmaLinux也可以,所以我会继续进行。

    • Red Hat Enterprise Linux

 

    • Rocky Linux

 

    • CentOS 6または7

 

    • Fedora

 

    Oracle Linux

如果要直接使用RPM文件,请使用此选项。

直接使用RPM文件,请点击这里。

 

从yum软件源安装PostgreSQL 15

现在,我们将安装PostgreSQL 15。

在以下页面中,将“Select version”设置为“15”,将“Select platform”设置为“Red Hat Enterprise、Rocky或Oracle version9”,将“Select architecture”设置为“x86_64”,然后执行显示的命令。

 

安装Yum仓库。

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

当您首次使用此存储库时,将要求您进行GPG密钥的导入确认。

在文档中提到禁用默认的PostgreSQL模块,但实际执行会导致错误。

$ sudo dnf -qy module disable postgresql
引数 postgresql を解決できません
エラー: リクエスト中の問題:
足りないグループまたはモジュール: postgresql

$ dnf module list postgresql
Extra Packages for Enterprise Linux 9 - x86_64
エラー: 表示する一致モジュールはありません

顺便提一下,在AlmaLinux 8也有。

$ dnf module list postgresql
Failed to set locale, defaulting to C.UTF-8
AlmaLinux 8 - BaseOS                                                                                                                                     3.4 MB/s | 6.3 MB     00:01
AlmaLinux 8 - AppStream                                                                                                                                  5.3 MB/s |  12 MB     00:02
AlmaLinux 8 - Extras                                                                                                                                      21 kB/s |  19 kB     00:00
Extra Packages for Enterprise Linux 8 - x86_64                                                                                                           5.4 MB/s |  14 MB     00:02
Last metadata expiration check: 0:00:01 ago on Sat Apr 15 07:17:58 2023.
AlmaLinux 8 - AppStream
Name                                    Stream                             Profiles                                       Summary
postgresql                              9.6                                client, server [d]                             PostgreSQL server and client module
postgresql                              10 [d]                             client, server [d]                             PostgreSQL server and client module
postgresql                              12                                 client, server [d]                             PostgreSQL server and client module
postgresql                              13                                 client, server [d]                             PostgreSQL server and client module

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

所以,安装了PostgreSQL 15。

$ sudo dnf install postgresql15-server

这次安装的是PostgreSQL 15.2。

$ psql --version
psql (PostgreSQL) 15.2

包装的信息。

$ dnf info postgresql15-server
Extra Packages for Enterprise Linux 9 - x86_64                                                                                                           8.9 kB/s | 3.8 kB     00:00
PostgreSQL common RPMs for RHEL / Rocky 9 - x86_64                                                                                                        89  B/s | 195  B     00:02
PostgreSQL 15 for RHEL / Rocky 9 - x86_64                                                                                                                 96  B/s | 195  B     00:02
PostgreSQL 14 for RHEL / Rocky 9 - x86_64                                                                                                                 91  B/s | 195  B     00:02
PostgreSQL 13 for RHEL / Rocky 9 - x86_64                                                                                                                100  B/s | 195  B     00:01
PostgreSQL 12 for RHEL / Rocky 9 - x86_64                                                                                                                 87  B/s | 195  B     00:02
PostgreSQL 11 for RHEL / Rocky 9 - x86_64                                                                                                                 97  B/s | 195  B     00:02
インストール済みパッケージ
名前         : postgresql15-server
バージョン   : 15.2
リリース     : 1PGDG.rhel9
Arch         : x86_64
サイズ       : 24 M
ソース       : postgresql15-15.2-1PGDG.rhel9.src.rpm
リポジトリー : @System
repo から    : pgdg15
概要         : The programs needed to create and run a PostgreSQL server
URL          : https://www.postgresql.org/
ライセンス   : PostgreSQL
説明         : PostgreSQL is an advanced Object-Relational database management system (DBMS).
             : The postgresql15-server package contains the programs needed to create
             : and run a PostgreSQL server, which will in turn allow you to create
             : and maintain PostgreSQL databases.

创建一个新的数据库集群。

$ sudo PGSETUP_INITDB_OPTIONS='--encoding=UTF-8 --no-locale' postgresql-15-setup initdb

使用环境变量PGSETUP_INITDB_OPTIONS,在UTF-8编码和无对应地区设置的情况下创建数据库。

 

在设置文件中确认地区设置为C。

$ sudo grep lc_ /var/lib/pgsql/15/data/postgresql.conf
lc_messages = 'C'                       # locale for system error message
lc_monetary = 'C'                       # locale for monetary formatting
lc_numeric = 'C'                        # locale for number formatting
lc_time = 'C'                           # locale for time formatting

如果忘记了这个设置,它将会在当前区域设置下被设置。

$ sudo grep lc_ /var/lib/pgsql/15/data/postgresql.conf
lc_messages = 'ja_JP.utf8'                      # locale for system error message
lc_monetary = 'ja_JP.utf8'                      # locale for monetary formatting
lc_numeric = 'ja_JP.utf8'                       # locale for number formatting
lc_time = 'ja_JP.utf8'                          # locale for time formatting

启用自动启动。

$ sudo systemctl enable postgresql-15

状态。

$ sudo systemctl status postgresql-15
○ postgresql-15.service - PostgreSQL 15 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
     Active: inactive (dead)
       Docs: https://www.postgresql.org/docs/15/static/

开始。

$ sudo systemctl start postgresql-15

再次确认状态。

$ sudo systemctl status postgresql-15
● postgresql-15.service - PostgreSQL 15 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2023-04-15 16:30:19 JST; 20s ago
       Docs: https://www.postgresql.org/docs/15/static/
    Process: 3400 ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 3405 (postmaster)
      Tasks: 7 (limit: 11077)
     Memory: 17.5M
        CPU: 81ms
     CGroup: /system.slice/postgresql-15.service
             ├─3405 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
             ├─3406 "postgres: logger "
             ├─3407 "postgres: checkpointer "
             ├─3408 "postgres: background writer "
             ├─3410 "postgres: walwriter "
             ├─3411 "postgres: autovacuum launcher "
             └─3412 "postgres: logical replication launcher "

 4月 15 16:30:19 alma9.localdomain systemd[1]: Starting PostgreSQL 15 database server...
 4月 15 16:30:19 alma9.localdomain postmaster[3405]: 2023-04-15 16:30:19.747 JST [3405] LOG:  redirecting log output to logging collector process
 4月 15 16:30:19 alma9.localdomain postmaster[3405]: 2023-04-15 16:30:19.747 JST [3405] HINT:  Future log output will appear in directory "log".
 4月 15 16:30:19 alma9.localdomain systemd[1]: Started PostgreSQL 15 database server.

看起来已经启动了。

数据等在/var/lib/pgsql/15目录中。

$ sudo ls -l /var/lib/pgsql/15
合計 8
drwx------.  2 postgres postgres    6  2月  9 21:30 backups
drwx------. 20 postgres postgres 4096  4月 15 16:30 data
-rw-------.  1 postgres postgres 1246  4月 15 16:27 initdb.log

确认连接

先试试在这个状态下用psql进行连接。

$ sudo su - postgres
[postgres@alma9 ~]$ psql
psql (15.2)
"help"でヘルプを表示します。

postgres=# select version();
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 15.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.3.1 20220421 (Red Hat 11.3.1-2), 64-bit
(1 行)

好的,没问题。

我们也要创建用户。

postgres=# create user myuser password 'password';
CREATE ROLE
postgres=# create database example owner myuser;
CREATE DATABASE

请确认连接。

$ psql -h localhost -U myuser example
ユーザー myuser のパスワード:
psql (15.2)
"help"でヘルプを表示します。

启用SSL连接

接下来,让我们尝试启用SSL连接。

文件在这里。

 

只需安装OpenSSL 1.0.1或更高版本即可启用SSL。

本次目标是使用自签名证书创建SSL证书,并将sslmode设置为require。

 

生成SSL证书。

$ sudo openssl req -new -x509 -days 365 -nodes -text -out /var/lib/pgsql/15/data/server.crt -keyout /var/lib/pgsql/15/data/server.key

这是一个示例文档,但是证书的有效期为365天。

另外,至少应禁止非postgres用户访问server.key。

在Unix系统上,服务器密钥(server.key)的权限必须禁止任何对外界或群组的访问;可以通过命令chmod 0600 server.key来实现此目的。或者,该文件可以由root所有,并具有群组读访问权限(即0640权限)。

暂时将server.key和server.crt的所有者更改为postgres。

$ sudo chown postgres:postgres /var/lib/pgsql/15/data/server.{crt,key}

更改 server.key(秘密钥匙)的权限。

$ sudo chmod og-rwx /var/lib/pgsql/15/data/server.key

我将更改/var/lib/pgsql/15/data/postgresql.conf文件中的以下部分。

# - SSL -

#ssl = off
#ssl_ca_file = ''
#ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_crl_dir = ''
#ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1.2'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off

最低限的设置更改。

# - SSL -

ssl = on
#ssl_ca_file = ''
ssl_cert_file = '/var/lib/pgsql/15/data/server.crt'
#ssl_crl_file = ''
#ssl_crl_dir = ''
ssl_key_file = '/var/lib/pgsql/15/data/server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1.2'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off

之后将重新启动PostgreSQL。

$ sudo systemctl restart postgresql-15

通过在这种状态下使用psql进行访问,您可以确认SSL连接已启用。

$ psql -h localhost -U myuser example
ユーザー myuser のパスワード:
psql (15.2)
SSL接続(プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、圧縮: オフ)
"help"でヘルプを表示します。

example=>

如果支持SSL连接的话,psql会使用SSL进行连接。

在统计信息视图中查看是否进行了SSL连接,似乎可以通过结合pg_stat_activity和pg_stat_ssl来实现。

    • pg_stat_activity

 

    pg_stat_ssl
select
  psa.datname, psa.pid, psa.usename, psa.application_name, psa.client_addr, psa.client_port, psa.query, pss.ssl, pss.version, pss.cipher, pss.bits, pss.client_dn, pss.client_serial, pss.issuer_dn
from
  pg_stat_activity psa
inner join
  pg_stat_ssl pss
on
  psa.pid = pss.pid
example=> select psa.datname, psa.pid, psa.usename, psa.application_name, psa.client_addr, psa.client_port, psa.query, pss.ssl, pss.version, pss.cipher, pss.bits, pss.client_dn, pss.client_serial, pss.issuer_dn from pg_stat_activity psa inner join pg_stat_ssl pss on psa.pid = pss.pid;
 datname | pid  | usename | application_name | client_addr | client_port |
                         query                                                                                                                                        | ssl | version |
       cipher         | bits | client_dn | client_serial | issuer_dn
---------+------+---------+------------------+-------------+-------------+---------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----+---------+--
----------------------+------+-----------+---------------+-----------
 example | 4895 | myuser  | psql             | 127.0.0.1   |       38844 | select psa.datname, psa.pid, psa.usename, psa.application_name, psa.client_addr, psa.client_port, psa.query, p
ss.ssl, pss.version, pss.cipher, pss.bits, pss.client_dn, pss.client_serial, pss.issuer_dn from pg_stat_activity psa inner join pg_stat_ssl pss on psa.pid = pss.pid; | t   | TLSv1.3 | T
LS_AES_256_GCM_SHA384 |  256 |           |               |
(1 行)

或者,可以使用扩展模块sslinfo。

 

只是,在执行此次安装步骤后,尝试启用扩展模块会导致失败。

postgres=# create extension sslinfo;
ERROR:  extension "sslinfo" is not available
DETAIL:  Could not open extension control file "/usr/pgsql-15/share/extension/sslinfo.control": No such file or directory.
HINT:  The extension must first be installed on the system where PostgreSQL is running.

要使用扩展模块,您需要先安装postgresql15-contrib。

$ sudo dnf install postgresql15-contrib

如果您是管理员用户,您就可以启用扩展模块。

在目标数据库中,启用sslinfo和juu。

$ psql example
psql (15.2)
"help"でヘルプを表示します。

example=# create extension sslinfo;
CREATE EXTENSION

一般用户的话是不可以的。

example=> create extension sslinfo;
ERROR:  permission denied to create extension "sslinfo"
HINT:  Must be superuser to create this extension.

确认。

# Unixドメインソケット
$ psql example
psql (15.2)
"help"でヘルプを表示します。

example=# select ssl_is_used();
 ssl_is_used
-------------
 f
(1 )


# TCP/IP with SSL
$ psql -h localhost -U myuser example
ユーザー myuser のパスワード:
psql (15.2)
SSL接続(プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、圧縮: オフ)
"help"でヘルプを表示します。

example=> select ssl_is_used();
 ssl_is_used
-------------
 t
(1 )

好的,没问题。 de, .)

另外,可以在sslinfo模块中获取到的信息,也包含在pg_stat_ssl中。

通过这个模块可以获取到的部分信息也可以通过内置的系统视图pg_stat_ssl来获取。

 

广告
将在 10 秒后关闭
bannerAds