PostgreSQL | PostgreSQL 설정 파일 | pg_hba.conf 파일 설정 방법


pg_hba.conf 파일은 PostgreSQL에 접속하는 클라이언트에 대한 인증 설정을 설명하는 파일이다. 여기에서는 pg_hba.conf 파일의 설정 방법에 대해 설명한다.

pg_hba.conf 파일 위치

pg_hba.conf는 postgresql.conf와 마찬가지로 기본적으로 PostgreSQL을 설치한 data 디렉토리에 저장되어 있다.

C:\Program Files\PostgreSQL\12\data>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\Program Files\PostgreSQL\12\data 디렉터리

2020-07-08  오전 12:00    <DIR>          .
2020-07-08  오전 12:00    <DIR>          ..
2020-07-08  오전 12:28    <DIR>          base
2020-07-08  오전 12:00                45 current_logfiles
2020-07-08  오전 12:20    <DIR>          global
2020-07-08  오전 12:00    <DIR>          log
2020-03-10  오전 12:24    <DIR>          pg_commit_ts
2020-03-10  오전 12:24    <DIR>          pg_dynshmem
2020-03-10  오전 12:24             4,156 pg_hba.conf <------------- 여기 저장되어 있다.
2020-03-10  오전 12:24             1,678 pg_ident.conf
2020-07-08  오전 12:38    <DIR>          pg_logical
2020-03-10  오전 12:24    <DIR>          pg_multixact
2020-07-07  오후 11:20    <DIR>          pg_notify
2020-03-10  오전 12:24    <DIR>          pg_replslot
2020-03-10  오전 12:24    <DIR>          pg_serial
2020-03-10  오전 12:24    <DIR>          pg_snapshots
2020-07-07  오후 11:20    <DIR>          pg_stat
2020-07-08  오후 11:35    <DIR>          pg_stat_tmp
2020-03-10  오전 12:24    <DIR>          pg_subtrans
2020-03-10  오전 12:24    <DIR>          pg_tblspc
2020-03-10  오전 12:24    <DIR>          pg_twophase
2020-03-10  오전 12:24                 3 PG_VERSION
2020-03-10  오전 12:24    <DIR>          pg_wal
2020-03-10  오전 12:24    <DIR>          pg_xact
2020-03-10  오전 12:24                90 postgresql.auto.conf
2020-03-10  오전 12:24            27,377 postgresql.conf
2020-07-07  오후 11:20                91 postmaster.opts
2020-07-07  오후 11:20                70 postmaster.pid
               8개 파일              33,510 바이트
              20개 디렉터리  424,537,530,368 바이트 남음

C:\Program Files\PostgreSQL\12\data>

pg_hba.conf 파일은 텍스트 파일으로 되어 있어, 내용을 확인하거나 편집하려면 텍스트 편집기에서 파일을 열 수 있다.

# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# Refer to the "Client Authentication" section in the PostgreSQL
# documentation for a complete description of this file.  A short
# synopsis follows.
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access.  Records take one of these forms:
#
# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
#
# (The uppercase items must be replaced by actual values.)
#
# The first field is the connection type: "local" is a Unix-domain
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
# plain TCP/IP socket.
#
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, or a comma-separated list thereof. The "all"

... 이하 생략 ...

pg_hba.conf 설정

pg_hba.conf 파일은 클라이언트의 주소와 역할 이름을 지정하고 모든 데이터베이스에 연결을 허용할지 여부를 설정하는데 사용한다. 현재 pg_hba.conf에 설정되어 있는 내용을 확인하면 다음과 같다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

한 줄에 하나의 설정으로 되어 있다. 예를 들어, 다음 설정에는 클라이언트의 IP 주소가 127.0.0.1/32의 모든 역할에 대해 복제(replication)를 제외한 모든 데이터베이스에 인증 방식 md5를 사용하여 연결을 허용한다는 의미이다.

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

127.0.0.1/32하는 것은 로컬 루프백 주소라고 하는 주소에서 자신을 나타내는 IP 주소이다. 이 경우에는 PostgreSQL가 실행중인 서버의 IP 주소이다. localhost도 같은 의미로 사용된다. 또한 IPv6의 로컬 루프백 주소 :: 1/128이다.

그러면 설정하는 항목에 대해 하나 하나 살펴 보겠다.

각 설정은 다음 형식 중 하나이다.

local      DATABASE  USER  METHOD  [OPTIONS]
host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

TYPE은 local, host, hostssl, hostnossl 중 하나를 설정한다. local은 Unix 도메인 소켓을 사용하는 경우에 사용되는 것으로, 이번에는 Windows 환경이므로 사용하지 않는다. host, hostssl, hostnossl는 모두 TCP / IP를 사용하여 연결하는 경우에 사용하고 host를 지정한 경우 SSL 또는 비 SSL로 연결, hostssl를 사용하면 SSL로 연결, hostnossl 비 SSL로의 연결을 허용한다.

