본문으로 건너뛰기
9.2 pg_hba.conf 인증 메서드

9.2 pg_hba.conf 인증 메서드

pg_hba.conf는 PostgreSQL의 Host-Based Authentication 정책 파일입니다. 누가(user) 어디서(host) 어떤 DB에(database) 어떤 방법으로(auth-method) 접속할 수 있는지 정의합니다. 권한 매칭의 첫 관문이라 잘못 쓰면 운영 클러스터가 잠깁니다.

파일 위치

배포위치
RHEL/Rocky (PGDG)/var/lib/pgsql/<ver>/data/pg_hba.conf (PGDATA 안)
Debian/Ubuntu (PGDG)/etc/postgresql/<ver>/<cluster>/pg_hba.conf
소스 빌드PGDATA 안
Docker postgres/var/lib/postgresql/data/pg_hba.conf

행 형식

TYPE   DATABASE   USER          ADDRESS          METHOD   [OPTIONS]
TYPE의미
localUnix 도메인 소켓
hostTCP/IP (SSL/non-SSL 둘 다)
hostsslTCP/IP + SSL 강제
hostnosslTCP/IP + SSL 거부
hostgssencGSSAPI 암호화
hostnogssencGSSAPI 거부

자주 쓰는 인증 메서드

METHOD설명운영 권장도
trust비밀번호 검증 없음 — 위험절대 금지 (localhost 일부 예외)
reject무조건 거부명시적 차단에 유용
md5MD5 해시 비밀번호옛 — SCRAM 권장
scram-sha-256SCRAM-SHA-256표준
peerOS 사용자명 = DB 사용자명 (Unix 소켓 전용)로컬 관리에 편리
identRFC 1413 ident 서버잘 안 씀
gss / sspiKerberos / Windows엔터프라이즈
ldapLDAP bind엔터프라이즈
pamPAM 모듈OS 통합
cert클라이언트 SSL 인증서보안 강
radiusRADIUS 서버엔터프라이즈

운영 표준 한 줄 모음

# TYPE     DATABASE    USER              ADDRESS         METHOD
local      all         postgres                          peer
local      all         all                               scram-sha-256
host       all         all               127.0.0.1/32    scram-sha-256
host       all         all               ::1/128         scram-sha-256
hostssl    app_main    app_readers       10.0.0.0/8      scram-sha-256
hostssl    replication repl_user         10.0.1.5/32     scram-sha-256
host       all         all               0.0.0.0/0       reject

핵심 원칙

  1. local postgres = peer: 호스트의 postgres 사용자가 비밀번호 없이 슈퍼유저 접속
  2. 로컬 일반 사용자는 scram-sha-256: 트러스트 금지
  3. 외부 TCP는 hostssl + scram-sha-256: 평문 + 인증서 검증
  4. replication 데이터베이스는 별도 행: 복제 사용자 분리
  5. 모르는 곳은 reject로 명시 차단: catch-all 정책

매칭 순서

행은 위에서부터 순차 매칭. 첫 번째 매칭이 결과입니다.

# 잘못된 예 — host all all 이 먼저라 hostssl 룰이 무시됨
host    all     all     10.0.0.0/8    md5
hostssl all     all     10.0.0.0/8    scram-sha-256

# 올바른 예
hostssl all     all     10.0.0.0/8    scram-sha-256
hostnossl all   all     10.0.0.0/8    reject

database 컬럼 특수 값

의미
all모든 DB
sameuser사용자명과 같은 이름의 DB만
samerole멤버로 속한 역할 이름의 DB
replication복제 연결 전용 (PG 9+)
db1,db2콤마로 여러 DB
@filename외부 파일에서 목록 읽기

user 컬럼

의미
all모든 역할
alice단일 역할
+app_readersapp_readers 그룹의 멤버 모두 (PG 9.1+)
alice,bob여러 사용자
@filename외부 파일
hostssl  app_main  +app_readers  10.0.0.0/8  scram-sha-256

적용 — reload

pg_hba.conf 변경은 재시작 없이 reload만으로 적용됩니다.

sudo systemctl reload postgresql-17
# 또는
psql -c "SELECT pg_reload_conf();"

테스트:

SELECT * FROM pg_hba_file_rules;
-- 파싱 결과를 SQL로 조회. 잘못된 행은 에러 표시

운영자가 변경 후 이 뷰로 검증하는 게 표준입니다.

디버깅

접속이 실패하면 PostgreSQL 로그에 정확한 매칭 행이 적힙니다.

2026-05-23 09:12:01 KST [12345] FATAL:  no pg_hba.conf entry for host "203.0.113.5", user "alice", database "app_main", SSL off
메시지원인
no pg_hba.conf entry for ...매칭 행 없음 — 새 행 추가 또는 IP 잘못
password authentication failedscram-sha-256 / md5 메서드인데 비밀번호 불일치
pg_hba.conf rejects connection명시적 reject 행에 걸림
SSL connection is requiredhostnossl 가 아닌 행에 SSL 없이 접속

SCRAM 마이그레이션

옛 클러스터가 md5로 운영 중이면 점진 전환:

-- 1. password_encryption을 scram-sha-256으로
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();

-- 2. 각 사용자가 비밀번호를 다시 설정 (이때 SCRAM으로 저장됨)
ALTER ROLE alice PASSWORD 'new_secret';

-- 3. 모든 사용자가 마이그레이션 끝나면 pg_hba.conf를 md5 → scram-sha-256으로

확인:

SELECT rolname, rolpassword IS NULL AS no_pw,
       LEFT(rolpassword, 14) AS pw_kind
  FROM pg_authid
 WHERE rolcanlogin;
-- pw_kind가 'SCRAM-SHA-256'이면 SCRAM, 'md5...'이면 MD5

운영 안티패턴

안티패턴위험
host all all 0.0.0.0/0 trust인터넷에서 누구나 슈퍼유저 접속
md5 유지rainbow table·sniffing 위험
hostnossl 명시 안 함평문 접속 허용
회사망 안이라고 평문 OK 가정내부망도 capture 가능 — TLS 필수
pg_hba.conf 변경 후 검증 없이 reload잘못된 행이 클러스터 잠금 사고
pg_hba.conf 변경은 항상 pg_hba_file_rules 뷰로 검증 후 reload. 변경 전 백업 카피를 두고, 변경 후 다른 세션에서 새 접속이 가능한지 즉시 확인합니다. 잘못된 파일로 reload하면 새 접속이 모두 거부되며 원격 복구가 매우 번거롭습니다.

정리

  • pg_hba.conf = 누가·어디서·어떤 DB에·어떤 메서드로 접속할지 정의
  • 행은 위에서부터 매칭 — 순서가 매우 중요
  • 운영 표준: scram-sha-256 + hostssl + replication 별도 행
  • pg_hba_file_rules 뷰로 변경 검증
  • 변경은 reload (재시작 불필요)
  • md5는 SCRAM으로 단계적 전환 권장

다음 절(9.3)에서는 row 단위 권한 — Row-Level Security(RLS)를 봅니다.