개요
PostgreSQL은 설치 후에 DB에 접속할 때 MySQL등 다른 DB와 달리 [OS와 PostgreSQL 양쪽에 동일한 계정을 생성]하거나 [인증관련 환경설정 파일을 수정]해야 접속할 수 있는데 이 두가지 방법을 Ubuntu에서 적용하는 과정을 정리해보겠습니다.
테스트 환경
- Ubuntu 20.04
- PostgreSQL 13.8
설치
기본 배포 버전으로 테스트할 수도 있지만, 여기서는 PostgreSQL 13을 설치해보겠습니다.
리포지토리 설정 파일 생성
[PostgreSQL 13] 설치 정보가 담겨 있는 리포지토리 설정 파일을 생성합니다.
~# sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
PostgreSQL 설치
[PostgreSQL 13]을 설치합니다.
~# apt-get update
~# apt-get -y install postgresql-13
PostgreSQL 시작
~# systemctl enable postgresql
~# systemctl start postgresql
~# systemctl status postgresql
DB 접속
기본 마스터 계정인 [postgres]로 [PostgreSQL]에 접속합니다.
~# sudo -i -u postgres
~$ 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
~$ exit
접속 시도 - 인증 오류
위에서 생성한 계정으로 접속을 시도해보면, 아래와 같이 인증 오류가 발생합니다.
다음 단계에서는 이 인증 오류를 해결하는 방법 2가지를 확인해보겠습니다.
~# psql -U testuser -d testdb
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "testuser"
인증 오류 해결
인증 문제를 해결하고 [PostgreSQL]에 접속하는 방법은 크게 2가지가 있는데 한가지씩 확인해보겠습니다.
방법1 - 동일한 계정 생성
우선, 처음에 DB 생성 후에 추가했던 [PostgreSQL] 유저 계정과 동일한 계정을 OS 사용자에도 추가하는 방법입니다.
아래와 같이 DB 유저와 동일한 [testuser] 계정을 생성하겠습니다.
~# adduser testuser
- DB 접속
새로 생성한 [testuser] 계정으로 전환한 후에 접속을 해보면 문제 없이 접속되는 것을 확인할 수 있습니다.
~# sudo -i -u testuser
~$ psql -U testuser -d testdb
방법2 - 인증 설정 파일 수정
다음으로 인증 관련 설정 파일인 [pg_hba.conf] 파일을 수정해서 접속하는 방법을 확인해보겠습니다.
[pg_hba.conf] 파일을 열어보면 아래와 같이 DB 접근 설정 항목들이 있는데 [local]과 IPv4용 [host]의 METHOD 항목을 보시면 각각 [peer]과 [md5]으로 설정되어 있는 것을 확인할 수 있습니다.
이 항목을 [md5]로 수정합니다.
~# vi /etc/postgresql/13/main/pg_hba.conf
- 수정 전
- 수정 후
- DB 재시작 후 접속
설정 파일을 수정했으면 [PostgreSQL]을 재시작하고 다시 접속해봅니다.
이번에는 문제 없이 패스워드를 입력하고 접속 가능한 것을 확인할 수 있습니다.
~# systemctl restart postgresql
~# psql -U testuser -d testdb
기본 배포 버전 설치
[PostgreSQL 13] 버전이 아닌 기본 배포 버전을 설치하려면 아래와 같은 방법으로 설치를 하면 됩니다.
2022년 10월 16일 기준 기본 배포 버전은 [12.8]입니다.
나머지 인증 방법은 위에서 설명한 내용과 동일합니다.
~# apt-get update
~# apt-get -y install postgresql
~# systemctl enable postgresql
~# systemctl start postgresql
~# systemctl status postgresql
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 파일 옵션 안내