4.5. PostgreSQL サーバーにおける TLS 暗号化の設定
デフォルトでは、PostgreSQL は暗号化されていない接続を使用します。よりセキュアな接続のために、PostgreSQL サーバーで Transport Layer Security (TLS) サポートを有効にし、暗号化された接続を確立するようにクライアントを設定できます。
前提条件
- PostgreSQL サーバーがインストールされている
- データベースクラスターが初期化されている
- サーバーが RHEL 9.2 以降を実行し、FIPS モードが有効になっている場合、クライアントが Extended Master Secret (EMS) 拡張機能をサポートしているか、TLS 1.3 を使用している必要があります。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat ナレッジベースソリューション TLS extension "Extended Master Secret" enforced on RHEL 9.2 and later を参照してください。
手順
OpenSSL ライブラリーをインストールします。
dnf install openssl
# dnf install openssl
Copy to Clipboard Copied! Toggle word wrap Toggle overflow TLS 証明書とキーを生成します。
openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow dbhost.yourdomain.com をデータベースのホストとドメイン名に置き換えます。
署名済み証明書と秘密鍵をデータベースサーバー上の必要なロケーションにコピーします。
cp server.{key,crt} /var/lib/pgsql/data/.
# cp server.{key,crt} /var/lib/pgsql/data/.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 署名付き証明書と秘密鍵の所有者とグループの所有権を
postgres
ユーザーに変更します。chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 所有者だけが読み取れるように、秘密鍵の権限を制限します。
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/postgresql.conf
ファイルの次の行を変更して、パスワードハッシュアルゴリズムをscram-sha-256
に設定します。#password_encryption = md5 # md5 or scram-sha-256
#password_encryption = md5 # md5 or scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
password_encryption = scram-sha-256
password_encryption = scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/postgresql.conf
ファイルの次の行を変更して、SSL/TLS を使用するように PostgreSQL を設定します。#ssl = off
#ssl = off
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
ssl=on
ssl=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/pg_hba.conf
ファイルの IPv4 ローカル接続で次の行を変更して、TLS を使用するクライアントからの接続のみを受け入れるように、すべてのデータベースへのアクセスを制限します。host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 ident
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
hostssl all all 127.0.0.1/32 scram-sha-256
hostssl all all 127.0.0.1/32 scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、次の行を新たに追加して、単一のデータベースとユーザーのアクセスを制限できます。
hostssl mydatabase mydbuser 127.0.0.1/32 scram-sha-256
hostssl mydatabase mydbuser 127.0.0.1/32 scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydatabase をデータベース名に、mydbuser をユーザー名に置き換えます。
postgresql
サービスを再起動して、変更を有効にします。systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
接続が暗号化されていることを手動で確認するには、以下を行います。
mydbuser ユーザーとして PostgreSQL データベースに接続し、ホスト名とデータベース名を指定します。
psql -U mydbuser -h 127.0.0.1 -d mydatabase
$ psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydatabase をデータベース名に、mydbuser をユーザー名に置き換えます。
現在のデータベース接続に関する情報を取得します。
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)
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 Copied! Toggle word wrap Toggle overflow
PostgreSQL への接続が暗号化されているかどうかを検証する簡単なアプリケーションを作成できます。この例は、
libpq-devel
パッケージで提供されるlibpq
クライアントライブラリーを使用する C で記述されたアプリケーションを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mypassword をパスワードに、mydatabase をデータベース名に、mydbuser をユーザー名に置き換えます。
注記-lpq
オプションを使用して、コンパイルのためにpq
ライブラリーをロードする必要があります。たとえば、GCC コンパイラーを使用してアプリケーションをコンパイルするには、次のようにします。gcc source_file.c -lpq -o myapplication
$ gcc source_file.c -lpq -o myapplication
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この source_file.c には上記のサンプルコードが含まれており、myapplication はセキュアな PostgreSQL 接続を検証するためのアプリケーションの名前です。
例4.2 TLS 暗号化を使用した PostgreSQL データベースの初期化、作成、接続
この例では、PostgreSQL データベースの初期化方法、データベースユーザーとデータベースの作成方法、セキュアな接続を使用したデータベースへの接続方法を示します。
PosgreSQL サーバーをインストールします。
dnf install postgresql-server
# dnf install postgresql-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow データベースクラスターを初期化します。
postgresql-setup --initdb
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenSSL ライブラリーをインストールします。
dnf install openssl
# dnf install openssl
Copy to Clipboard Copied! Toggle word wrap Toggle overflow TLS 証明書とキーを生成します。
openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow dbhost.yourdomain.com をデータベースのホストとドメイン名に置き換えます。
署名済み証明書と秘密鍵をデータベースサーバー上の必要なロケーションにコピーします。
cp server.{key,crt} /var/lib/pgsql/data/.
# cp server.{key,crt} /var/lib/pgsql/data/.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 署名付き証明書と秘密鍵の所有者とグループの所有権を
postgres
ユーザーに変更します。chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 所有者だけが読み取れるように、秘密鍵の権限を制限します。
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パスワードハッシュアルゴリズムを
scram-sha-256
に設定します。/var/lib/pgsql/data/postgresql.conf
ファイルで、次の行を変更します。#password_encryption = md5 # md5 or scram-sha-256
#password_encryption = md5 # md5 or scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
password_encryption = scram-sha-256
password_encryption = scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSL/TLS を使用するように PostgreSQL を設定します。
/var/lib/pgsql/data/postgresql.conf
ファイルで、次の行を変更します。#ssl = off
#ssl = off
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
ssl=on
ssl=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql
サービスを開始します。systemctl start postgresql.service
# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgres
という名前のシステムユーザーとしてログインします。su - postgres
# su - postgres
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgres
ユーザーとして PostgreSQL インタラクティブターミナルを起動します。psql -U postgres
$ psql -U postgres psql (13.7) Type "help" for help. postgres=#
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuser
という名前のユーザーを作成し、mydbuser
のパスワードを設定します。postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#
postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydatabase
という名前のデータベースを作成します。postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#
postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#
Copy to Clipboard Copied! Toggle word wrap Toggle overflow すべての権限を
mydbuser
ユーザーに付与します。postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#
postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インタラクティブターミナルからログアウトします。
postgres=# \q
postgres=# \q
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgres
ユーザーセッションからログアウトします。logout
$ logout
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/pg_hba.conf
ファイルの IPv4 ローカル接続で次の行を変更して、TLS を使用するクライアントからの接続のみを受け入れるように、すべてのデータベースへのアクセスを制限します。host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 ident
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
hostssl all all 127.0.0.1/32 scram-sha-256
hostssl all all 127.0.0.1/32 scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql
サービスを再起動して、変更を有効にします。systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuser
ユーザーとして PostgreSQL データベースに接続し、ホスト名とデータベース名を指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow