19.1. The pg_hba.conf 파일

클라이언트 인증은 전통적으로 이름이 pg_hba.conf이고 데이터베이스 클러스터의 데이터 디렉토리에 저장되는 환경 설정 파일로 제어된다. (HBA는 호스트 기반 인증(host-based authentication)의 약어이다.) 기본 pg_hba.conf 파일은 데이터 디렉토리가 initdb에 의해 초기화될 때 설치된다. 인증 환경 설정 파일을 다른 곳에 배치하는 것도 가능하다. hba_file 환경 설정 파일을 참조 바란다.

pg_hba.conf 파일의 일반 형식은 한 줄당 하나씩 있는 레코드 세트이다. 빈 줄은 무시된다. # 주석 문자 뒤의 텍스트도 무시된다. 레코드는 줄을 바꿔서 이어질 수 없다. 레코드는 여러 개의 필드로 구성되며, 공백 및/또는 탭으로 구분된다. 필드 값에 큰 따옴표를 사용하면 필드에 공백을 포함할 수 있다. 데이터베이스, 사용자 또는 주소 필드의 키워드에 따옴표를 사용하면(예: all 또는 replication) 단어는 자체의 특수한 의미를 상실하고 해당 이름의 데이터베이스, 사용자 또는 호스트와 동일하게 된다.

각 레코드는 이러한 매개 변수와 일치하는 연결에 사용되는 연결 유형, 클라이언트 IP 주소 범위(연결 유형에 해당하는 경우), 데이터베이스 이름, 사용자 이름 및 인증 방법을 지정한다. 연결 타입, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름이 일치하는 첫 번째 레코드는 인증을 수행할 때 사용된다. "제어 이동(fall-through)" 또는 "백업"은 없다. 레코드 하나가 선택되고 인증이 실패한 경우 후속 레코드는 고려되지 않는다. 일치하는 레코드가 없으면 액세스가 거부된다.

레코드는 다음 7가지 형식 중 하나이다.

local      database  user  auth-method  [auth-options]
host       database  user  address  auth-method  [auth-options]
hostssl    database  user  address  auth-method  [auth-options]
hostnossl  database  user  address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]

필드의 의미는 다음과 같다.

local

이 레코드는 Unix 도메인 소켓을 사용한 연결 시도와 일치한다. 이러한 유형의 레코드 없이 Unix 도메인 소켓 연결은 불가능 하다.

host

이 레코드는 TCP/IP를 사용한 연결 시도와 일치한다. host 레코드는 SSL 연결 시도 혹은 비 SSL 연결 시도와 일치한다.

참고: 기본 동작이 로컬 루프백 주소 localhost에 대해서만 TCP/IP 연결을 listen하는 것이므로 listen_addresses 환경 설정 매개변수에 적절한 값으로 서버가 시작되지 않으면 원격 TCP/IP 연결이 불가능하다.

hostssl

이 레코드는 TCP/IP를 사용한 연결 시도와 일치하지만, SSL 암호화를 사용한 연결에만 해당된다.

이 옵션을 사용하려면 서버는 SSL 지원이 내장되어 있어야 한다. 또한 SSLssl 환경 설정 매개 변수를 설정함으로써 서버 시작 시에 활성화되어야 한다(자세한 내용은 17.9절 참조).

hostnossl

이 레코드 유형은 hostssl과는 반대로 동작한다. SSL을 사용하지 않는 TCP/IP 상의 연결 시도에 대해서만 일치한다.

database

이 레코드가 일치하는 데이터베이스 이름을 지정한다. all 값은 모든 데이터베이스와 일치하도록 지정한다. sameuser 값은 요청된 데이터베이스가 요청된 사용자와 이름이 동일한 경우에 레코드가 일치하도록 지정한다. samerole 값은 요청된 사용자가 요청된 데이터베이스와 이름이 동일한 role의 멤버여야 하는지 지정한다. (samegroup은 폐지되었지만 samerole은 계속 쓸 수 있다.) 수퍼유저는 직간접적으로 role의 명시적인 멤버가 아닐 경우, 단지 수퍼유저라는 이유로 samerole에 대한 role의 멤버로 간주되지 않는다. replication 값은 복제 연결이 요청되는 경우 레코드가 일치하도록 지정한다(복제 연결은 특정 데이터베이스를 지정하지는 않는다). 이 경우가 아니라면 특정 PostgreSQL 데이터베이스의 이름으로 사용된다. 쉼표로 구분해서 데이터베이스 이름을 여러 개 쓸 수 있다. 데이터베이스 이름이 포함된 파일은 파일 이름 앞에 @를 붙여서 지정 가능하다.

