はじめに
PostgreSQLのpostgresユーザのパスワードを忘れてしまったので、こちらを参考にパスワードを再設定しました。しかし、クライアント認証をtrust設定にしてもパスワードを聞かれ、ローカルループバック経由でログインできません。
その原因を解決し、ログインするまでをまとめます。
対象読者
- PostgresSQLのクライアント認証がtrust設定なのに、認証を要求またはアクセス拒否される人
環境
- PostgreSQL 10.12
- Windows 10
- ネットワークアダプタのインターネット プロトコル バージョン6は、チェックオフ
ハマった事象
変更前のpg_hba.confは以下になります。
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
IPv4ローカルループバックアドレス経由でアクセスするので、その認証設定をtrustに変更します。
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 md5
これでログインできると思ったら、パスワードを聞かれてログインできない!
C:\Users\xxxxx>psql -U postgres
ユーザー postgres のパスワード:
解決方法
IPv6ローカルループバックアドレスの認証設定をtrustに変更します。
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 trust
原因究明
ローカルからログインできるようになりましたが、原因が気になったので調べてみました。
原因は、IPv4のローカルループバックアドレス経由でアクセスしていると思っていたら、IPv6のローカルループバックアドレス経由でアクセスしていたことでした。
IPv4、IPv6どちらか確認するには、localhostに対してpingを実行します。こちらを参考にしました。
IPv6をIPv4より優先する環境で実行すると、以下のようになります。
C:\>ping localhost
ARC09 [::1]に ping を送信しています 32 バイトのデータ:
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
どうしてIPv6のローカルループバックアドレスにアクセスするの?
ネットワークアダプタのIPv6をチェックオフにしても、IPv6が完全に無効になるわけではない。また、IPv6の優先度がIPv4のそれより高く設定されていることのようです。
こちらが、非常に参考になりました。
最後に
IPv4、IPv6に気を付けないと、別のミドルウェアのクライアント認証でもハマるかもしれない。
緩めた認証は、必要がなくなったら締めなおしましょう!
最後までお読みいただきありがとうございます。何かのお役に立てたら幸いです。