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 opensslCopy 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.keyCopy 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-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/postgresql.confファイルの次の行を変更して、SSL/TLS を使用するように PostgreSQL を設定します。#ssl = off
#ssl = offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
ssl=on
ssl=onCopy 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 identCopy 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-256Copy 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-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydatabase をデータベース名に、mydbuser をユーザー名に置き換えます。
postgresqlサービスを再起動して、変更を有効にします。systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy 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 myapplicationCopy 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-serverCopy 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.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow OpenSSL ライブラリーをインストールします。
dnf install openssl
# dnf install opensslCopy 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.keyCopy 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-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSL/TLS を使用するように PostgreSQL を設定します。
/var/lib/pgsql/data/postgresql.confファイルで、次の行を変更します。#ssl = off
#ssl = offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新後は次のようになります。
ssl=on
ssl=onCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを開始します。systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresという名前のシステムユーザーとしてログインします。su - postgres
# su - postgresCopy 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=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresユーザーセッションからログアウトします。logout
$ logoutCopy 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 identCopy 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-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを再起動して、変更を有効にします。systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuserユーザーとして PostgreSQL データベースに接続し、ホスト名とデータベース名を指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow