在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来获取。