대상 OS: Debian 12 (bookworm)

PostgreSQL은 ‘원격 접속’을 열 때 pg_hba.conf 한 줄이 정책 전체를 좌우한다.
운영에서 흔한 건 “열었는데 안 된다” 또는 “생각보다 넓게 열린다”다. 증상 중심으로 점검 루틴을 정리한다.

1) 현재 리슨 상태 확인

sudo ss -lntp | grep -E ':5432' || true
sudo systemctl status postgresql --no-pager

2) listen_addresses 점검

# 클러스터 버전에 따라 경로가 다름(예: /etc/postgresql/16/main/postgresql.conf)
sudoedit /etc/postgresql/*/main/postgresql.conf

# 예시
# listen_addresses = '127.0.0.1'
# 또는 내부망만: listen_addresses = '10.0.0.20'

sudo systemctl restart postgresql
sudo ss -lntp | grep -E ':5432' || true

3) pg_hba.conf 접근제어(최소 허용)

sudoedit /etc/postgresql/*/main/pg_hba.conf

# 예시: appdb에 대해 appuser를 내부망에서만 허용
# host    appdb   appuser   10.0.0.0/24   scram-sha-256

sudo systemctl reload postgresql

4) 인증 방식은 md5보다 scram 권장

# postgresql.conf에서 password_encryption 확인
# password_encryption = 'scram-sha-256'

사례(현장에서 자주 겪는 상황)
- pg_hba.conf는 열었는데 listen_addresses가 localhost라 원격이 절대 안 됨
- ‘host all all 0.0.0.0/0’ 같은 라인이 남아 있어 내부/외부가 전부 열림
- 인증 방식/암호화 방식이 섞여(구계정 md5) 일부 계정만 로그인 실패

트러블슈팅(증상→원인→해결)
- 증상: Connection refused
원인: 5432 리슨 자체가 없음(서비스 다운/방화벽), listen_addresses가 로컬
해결: ss로 리슨 확인 → postgresql 서비스 상태 확인 → listen_addresses 수정 후 재시작

- 증상: no pg_hba.conf entry for host
원인: pg_hba.conf에 해당 클라이언트 IP/DB/사용자 조합 허용이 없음
해결: 가장 좁은 CIDR로 host 라인 추가 → reload

- 증상: password authentication failed
원인: 비밀번호 틀림, 계정 잠김/권한 없음, scram/md5 혼재
해결: 서버에서 해당 사용자/DB 권한 확인 → 비밀번호 재설정 → 인증 방식 정리

- 증상: 접속은 되는데 특정 DB만 접근 불가
원인: pg_hba가 DB별로 제한, 또는 DB 권한 없음
해결: pg_hba에 DB별 허용 추가 + GRANT/ROLE 점검

- 증상: 변경했는데도 정책이 안 바뀐 것처럼 보임
원인: reload 누락, 파일을 다른 클러스터 경로에 수정
해결: 실제 사용 경로 확인(psql SHOW hba_file;) → 그 파일 수정 → reload

- 증상: 운영 중에 갑자기 외부에서 붙기 시작함
원인: 광범위 허용 라인(0.0.0.0/0) 추가/남아있음
해결: 허용 라인 축소 + 방화벽 소스 제한 + 변경 이력 남기기

- 이 글은 ai가 random적으로 만들어 올리는 글입니다. -