user

이 레코드와 일치하는 데이터베이스 사용자 이름을 지정한다. all 값은 모든 사용자와 일치하도록 지정한다. 이 외에는, 특정한 데이터베이스 사용자의 이름이거나, 앞에 +를 붙인 그룹 이름이다. (PostgreSQL에서는 사용자와 그룹 이름 간에 실제로 차이는 없다. + 마크는 실제로 "이 role의 직접 또는 간접 멤버인 아무 role과 일치함"을 의미하며, + 마크가 없는 이름은 유일하게 특정 role과 일치한다.) 이러한 이유로, 수퍼유저는 단지 수퍼유저라는 이유 때문이 아니라, 직간접적으로 role의 명시적 멤버인 경우에만 role 멤버로 간주된다. 쉼표로 구분함해서 사용자 이름을 여러 개 쓸 수 있다. 사용자 이름이 포함된 파일은 파일 이름 앞에 @를 붙여서 지정 가능하다.

address

이 레코드가 일치하는 클라이언트 머신 주소(들)를 지정한다. 이 필드는 호스트 이름, IP 주소 범위 또는 아래 설명된 특수 키워드 중 하나를 포함할 수 있다.

IP 주소 대역은 CIDR 표기법을 사용하며, 빗금 기호를 기준으로 왼쪽은 시작 주소, 오른쪽은 마스크 길이를 지정한다. 마스크 길이는 일치해야 하는 클라이언트 IP 주소의 상위 비트 수를 나타낸다. 이것의 오른쪽에 있는 비트는 주어진 IP 주소에서 0이어야 한다. IP 주소, / 및 CIDR 마스크 길이 사이에 공백이 있으면 안 된다.

이러한 방법으로 지정된 IPv4 주소 범위의 전형적인 예시는 단일 호스트의 경우 172.20.143.89/32, 소규모 네트워크의 경우 172.20.143.0/24, 대규모 네트워크의 경우 10.6.0.0/16일 수 있다. IPv6 주소인 경우는, 단일 호스트 루프백 주소는 ::1/128, 소규모 네트워크인 경우는 fe80::7a31:c1ff:0000:0000/96 형태이다. 0.0.0.0/0은 모든 IPv4 주소를 나타내며 ::0/0은 모든 IPv6 주소를 나타낸다. 단일 호스트를 지정하려면 IPv4의 마스크 길이값으로 32를 사용하고 IPv6의 경우 128을 사용해야 한다. CIDR 표기의 시작 주소를 지정할 때는 끝 값이 0이어도 생략할 수 없음을 주의 해야 한다.

클라이언트가 IPv4 주소로 연결을 시도하면, IPv4 주소 항목에서만 인증 처리를 하고, IPv6로 연결을 시도하면, IPv6 주소 항목에서만 인증 처리를 한다. 즉, 127.0.0.1 주소와 ::1/128 같은 루프백일지라도 각각 처리 된다. IPv6 형식의 항목은 표시된 주소가 IPv4-in-IPv6 범위 내이더라도 IPv6 연결만 고려한다. IPv6 형식의 항목은 시스템의 C 라이브러리가 IPv6 주소를 지원하지 않는 경우 거부된다.

사용자는 아무 IP 주소나 일치하도록 all을 쓸 수도 있고, 서버의 자체 IP 주소 아무거나 일치하도록 samehost를 쓸 수도 있고, 서버가 직접 연결되는 서브넷의 아무 주소나 일치하도록 samenet을 쓸 수도 있다.

