【PostgreSQL】PostgreSQL の SSL通信に関する あれこれ

■ はじめに

PostgreSQL の SSL通信に関して調べてみた

目次

【1】 SSL確認方法
【2】 SSL設定手順
【3】 SSL 攻撃 と SSLモード

【1】 SSL確認方法

その1) psql ログイン時
その2) sslinfo を有効にして「select ssl_is_used()」を実行する
その3) postgresql.conf の 「ssl = on/off」

その1) psql ログイン時

psql ログイン成功時に「SSL connection ...」ってなっていたらSSL接続可能。

$ psql -h 192.xxx.xxx.xxx -U postgres -d your_db
psql (12.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

その2) sslinfo を有効にして「select ssl_is_used()」を実行する

その2)は、自分のローカル環境のみで行ったほうがいい

コマンド例

# エクステンションを有効化
dbname=> create extension sslinfo;
CREATE EXTENSION

# SSL 接続ステータスを調べる
dbname=> select ssl_is_used();
 ssl_is_used
-------------
 f <= 有効になっていない

# SSL 暗号を調べる
dbname=> select ssl_cipher();

その3) postgresql.conf の 「ssl = on/off」

Windows でかつ、デフォルトでインストールした場合、
「C:\Program Files\PostgreSQL\12\data\postgresql.conf」を確認。
「ssl = on」ならSSLが有効になっている

【2】 SSL設定手順

http://shinsuke789.hatenablog.jp/entry/2017/10/17/100000

がめちゃくちゃ参考になった。

1)SSL証明書を用意
2)postgresql.conf を修正
3)pg_hba.conf ファイルを修正
4)PostgreSQLを再起動

1)SSL証明書を用意

今回は、自己証明書(オレオレ証明書)で行う

https://www.postgresql.jp/document/9.4/html/ssl-tcp.html

OpenSSLを使用する。
OpenSSLの設定については、以下の関連記事を参照。

https://dk521123.hatenablog.com/entry/2013/12/07/103903
A)PostgreSQLのdataディレクトリに移動する

cd C:\Program Files\PostgreSQL\12\data

B)OpenSSLでRSA秘密鍵を作成する

# 2048はビット数
openssl genrsa 2048 > server.key

C)OpenSSLでCSR(Certificate Signing Request)を作成する

openssl req -new -key server.key > server.csr

D)OpenSSLで証明書を作成する

# 36500は有効期限(この場合100年)
openssl x509 -days 36500 -req -signkey server.key < server.csr > server.crt 

2)postgresql.conf を修正

 Windows の場合、
「C:\Program Files\PostgreSQL\12\data\postgresql.conf」で
を追加する
~~~
ssl=on
~~~

3)pg_hba.conf ファイルを修正

 Windows の場合、
「C:\Program Files\PostgreSQL\12\data\pg_hba.conf」で
を修正する
~~~
【修正前】
host    all             all             127.0.0.1/32            md5

【修正後】
hostssl     all             all             127.0.0.1/32            md5
hostssl     all             all             0.0.0.0/0                  md5
~~~

4)PostgreSQLを再起動

Windows の場合、サービスからPostgreSQLを再起動する
また、上記の「SSL確認方法」の「その1) psql ログイン時」で確認する

psql -h localhost -d your_db -U postgres
psql (12.1)
SSL 接続 (プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、ビット長: 256、圧縮: オフ)
"help"でヘルプを表示します。

補足:プログラムからの接続

以下の関連記事を参照のこと

PythonPostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029

【3】 SSL 攻撃 と SSLモード

https://www.postgresql.jp/document/9.0/html/libpq-ssl.html

より抜粋

SSL攻撃

1)盗聴

* クライアント・サーバ間のネットワークトラフィックを第三者が読み取る

2)中間者攻撃(MITM)

* クライアント・サーバ間で渡されている時に、第三者がそのデータを変更
 SSLはクライアントに対しサーバを認証することで、この防止に証明書検証を使用

3)成りすまし攻撃

* 第三者が認定されたクライアントを装う
 この防止策としてクライアント証明書を使用

SSLモード

# sslmode 盗聴防止 MITM防止 説明
1 disabled No No セキュリティはどうでもよく、暗号化の負荷を払いたくない
2 allow Maybe No セキュリティはどうでもよいが、サーバがそれを強く要求するのであれば暗号化の負荷を払ってもよい
3 prefer Maybe No セキュリティはどうでもよいが、サーバがそれをサポートするのであれば暗号化の負荷を払ってもよい
4 require Yes No データを暗号化して欲しい。そして負荷も受け入れる。サーバに接続する必要時に常にネットワークが確認してくれることを信用する
5 verify-ca Yes CAの規定に依存 データを暗号化して欲しい。そして負荷も受け入れる。信頼するサーバに確実に接続したい
6 verify-full Yes Yes データを暗号化して欲しい。そして負荷も受け入れる。信頼するサーバに接続すること、そのサーバが指定したものであることを確実にしたい

参考文献

https://dev.classmethod.jp/articles/ssl-connection-to-amazon-rds-postgresql/

関連記事

Windows上での Opensslの設定と自己証明書作成
https://dk521123.hatenablog.com/entry/2013/12/07/103903
PythonPostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029