명령어/DB

[PostgreSQL] pg_hba.conf로 "누가·어디서·어떻게" 붙는지 규칙을 읽는다

jykim23 2026. 8. 1. 19:53
반응형

설치·접속: PostgreSQL 설치와 접속

부제: 접속이 왜 되고 왜 막히는지 헷갈릴 때, 인증 규칙 파일을 위에서부터 순서대로 읽어 어느 줄에 걸리는지 파악할 때

# 주석·빈 줄 걷어내고 실제 규칙만
sudo grep -vE '^\s*#|^\s*$' /etc/postgresql/16/main/pg_hba.conf
# TYPE   DATABASE      USER       ADDRESS         METHOD
local    all           postgres                   peer
local    all           all                        peer
host     all           all        127.0.0.1/32    scram-sha-256
host     all           all        ::1/128         scram-sha-256
local    replication   all                        peer
host     replication   all        127.0.0.1/32    scram-sha-256

한 줄이 곧 하나의 인증 규칙이고, PostgreSQL은 위에서부터 내려오며 처음 일치하는 줄 하나로 판정을 끝낸다. local은 유닉스 소켓 접속, host는 TCP 접속을 뜻한다. peer는 OS 로그인 계정명을 그대로 DB 롤명으로 신뢰하는 방식이라, sudo -u postgres psql이 비밀번호 없이 붙는 이유가 여기 있다(1번째 줄). 반면 127.0.0.1로 TCP 접속하는 애플리케이션은 3번째 줄에 걸려 scram-sha-256 비밀번호 인증을 거친다. 접속 문제가 생기면 "내 접속이 위에서부터 어느 줄에 처음 매칭되는가"를 짚는 게 진단의 출발점이다.

이렇게도 쓴다

파일을 직접 열지 않고 규칙을 뷰로 조회한다. 파싱 에러도 함께 보인다. (조합: pg_hba_file_rules)

SELECT type, database, user_name, address, auth_method
FROM pg_hba_file_rules WHERE auth_method IS NOT NULL;

 

비밀번호가 어떤 방식으로 저장·검증되는지 확인한다. (조합: SHOW password_encryption)

SHOW password_encryption;   -- scram-sha-256

 

실제 저장된 비밀번호가 SCRAM 해시인지 카탈로그에서 본다. (조합: pg_authid)

SELECT rolname, left(rolpassword, 14) AS prefix FROM pg_authid WHERE rolname='m9_app';
-- m9_app | SCRAM-SHA-256$   (평문·MD5 아님)

 

규칙을 고친 뒤 재시작 없이 다시 읽힌다. (조합: pg_reload_conf)

SELECT pg_reload_conf();

 

특정 DB·유저에만 규칙을 좁혀 최소 노출로 연다. (예시 규칙 라인)

# shop DB에 app 유저만, 사내 대역에서 SCRAM으로
host    shop    m9_app    10.0.0.0/24    scram-sha-256

 

지금 세션이 어떤 방식으로 인증됐는지 되짚는다. (조합: pg_stat_activity 결합)

SELECT usename, client_addr, backend_type FROM pg_stat_activity WHERE pid=pg_backend_pid();
반응형