개요
PostgreSQL은 설치 후에 DB에 접속할 때 MySQL등 다른 DB와 달리 [OS와 PostgreSQL 양쪽에 동일한 계정을 생성]하거나 [인증관련 환경설정 파일을 수정]해야 접속할 수 있는데 이 두가지 방법을 CentOS에서 적용하는 과정을 정리해보겠습니다.
테스트 환경
- CentOS 7.8
- PostgreSQL 13.8
설치
기본 배포 버전으로 테스트할 수도 있지만, 여기서는 PostgreSQL 13을 설치해보겠습니다.
리포지토리 설치
[PostgreSQL 13] 설치 정보가 담겨 있는 리포지토리 RPM을 설치합니다.
~# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

PostgreSQL 설치
[PostgreSQL 13]을 설치합니다.
~# yum install -y postgresql13-server

기본 DB 생성
[initdb] 명령으로 기본 DB를 생성하고 올바르게 생성되었는지 로그를 확인해보겠습니다.
~# cd /usr/pgsql-13/bin/
~# postgresql-13-setup initdb
~# cat /var/lib/pgsql/13/initdb.log

PostgreSQL 시작
~# systemctl enable postgresql-13
~# systemctl start postgresql-13
~# systemctl status postgresql-13

DB 접속
기본 마스터 계정인 [postgres]로 [PostgreSQL]에 접속합니다.
~# su postgres
bash$ psql

유저 생성
테스트용 계정 [testuser]를 생성하고 [\du] 명령으로 생성된 유저를 확인합니다.
postgres=# create user testuser password 'test123$' superuser;
postgres=# \du

DB 생성 및 소유자 지정
테스트용 DB를 생성하고 소유자를 지정한 후에 [\l] 명령으로 생성된 DB를 확인합니다.
postgres=# create database testdb owner testuser;
postgres=# \l
postgres=# \q
bash$

접속 시도 - 인증 오류
위에서 생성한 계정으로 접속을 시도해보면, 아래와 같이 인증 오류가 발생합니다.
다음 단계에서는 이 인증 오류를 해결하는 방법 2가지를 확인해보겠습니다.
~# psql -U testuser -d testdb
psql: error: FATAl: Peer authentication failed for user "testuser"

인증 오류 해결
인증 문제를 해결하고 [PostgreSQL]에 접속하는 방법은 크게 2가지가 있는데 한가지씩 확인해보겠습니다.
방법1 - 동일한 계정 생성
우선, 처음에 DB 생성 후에 추가했던 [PostgreSQL] 유저 계정과 동일한 계정을 OS 사용자에도 추가하는 방법입니다.
아래와 같이 DB 유저와 동일한 [testuser] 계정을 생성하겠습니다.
~# adduser testuser
~# passwd testuser

- DB 접속
새로 생성한 [testuser] 계정으로 전환한 후에 접속을 해보면 문제 없이 접속되는 것을 확인할 수 있습니다.
~# su testuser
~$ psql -U testuser -d testdb

방법2 - 인증 설정 파일 수정
다음으로 인증 관련 설정 파일인 [pg_hba.conf] 파일을 수정해서 접속하는 방법을 확인해보겠습니다.
[pg_hba.conf] 파일을 열어보면 아래와 같이 DB 접근 설정 항목들이 있는데 [local]과 IPv4용 [host]의 METHOD 항목을 보시면 각각 [peer]과 [scram-sha-256]으로 설정되어 있는 것을 확인할 수 있습니다.
이 항목을 [scram-sha-256] 또는 [md5]로 수정합니다.
~# vi /var/lib/pgsql/13/data/pg_hba.conf
- 수정 전

- 수정 후

- DB 재시작 후 접속
설정 파일을 수정했으면 [PostgreSQL]을 재시작하고 다시 접속해봅니다.
이번에는 문제 없이 패스워드를 입력하고 접속 가능한 것을 확인할 수 있습니다.
~# systemctl restart postgresql-13
~# psql -U testuser -d testdb

기본 배포 버전 설치
[PostgreSQL 13] 버전이 아닌 기본 배포 버전을 설치하려면 아래와 같은 방법으로 설치를 하면 됩니다.
나머지 인증 방법은 위에서 설명한 내용과 동일합니다.
~# yum install postgresql-server
~# cd /usr/bin/
~# postgresql-setup --initdb
~# systemctl enable postgresql
~# systemctl start postgresql
~# systemctl status postgresql
OS별 배포 버전
2022년 10월 05일 기준 Red Hat family OS별로 설치되는 배포 버전은 다음과 같습니다.
- RHEL / Rocky Linux 9 : 13
- RHEL / Rocky Linux / OL 8 : 13, 12, 10 and 9.6 via modules
- RHEL / CentOS / SL / OL 7 : 9.2
- RHEL / CentOS / SL / OL 6 : 8.4
- Fedora 36 : 14
- Fedora 35 : 13
pg_hba.conf 파일 Method 옵션
[pg_hba.conf] 설정 파일의 Method 옵션 리스트는 아래와 같습니다.
-
trust: 무조건 접속을 허용합니다. 이 방법을 사용하면 PostgreSQL 데이터베이스 서버에 연결할 수 있는 모든 사람이 암호나 다른 인증 없이 원하는 PostgreSQL 사용자로 로그인할 수 있습니다.
-
reject: 무조건 연결을 거부합니다. 이것은 그룹에서 특정 호스트 를 “ 필터링 “reject 하는 데 유용합니다. 예를 들어 한 라인은 특정 호스트의 연결을 차단할 수 있고 나중 라인은 특정 네트워크의 나머지 호스트가 연결할 수 있도록 합니다.
-
scram-sha-256: SCRAM-SHA-256 인증을 수행해 사용자의 암호를 확인합니다.
-
md5: SCRAM-SHA-256 또는 MD5 인증을 수행해 사용자의 암호를 확인합니다.
-
password: 클라이언트가 인증을 위해 암호화되지 않은 암호를 제공하도록 요구합니다. 암호는 네트워크를 통해 일반 텍스트로 전송되기 때문에 신뢰할 수 없는 네트워크에서는 사용해서는 안 됩니다.
-
gss: GSSAPI를 사용해 사용자를 인증합니다. 이것은 TCP/IP 연결에만 사용할 수 있습니다. GSSAPI 암호화와 함께 사용할 수 있습니다.
-
sspi: SSPI를 사용해 사용자를 인증합니다. 이것은 Windows에서만 사용할 수 있습니다.
-
ident: 클라이언트의 ident 서버에 연결하여 클라이언트의 운영 체제 사용자 이름을 얻고 요청한 데이터베이스 사용자 이름과 일치하는지 확인합니다. ID 인증은 TCP/IP 연결에서만 사용할 수 있습니다. 로컬 연결에 대해 지정된 경우 피어 인증이 대신 사용됩니다.
-
peer: 운영 체제에서 클라이언트의 운영 체제 사용자 이름을 가져와서 요청한 데이터베이스 사용자 이름과 일치하는지 확인합니다. 이것은 로컬 연결에만 사용할 수 있습니다.
-
lda: LDAP 서버를 사용해 인증 합니다.
-
radius: RADIUS 서버를 사용해 인증합니다.
-
cert: SSL 클라이언트 인증서를 사용해 인증합니다.
-
pam: 운영 체제에서 제공하는 PAM(Pluggable Authentication Modules) 서비스를 사용해 인증합니다.
-
bsd: 운영 체제에서 제공하는 BSD 인증 서비스를 사용해 인증합니다.
참고 URL
- PostgreSQL OS별 다운로드 안내
- PostgreSQL pg_hba.conf 파일 옵션 안내