DATABASE에 연결할 수 있는 데이터베이스 이름을 지정한다. 복수 지정하는 경우는 쉼표 (,)로 구분하여 작성한다. 또한 특수한 값으로 all을 지정했을 경우는 복제(replication)를 제외한 모든 데이터베이스를 의미하고 sameuser를 지정한 경우는 사용자 이름과 동일한 이름의 데이터베이스를 의미한다. 또한 samerole을 지정한 경우 연결하는 사용자가 연결하는 데이터베이스와 동일한 이름의 역할의 구성원이어야 한다. 다른 파일에 데이터베이스 이름의 목록을 작성하는 경우 @파일 이름 형식으로 지정할 수도 있다.

USER에 연결할 수 있는 역할 이름을 지정한다. 복수 지정하는 경우는 쉼표(,)로 구분하여 작성한다. 또한 특수한 값 all을 지정하면 모든 역할을 의미한다. 또한 역할 이름 앞에 +를 붙이면 그룹으로 사용되고 있는 역할 이름을 의미한다. 이 경우 이 그룹으로 역할의 구성원이 역할에 연결이 허용된다. 다른 파일에 역할 이름의 목록을 작성하는 경우 @파일 이름 형식으로 지정할 수도 있다.

ADDRESS에 연결할 수 있는 호스트 이름 또는 IP 주소 범위를 지정한다. IP 주소는 IPv4에서 지정하는 경우 172.20.143.0/24와 같은 형식으로 IPv6를 지정하는 경우는fe80::7a31:c1ff:0000:0000/96와 같은 형식으로 지정한다. 그리고 특수한 값 all을 지정하면 모든 IP 주소를 의미하고 samehost로 지정한 경우는 PostgreSQL가 실행중인 서버와 동일한 IP 주소를 의미한다. samenet로 지정한 경우는 서버와 동일한 네트워크를 의미한다.

ADDRESS에서 호스트 이름을 지정하는 경우는 blog.devkuma.com처럼 별도의 호스트 이름을 지정한다. 그리고 .devkuma.com과 같이 지정한 경우 devkuma.com의 모든 호스트 (blog.example.com 등)을 의미한다.

METHOD에는 인증 방법을 지정한다. 설정 값과 인증 방식은 다음을 참조한다.

설정값 설명
trust 모든 역할 이름에 암호없이 연결 가능
reject 연결을 거부
scram-sha-256 암호 인증 가장 안전하지만 일부 클라이언트에서 지원되지 않음
md5 암호 인증
password 암호 인증 암호를 평문으로 전송
gss GSSAPI를 이용한 싱글 사인온
sspi SSPI를 이용한 싱글 사인온
ident Ident 인증
peer Peer 인증
ldap LDAP 인증
radius RADIUS 인증
cert SSL 클라이언트 인증서를 사용한 인증
pam PAM 인증
bsd BSD 인증

예를 들어 192.168.1.0/24 네트워크에서 데이터베이스 mydb에 대한 연결을 사용자 devkuma에 대해 인증 방식 md5에서 허용하는 경우는 다음과 같이 작성한다.

host mydb devkuma 192.168.1.0/24 md5

그리고 pg_hba.conf 파일에서의 설정 내용에 관계없이 postgresql.conf 파일의 listen_addresses 매개 변수로 클라이언트의 IP 주소 또는 호스트가 PostgreSQL에 접속을 허용하지 않으면 연결할 수 없다. “postgresql.conf 설정"을 참조한다.

그러면 시습을 해보자. 현재 클라이언트의 IP 주소가 서버와 동일한 IP 주소 상황에서 postgres 역할에 대해 mydb 데이터베이스에 대한 액세스를 허용해 본다. pg_hba.conf에서 설정되어 기존 내용은 주석으로 처리하고 다음 줄을 추가하였다. 설정 파일의 저장이 끝나면 일단 PostgreSQL을 다시 시작한다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
# host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
# host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
# host    replication     all             127.0.0.1/32            md5
# host    replication     all             ::1/128                 md5

host    mydb            postgres        ::1/128            md5

먼저 연결을 허용하는 설정했던 mydb 데이터베이스에 연결을 해본다. 명령 프롬프트를 시작하고 다음과 같이 실행한다.

psql -U postgres -d mydb

사용자 암호 입력하도록 나오고, postgres 역할의 암호를 입력하면 연결이 된다.

C:\>psql -U postgres -d mydb
postgres 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

mydb=# 

일단 PostgreSQL 접속을 종료하고, 이번에는 postgres 데이터베이스에 연결을 시도하기 위해 다음과 같이 실행한다.

psql -U postgres -d postgres

다음과 같은 오류가 표시되어 연결에 실패한다.

C:\>psql -U postgres -d postgres
psql: 오류: 서버 접속 실패: 치명적오류:  호스트 "::1", 사용자 "postgres", 데이터베이스 "postgres", SSL 중지 연결에 대한 설정이 pg_hba.conf 파일에 없습니다.

C:\>

따라서 pg_hba.conf 파일에서 연결을 허용하여 데이터베이스에 연결이 가능하지만, 허가를 하지 않은 데이터베이스에 연결하려고 하면 오류가 발생한다.

pg_hba.conf의 설정 방법에 대해 설명하였다.