삶 가운데 남긴 기록 AACII.TISTORY.COM
postgresql14 사용자 원격 접속 설정 본문
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에서 접속이 가능해졌을 것입니다.
모두 접속 성공하셨기를 바랍니다.
'DEV&OPS > Database' 카테고리의 다른 글
postgresql 14 데이터베이스 백업 및 복원 (1) | 2024.01.16 |
---|---|
오라클 데이터베이스 19c 리눅스 백업 dump 및 복원 (2) | 2024.01.12 |
postgresql 14 스키마 생성 (3) | 2024.01.09 |
Postgresql 14 CentOS 7 설치 (0) | 2023.12.21 |
MySQL utf8 설정 (0) | 2022.12.29 |