■ はじめに
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
# 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"でヘルプを表示します。
補足:プログラムからの接続
以下の関連記事を参照のこと
Python で PostgreSQL を使う ~ 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
Python で PostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029