본문으로 건너뛰기

8.3 인증과 HBA

pg_auto_failover가 동작하려면 세 방향에서 PostgreSQL 연결을 허용해야 합니다. keeper가 monitor로 보내는 node_active() 호출, monitor가 각 노드로 보내는 health check, standby가 primary로 연결하는 streaming replication입니다. pg_autoctl은 이 연결에 사용할 사용자를 만들고 pg_hba.conf에 규칙을 추가합니다. 애플리케이션에서 사용할 규칙은 만들지 않습니다. 이 장에서는 자동으로 생성되는 항목과 직접 설정해야 하는 항목을 나눠 살펴봅니다.

내부 사용자 4개​

v2.2 소스(defaults.h)와 문서에 나오는 사용자입니다.

사용자위치용도
autoctl_nodemonitorkeeper가 pg_auto_failover DB에 접속해 node_active() 등을 호출. 제한된 권한
autoctlmonitorpg_auto_failover DB 소유자. 관리 작업용
pgautofailover_monitor데이터 노드monitor의 health check. dbname=postgres로 접속
pgautofailover_replicator데이터 노드streaming replication, pg_basebackup, pg_rewind. v2.2는 LOGIN SUPERUSER REPLICATION으로 생성

v2.2 운영 문서는 보안상 autoctl_node로 maintenance 등의 관리 작업을 할 수 없다고 설명합니다. 그러나 v2.2 extension SQL(pgautofailover.sql)은 autoctl_node에 perform_failover, perform_promotion, start_maintenance, stop_maintenance, remove_node, drop_formation 등의 실행 권한을 부여합니다. 따라서 pg_autoctl의 전환과 maintenance 명령은 모두 이 사용자로 동작합니다. autoctl_node 자격 증명과 monitor HBA는 관리 권한과 같은 수준으로 보호해야 합니다. pgautofailover_replicator도 superuser입니다. 따라서 비밀번호나 인증서와 peer HBA가 유출되면 즉시 superuser로 접근할 수 있습니다. 이 역할의 HBA 범위는 데이터 노드 주소로 제한합니다.

--auth와 비밀번호​

--auth는 기본값이 없는 필수 옵션입니다. trust는 평가용이며, 운영에는 scram-sha-256 같은 비밀번호 방식을 권합니다. 주의할 점은 pg_autoctl이 비밀번호를 대신 정해 주지 않는다는 것입니다. 보안 문서의 절차를 요약하면 다음과 같습니다.

# 1. monitor 생성 후 autoctl_node 비밀번호 설정
pg_autoctl create monitor --auth scram-sha-256 ...
psql postgres://monitor.host/pg_auto_failover -c "alter user autoctl_node password '...'"

# 2. 첫 노드: monitor URI에 비밀번호를 넣고, replication 비밀번호를 설정
pg_autoctl create postgres --auth scram-sha-256 \
--monitor postgres://autoctl_node:...@monitor.host/pg_auto_failover ...
psql -d postgres -c "alter user pgautofailover_replicator password '...'" # 역할 비밀번호
pg_autoctl config set replication.password '...' # keeper 가 쓸 비밀번호

# 3. 두 번째 노드: pg_basebackup이 create 도중 실행되므로 PGPASSWORD를 먼저 준비
export PGPASSWORD='...'
pg_autoctl create postgres --auth scram-sha-256 ...
pg_autoctl config set replication.password '...'

config set replication.password는 keeper가 upstream에 보낼 값만 바꿉니다. pgautofailover_replicator 역할의 비밀번호는 바꾸지 않습니다. v2.2 보안 문서의 예시에는 ALTER USER pgautofailover_replicator 단계가 없습니다. 따라서 위와 같이 따로 실행합니다. 두 값이 다르면 재연결과 재합류가 실패합니다. 문서는 비밀번호를 환경 변수나 명령줄 대신 ~/.pgpass 파일로 관리하는 방법도 권합니다. pg_autoctl 설정 파일에 평문으로 남기지 않으려면 이 방법이 더 적합합니다.

