Recent Posts
Recent Comments
Link
11-17 07:33
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

postgresql14 사용자 원격 접속 설정 본문

DEV&OPS/Database

postgresql14 사용자 원격 접속 설정

ALEPH.GEM 2024. 5. 8. 20:36

FATAL: Peer authentication failed for user "..."

1. 리눅스(CentOS)에서 postgresql 14를 설치

2. 리눅스의 유저이자 슈퍼 유저인 postgres 계정 생성 

3. psql이나 DBever등 툴 혹은 Web Application에서 접속

4. database는 postgres라는 이름으로 생성, 스키마, 권한, Role 설정

5. 일반 DBMS 유저(예: scott)를 생성하고 접속 시도 

위와 같은 상황에서

치명적오류: 사용자 "scott"의 password 인증을 실패했습니다.

혹은

치명적오류: 사용자 "scott"의 peer 인증에 실패했습니다.

postgresql 접속시도시 위와 같은 오류가 발생하는 상황에서의 대처했던 경험에 대해 포스팅하겠습니다.

유저 scott / 패스워드 tiger 를 생성하고 데이터베이스 설정, 스키마 설정, 권한 설정, Role 설정은 완료했다고 가정합니다.

 

pg_hba.conf 

해당 오류는 인터넷에서 검색하면 보통 pg_hba.conf 파일에서 METHOD 항목을 md5 나 trust로 편집하라고 나옵니다.

그런데 여기서는 pg_hba.conf 파일의 각각의 항목에 대해서 조금 자세하게 알아보겠습니다.

리눅스에서 postgresql 14를 설치했을 경우 /var/lib/pgsql/14/data 경로에 pg_hba.conf 파일이 존재합니다.

하지만 해당 파일이 어디 있는지 모를 경우 

find / -name "pg_hba.conf" 2>/dev/null

와같이 find 명령어를 통해서 파일의 위치를 알아낸 뒤에 vim으로 편집하시면 됩니다.

우선 파일의 내용을 살펴보겠습니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
host    all             all             0.0.0.0/0               md5
TYPE
local은 리눅스 접속용 유저 계정(예:postgres)으로 local로 접속하는 것을 의미합니다.
host는 TCP/IP를 통해서 database 유저로 접속하는 것을 의미합니다.
DATABASE
이 항목은 생성한 데이터베이스(예:postgres)를 직접 적어주어도 되고 위와같이 all으로 설정해도 됩니다.
USER
이 항목은 접속을 하기 위해 DBMS에서 생성한 USER를 직접 적어주면 됩니다.
all 으로 설정하면 모든 유저에 대한 설정이 됩니다.
ADDRESS
IP주소/MASK를 적어 주면 됩니다.
127.0.0.1/32는 localhost를 의미하며 0.0.0.0/0 은 모든 IP를 의미합니다.
::1/128은 IPV6의 localhost입니다.
METHOD
auth-method(인증방식)를 의미하는데 scram-sha-256이나 md5는 인증에 사용하는 해시 알고리즘을 말합니다.
peer 인증은 중간 단계 없이 직접 상호 간 인증을 수행하는 것입니다. 즉, 클라이언트 운영체제 사용자 이름을 커널로 획득하고 허용된 데이터베이스 사용자 이름으로 사용하여 인증 및 접속합니다. 이는 로컬 연결에만 지원합니다.

 

 

이를 바탕으로 접속 설정의 예들을 살펴보겠습니다.

local   all             postgres                                     peer

위 내용의 의미는 리눅스와 postgresql의 슈퍼 유저인 postgres 유저가 소유한 모든 데이터베이스에 대해서 로컬 접근을 허용하는 의미라고 할 수 있습니다.

이 설정은 리눅스 유저와 postgresql 유저가 같이 존재하고 있을 경우를 위한 접속 설정이라고 할 수 있습니다.

리눅스 터미널에서 su로 리눅스 유저를 바꾸어 "psql -U 유저 -d 데이터베이스" 명령어로 접속 시도해 보면 알 수 있습니다. 

리눅스에 있고 postgresql에 없는 유저이거나 리눅스에 없고 postgresql에 있는 유저이거나 하면 접속이 안되고 리눅스와 postgresql 둘다 같은 유저가 존재하고 local에서 psql으로 접속 시도할 때 접속을 위한 설정이라고 할 수 있습니다.

 

postgres 유저는 postgresql을 설치하는 과정에서 생성한다고 해도 모든 데이터베이스 사용자에 대해서 리눅스에 계정을 만들어줘야 하는 것은 아닙니다.

일반 사용자는 DBever 같은 DB툴을 사용해서 원격으로 접속을 해야 합니다. 

pg_hba.conf 파일에서

host    scott             postgres             192.168.0.160/0               trust

 

이렇게 설정하면 TCP/IP로 192.168.0.160에서 접속하는 scott 유저가 postgres라는 데이터베이스를 접근하는 것에 대한 인증을 허용하라는 의미가 됩니다. 

 

host    all             all             0.0.0.0/0               md5

만약 위처럼 설정되어 있다면 TCP/IP로 접속하는 모든 IP에 대하여 모든 유저와 모든 데이터베이스를 상대로 인증 방식(auth-method)을 md5으로 접속만을 허용한다는 의미가 됩니다.

auth-method에 대해서 잘 모르거나 문제가 발생하면 그냥 trust로 설정하고 접속 USER와 접속 IP주소를 특정해 주면 됩니다.

 

물론 pg_hba.conf 파일을 수정했다면 서비스를 재시작해야 적용됩니다.

sudo systemctl restart postgresql-14

 

pg_hba.conf 파일에  자신의 환경에 맞게 적절히  추가하거나 수정했다면 이제 해당 에러는 사라지고 DBTool이나 Web Application에서 접속이 가능해졌을 것입니다.

모두 접속 성공하셨기를 바랍니다.

 

 

 

 

728x90