-h localhost
と言うとPostgresは接続を受け入れませんが、-h 127.0.0.1
と言うと機能します
[root@5d9ca0effd7f opensips]# psql -U postgres -h localhost -W
Password for user postgres:
psql: FATAL: Ident authentication failed for user "postgres"
[root@5d9ca0effd7f opensips]# psql -U postgres -h 127.0.0.1 -W
Password for user postgres:
psql (8.4.20)
Type "help" for help.
postgres=#
私の/var/lib/pgsql/data/pg_hba.conf
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
local all all ident
# IPv4 local connections:
Host all all 127.0.0.1/32 trust
Host all all 127.0.0.1/32 ident
# IPv6 local connections:
Host all all ::1/128 ident
次の行を追加すると、Postgresサービスfailed
が開始されます。
Host all all localhost ident
Host all all localhost trust
何が問題なのですか?
私の/etc/hosts
ファイル:
[root@5d9ca0effd7f opensips]# cat /etc/hosts
172.17.0.2 5d9ca0effd7f
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Pg_hba.confでは、最初の一致がカウントされます。 ドキュメントごと:
接続タイプ、クライアントアドレス、要求されたデータベース、およびユーザー名が一致する最初のレコードは、認証を実行するために使用されます。 「フォールスルー」または「バックアップ」はありません。1つのレコードが選択され、認証が失敗した場合、後続のレコードは考慮されません。一致するレコードがない場合、アクセスは拒否されます。
逆順に注意してください:
Host all all 127.0.0.1/32 trust
Host all all 127.0.0.1/32 ident
だが:
Host all all localhost ident
Host all all localhost trust
さて、あなたが書いたようにあなたが本当に行を「追加」するならば、何の効果もないはずです。しかし、行を置換すると、あります。
最初のケースでは、オープンドアポリシーであるtrust
認証メソッドを取得します。 ドキュメントごと:
PostgreSQLは、サーバーに接続できるすべてのユーザーが、指定したデータベースユーザー名(スーパーユーザー名も含む)でデータベースにアクセスすることを許可されていることを前提としています。
ただし、2番目のケースでは、 ident
認証メソッド を取得します。これを機能させるには、適切に設定する必要があります。
実際に古いバージョン8.4を使用している場合は、 8.4の古いマニュアル に進んでください。 8.4は2014年にEOLに達しました そしてもうサポートされていないことをご存知ですか?現在のバージョンへのアップグレードを検討してください。
もっと:
Postgresは-h localhost
を指定するときにIPv6を使用する可能性があります。上記のpg_hba.conf
がident
を指定すると、パスワードプロンプトが返されます。
ただし、-h 127.0.0.1
が指定されている場合、PostgresはIPv4を使用するように強制されます。これは、上記の構成でtrust
に設定され、パスワードなしでアクセスできます。
したがって、答えは、pg_hba.conf
のIPv6ホスト行を変更してtrust
を使用することです。
# IPv6 local connections:
Host all all ::1/128 trust
構成を変更した後、Postgresサービスを再起動することを忘れないでください。