호스트 이름이 지정된 경우(IP 주소 범위가 아니거나 위에서 설명한 특수 예약어로 호스트 이름을 지정한 경우), 해당 이름은 클라이언트 IP 주소의 역방향 이름 분석 결과와 비교된다(예: DNS가 사용되는 경우 역방향 DNS 조회). 호스트 이름 비교는 대소문자를 구분하지 않는다. 일치가 있는 경우, 순방향 이름 분석(예: 순방향 DNS 조회)은 분석할 주소가 클라이언트의 IP 주소와 동일한지 검사하기 위해 호스트 이름에 대해 수행한다. 양방향으로 일치할 경우 항목이 일치하는 것으로 간주된다. (pg_hba.conf에서 사용되는 호스트 이름은 클라이언트 IP 주소의 주소-이름 분석(address-to-name resolution)이 리턴하는 것이어야 하며, 아닐 경우 줄이 일치하지 않게 된다. 일부 호스트 이름 데이터베이스는 IP 주소를 호스트 이름 여러 개와 연결하는 것을 허용하지만, IP 주소를 분석하도록 요청된 경우 운영 체제는 호스트 이름을 하나만 리턴한다.

점(.)으로 시작되는 호스트 이름 규격은 실제 호스트 이름의 접미사와 일치한다. 따라서, .example.comfoo.example.com과 일치하게 된다(example.com만으로는 일치하지 않음).

호스트 이름이 pg_hba.conf에 지정된 경우 이름 분석이 상당히 빠른지 확인해야 한다. nscd 같은 로컬 이름 분석 캐시를 설정하는 것이 유리할 수 있다. 또한 사용자는 환경 설정 매개 변수 log_hostname을 활성화하여 로그의 IP 주소 대신 클라이언트의 호스트 이름을 볼 수 있다.

이 필드는 host, hostsslhostnossl 레코드에 적용된다.

IP-address
IP-mask

이 두 필드는 IP-주소/마스크길이 표기의 대안으로 사용될 수 있다. 마스크 길이를 지정하는 대신, 실제 마스크를 지정한다. 예를 들면, 255.0.0.0은 IPv4 CIDR 마스크 길이 8을 나타내고, 255.255.255.255는 CIDR 마스크 길이 32를 나타낸다.

이 필드는 hosthostssl, hostnossl 레코드에 적용된다.

auth-method

연결이 이 레코드와 일치할 때 사용하는 인증 방법을 지정한다. 가능한 선택안이 여기에 요약되어 있다. 자세한 내용은 19.3절을 참조 바란다.

trust

무조건 연결을 허용한다. 이 방법은 패스워드나 다른 인증 없이 임의의 PostgreSQL 데이터베이스 사용자로 로그인하여 누구나 PostgreSQL 데이터베이스 서버에 연결할 수 있다. 자세한 내용은 19.3.1절을 참조 바란다.

reject

무조건 연결을 거부한다. 이것은 그룹에서 특정 호스트를 "필터링"할 때 유용하다. 예를 들면, reject 줄은 특정 호스트의 연결을 차단하고, 그 이후의 줄은 특정 네트워크에서 나머지 호스트의 연결을 허용한다.

md5

클라이언트가 인증을 위해 double-MD5-hashed 패스워드를 제공해야 한다. 자세한 내용은 19.3.2절을 참조 바란다.

password

클라이언트가 인증을 위해 암호화되지 않은 패스워드를 제공해야 한다. 패스워드는 네트워크 상에서 일반 텍스트로 전송되므로 신뢰하지 않는 네트워크에서 이것을 사용하면 안 된다. 자세한 내용은 19.3.2절을 참조 바란다.

gss

GSSAPI를 사용하여 사용자를 인증한다. 이것은 TCP/IP 연결에서만 사용할 수 있다. 자세한 내용은 19.3.3절을 참조 바란다.

sspi

SSPI를 사용하여 사용자를 인증한다. 이것은 Windows에서만 사용할 수 있다. 자세한 내용은 19.3.4절을 참조 바란다.

ident

클라이언트의 ident 서버에 접촉함으로써 클라이언트의 운영 체제 사용자 이름을 획득하고, 요청된 데이터베이스 사용자 이름과 일치하는지 확인한다. Ident 인증은 TCP/IP 연결에서만 사용할 수 있다. 로컬 연결에 대해 지정하는 경우 피어(peer) 인증이 대신 사용된다. 자세한 내용은 19.3.5절을 참조 바란다.

peer

클라이언트의 운영 체제 사용자 이름을 운영 체제에서 획득하고, 요청된 데이터베이스 사용자 이름과 일치하는지 확인한다. 이것은 로컬 연결에서만 사용할 수 있다. 자세한 내용은 19.3.6절을 참조 바란다.

ldap

LDAP 서버를 사용하여 인증한다. 자세한 내용은 19.3.7절을 참조 바란다.

radius

RADIUS 서버를 사용하여 인증한다. 자세한 내용은 19.3.8절을 참조 바란다.

cert

SSL 클라이언트 인증을 사용하여 인증한다. 자세한 내용은 19.3.9절을 참조 바란다.

pam

운영 체제에서 제공하는 PAM(Pluggable Authentication Modules)을 사용하여 인증한다. 자세한 내용은 19.3.10절을 참조 바란다.

auth-options

auth-method 필드 이후에 인증 방법에 대한 옵션을 지정하는 name=value 형식의 필드가 있을 수 있다. 인증 방법에서 사용할 수 있는 옵션에 대한 자세한 내용은 아래에 나와 있다.

@ 구문이 포함된 파일은, 공백 또는 쉼표로 구분된 이름 목록으로 읽는다. pg_hba.conf처럼 #로 표시된 주석 및 중첩된 @ 구문이 허용된다. 파일 이름 뒤에 @가 나오는 것이 절대 경로가 아니면 참고 파일이 있는 디렉토리의 상대 경로로 취급된다.

pg_hba.conf 레코드는 각 연결 시도에 대해 순차적으로 검사되므로 레코드의 순서는 중요하다. 일반적으로 초기 레코드는 연결 일치 매개 변수는 치밀하고, 인증 방법은 느슨한 반면, 후기 레코드는 일치 매개 변수는 느슨하고 인증 방법은 강력하다. 예를 들면, 로컬 TCP/IP 연결에 대한 trust 인증을 사용하려고 하면서 원격 TCP/IP 연결을 원할 수도 있다. 이런 경우 127.0.0.1로부터 연결을 위한 trust 인증을 지정한 레코드는 다양한 허용 클라이언트 IP 주소에 대해 패스워드 인증을 지원하는 레코드 앞에 나타난다.

pg_hba.conf 파일은 시작 시 및 메인 서버 프로세스가 SIGHUP 신호를 수신하면 읽어오기 된다. 활성 시스템에서 파일을 편집하는 경우 파일을 다시 읽어오려면 postmaster에 신호를 전송해야 한다(pg_ctl reload 또는 kill -HUP 사용).

작은 정보: 특수한 데이터베이스에 연결하려면 pg_hba.conf 검사만 통과해서는 안 되며 데이터베이스에 대한 CONNECT 권한이 사용자에게 있어야 한다. 데이터베이스에 연결 가능한 사용자를 제한하고 싶으면 pg_hba.conf 항목에 규칙을 입력하는 것보다 CONNECT 권한을 부여/취소하는 것이 일반적으로 쉽다.

pg_hba.conf 항목에 대한 몇 가지 예시가 예 19-1에 나와 있다. 서로 다른 인증 방법에 대한 자세한 내용은 다음 절을 참조 바란다.

예 19-1. pg_hba.conf 항목 예시

# Allow any user on the local system to connect to any database with
# any database user name using Unix-domain sockets (the default for local
# connections).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust

# The same using local loopback TCP/IP connections.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            trust

# The same as the previous line, but using a separate netmask column
#
# TYPE  DATABASE        USER            IP-ADDRESS      IP-MASK             METHOD
host    all             all             127.0.0.1       255.255.255.255     trust

# The same over IPv6.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             ::1/128                 trust

# The same using a host name (would typically cover both IPv4 and IPv6).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             localhost               trust

# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.93.0/24         ident

# Allow any user from host 192.168.12.10 to connect to database
# "postgres" if the user's password is correctly supplied.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.12.10/32        md5

# Allow any user from hosts in the example.com domain to connect to
# any database if the user's password is correctly supplied.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             .example.com            md5

# In the absence of preceding "host" lines, these two lines will
# reject all connections from 192.168.54.1 (since that entry will be
# matched first), but allow GSSAPI connections from anywhere else
# on the Internet.  The zero mask causes no bits of the host IP
# address to be considered, so it matches any host.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.54.1/32         reject
host    all             all             0.0.0.0/0               gss

# Allow users from 192.168.x.x hosts to connect to any database, if
# they pass the ident check.  If, for example, ident says the user is
# "bryanh" and he requests to connect as PostgreSQL user "guest1", the
# connection is allowed if there is an entry in pg_ident.conf for map
# "omicron" that says "bryanh" is allowed to connect as "guest1".
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.0.0/16          ident map=omicron

# If these are the only three lines for local connections, they will
# allow local users to connect only to their own databases (databases
# with the same name as their database user name) except for administrators
# and members of role "support", who can connect to all databases.  The file
# $PGDATA/admins contains a list of names of administrators.  Passwords
# are required in all cases.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   sameuser        all                                     md5
local   all             @admins                                 md5
local   all             +support                                md5

# The last two lines above can be combined into a single line:
local   all             @admins,+support                        md5

# The database column can also use lists and file names:
local   db1,db2,@demodbs  all                                   md5