ID 인증을 비활성화할 때까지 postgresql에서 비밀번호 기반 인증이 작동하지 않는 이유는 무엇입니까?

ID 인증을 비활성화할 때까지 postgresql에서 비밀번호 기반 인증이 작동하지 않는 이유는 무엇입니까?

방금 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에서 루트로 다음을 시도하면 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루트 사용자의 명령을 사용하여 로그인할 수 있습니다.

내가 뭐 잘못 했어요? 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

모든 ipv4 로컬 연결에 대한 기존 ID 규칙(127.0.0.1부터)

이 규칙이 연결 시도와 일치하면 이것이 사용되는 인증 유형이며, 인증이 실패하더라도 파일 아래의 규칙은 사용되지 않습니다.

https://www.postgresql.org/docs/current/auth-pg-hba-conf.html

각 레코드는 연결 유형, 클라이언트 IP 주소 범위(연결 유형과 관련된 경우), 데이터베이스 이름, 사용자 이름 및 이러한 매개변수와 일치하는 연결에 사용되는 인증 방법을 지정합니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름이 일치하는 첫 번째 레코드가 인증을 수행하는 데 사용됩니다. "실패" 또는 "백업"은 없습니다. 레코드가 선택되고 인증이 실패하면 후속 레코드는 고려되지 않습니다.

즉, 다른 것을 사용하려는 클라이언트 연결에 대해 ident를 비활성화해야 합니다.

당신이 하고 있는 일이 반드시 잘못된 것은 아니지만 아마도 루트 사용자에 대해서만 활성화하고 싶을 것입니다.

일부 소프트웨어에서 이를 사용하는 경우 ::1에 대해 일치하는 IPv6 규칙을 생성할 수도 있습니다.

관련 정보