私はFedora 36のリポジトリからpostgresqlとpgadminをインストールしました。初期のpostgresロールとデータベースを設定し、postgresユーザーとしてログインしました。
sudo su - postgres
psql
ここで暗号化されたパスワードを使用して新しいユーザーを設定しました。CREATE ROLE john WITH ENCRYPTED PASSWORD '123';
私も私の行に次の行を追加しましたpg_hba.conf
。
host all all 127.0.0.1/32 scram-sha-256
Unixでrootとして次を試みると、psql -U john -W -h 127.0.0.1
次のエラーが発生します。
psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: Ident authentication failed for user "john"
pgadminも同様のエラーメッセージでデータベースにログインできません。
ただし、入力してpg_hba.conf
この行を無効にすると、次のようになります。
host all all 127.0.0.1/32 ident
突然、pgadminからログインし、psql -U john -W -h 127.0.0.1
rootユーザーのコマンドを使用してログインできます。
私は何が間違っていましたか? ID認証が機能するには、なぜ完全に無効にする必要がありますか? psqlクライアントまたはpgadminによる認証に加えて、パスワード認証を強制する方法はありません。
編集 - これは私のpg_hba.confです:
local all all peer
#host all all 127.0.0.1/32 ident
host all all ::1/128 ident
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
host all all 127.0.0.1/32 scram-sha-256
これはデフォルトでリポジトリにpostgresに付属するデフォルトですが、次のようになります。
ident
1行にコメントを付ける- 最後の行を追加しました
答え1
すべてのipv4ローカル接続の既存のIDルール(127.0.0.1以降)
このルールが接続試行と一致すると、これが使用される認証の種類であり、認証が失敗してもファイルの下のルールは使用されません。
https://www.postgresql.org/docs/current/auth-pg-hba-conf.html
各レコードは、接続の種類、クライアントのIPアドレス範囲(接続の種類に関連する場合)、データベース名、ユーザー名、およびこれらのパラメータと一致する接続に使用される認証方法を指定します。接続タイプ、クライアントアドレス、要求されたデータベース、およびユーザー名が一致する最初のレコードが認証を実行するために使用されます。 「失敗」または「バックアップ」はありません。レコードが選択され、認証が失敗した場合、後続のレコードは考慮されません。
つまり、他のものを使用するクライアント接続に対してidentを無効にする必要があります。
あなたがやっていることは必ずしも間違っているわけではありませんが、おそらくrootユーザーに対してのみアクティブにしたいと思います。
一部のソフトウェアでそれを使用している場合は、::1 に一致する IPv6 ルールを作成することもできます。