노트

health check 사용자는 예외입니다. v2.2의 fsm_transition.c는 pgautofailover_monitor에 대한 monitor 호스트의 연결을 --auth 값과 관계없이 trust로 허용합니다. monitor 쪽은 소스에 고정된 비밀번호를 사용합니다. 주석에 따르면 passfile이나 환경 변수에서 정보가 유출되는 것을 막기 위한 선택입니다. 이 사용자는 접속 여부만 확인합니다. 다만 규칙이 monitor 호스트 하나로 제한되어 있는지는 확인하는 것이 좋습니다.

자동으로 생기는 HBA 규칙​

실습 run1에서 node1의 pg_hba.conf에 추가된 줄입니다(주석 제외).

hostssl "appdb" "postgres" node1 trust
hostssl "appdb" "postgres" 172.18.0.0/16 trust
hostssl all "pgautofailover_monitor" 172.18.0.2/32 trust
hostssl replication "pgautofailover_replicator" 172.18.0.4/32 trust
hostssl "appdb" "pgautofailover_replicator" 172.18.0.4/32 trust
hostssl replication "pgautofailover_replicator" node2 trust
hostssl "appdb" "pgautofailover_replicator" node2 trust

세 가지를 확인할 수 있습니다.

첫째, 두 번째 줄의 172.18.0.0/16은 --pg-hba-lan이 만든 규칙입니다. 이 옵션은 monitor에 접속할 때 사용하는 로컬 인터페이스의 netmask로 LAN CIDR을 계산합니다. 그리고 그 대역 전체에 --dbname 접속을 허용합니다. 대역이 넓은 네트워크에서는 의도보다 많은 호스트의 접속을 허용하게 됩니다.

둘째, 역방향 DNS가 올바르게 설정되지 않으면 호스트명 대신 IP가 기록됩니다. keeper 로그에는 Using IP address "172.18.0.3" in HBA file instead of hostname "node1" 경고가 남았습니다. 이후 노드의 IP가 바뀌면 이 규칙은 적용되지 않습니다. 실습에서는 컨테이너를 다시 만든 standby가 no pg_hba.conf entry for replication connection으로 5분 넘게 catchingup 상태에 머물렀습니다(9.4).

셋째, replicator가 접속할 수 있는 일반 DB는 appdb 하나입니다. pg_rewind는 dbname=postgres로 접속하므로 이 규칙에서는 거부됩니다. 그 결과 옛 primary가 재합류할 때 전체 pg_basebackup이 수행됩니다(6.5). 실습에서는 다음 규칙을 직접 추가해 해결했습니다.

hostssl "postgres" "pgautofailover_replicator" 172.28.0.0/24 trust # added for pg_rewind (lab)

--skip-pg-hba​

HBA를 구성 관리 도구로 관리한다면 --skip-pg-hba를 사용합니다. 이 옵션을 지정하면 pg_autoctl은 파일을 수정하지 않고 필요한 규칙을 로그에 출력합니다. 이 출력을 템플릿에 반영하면 됩니다. 인증서 인증(8.4)을 사용할 때도 문서는 이 방식을 권합니다.

경고

애플리케이션 사용자의 HBA 규칙은 어떤 옵션을 사용해도 자동으로 생기지 않습니다. 모든 노드에 같은 규칙을 넣어야 합니다. failover 후 새 primary에 규칙이 없으면 failover 자체는 성공하지만 애플리케이션은 접속하지 못합니다.

정리​

pg_autoctl은 내부 연결 세 종류에 필요한 사용자와 HBA 규칙을 만듭니다. 비밀번호와 애플리케이션 규칙은 사용자가 설정해야 합니다. --pg-hba-lan의 대역과 역방향 DNS가 없을 때 기록되는 IP를 확인해야 합니다. pg_rewind용 postgres DB 규칙의 누락 여부도 설치 직후 pg_hba.conf에서 확인합니다.