PostgreSQL 18 SCRAM 패스스루 인증: postgres_fdw 설정 방법
Matheus Alcantara
2025년 8월 21일
PostgreSQL 18은 postgres_fdw 또는 dblink_fdw를 사용하는 사용자를 위해 SCRAM 패스스루(pass-through) 인증을 제공합니다. 이 기능을 사용하면 외부 서버(Foreign Server)에 연결할 때 USER MAPPING 옵션에 평문 비밀번호를 저장하지 않아도 됩니다.
이 글에서는 PostgreSQL 18 SCRAM 패스스루 인증의 작동 방식과 사용 조건을 살펴보고, postgres_fdw와 dblink_fdw를 설정하는 과정을 단계별로 설명합니다.
PostgreSQL 18 SCRAM 패스스루 인증이란?
다음은 SCRAM 패스스루 인증을 가능하게 한 커밋입니다.
commit 761c79508e7fbc33c1b11754bdde4bd03ce9cbb3
Author: Peter Eisentraut <peter@eisentraut.org>
Date: Wed Jan 15 17:55:18 2025 +0100
postgres_fdw: SCRAM authentication pass-through
This enables SCRAM authentication for postgres_fdw when connecting to
a foreign server without having to store a plain-text password on user
mapping options.
This is done by saving the SCRAM ClientKey and ServerKey from the
client authentication and using those instead of the plain-text
password for the server-side SCRAM exchange. The new foreign-server
or user-mapping option "use_scram_passthrough" enables this.
Co-authored-by: Matheus Alcantara <mths.dev@pm.me>
Co-authored-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://www.postgresql.org/message-id/flat/27b29a35-9b96-46a9-bc1a-914140869dac@gmail.com커밋 메시지에서 설명하듯 PostgreSQL 서버가 FOREIGN SERVER에 연결할 때 use_scram_passthrough 옵션을 설정하면 평문 비밀번호 대신 클라이언트 연결에서 가져온 SCRAM 키(ClientKey, ServerKey)를 사용합니다. 이를 통해 보안을 강화하고 자격 증명을 중복으로 관리해야 하는 문제를 해결할 수 있습니다.
SCRAM 패스스루 인증 사용 조건
이 기능을 사용하려면 다음 조건을 충족해야 합니다.
- 외부 서버가 scram-sha-256 인증을 요구해야 합니다. 그렇지 않으면 연결에 실패합니다.
- 클라이언트 측, 즉
postgres_fdw또는dblink_fdw를 사용하는 서버만 PostgreSQL 18 이상이면 됩니다. - 양쪽 서버에 해시, salt, iteration count를 포함한 동일한 SCRAM 시크릿이 있어야 합니다.
- 최초 클라이언트에서 메인 서버로 연결할 때도 SCRAM을 사용해야 합니다. 즉, 패스스루의 입력 및 출력 연결에 모두 SCRAM이 필요합니다.
postgres_fdw에서 SCRAM 패스스루 설정하기
이 예제에서는 다음 두 개의 PostgreSQL 서버를 사용합니다.
- incoming 서버: FDW 클라이언트
- foreign 서버: 연결 대상 외부 서버
1. 두 서버에 동일한 사용자 생성
CREATE USER example;foreign 서버에서 예제 테이블을 생성합니다.
CREATE TABLE fdw_table AS SELECT g as a, b+2 as b FROM generate_series(1,100) g(g);psql을 종료한 다음 새 사용자로 다시 로그인하여 두 서버에서 비밀번호를 설정합니다.
\password2. pg_hba.conf에서 scram-sha-256 인증 강제
두 서버 모두 scram-sha-256 인증을 사용하도록 설정해야 합니다.
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다음 명령으로 pg_hba.conf 파일 경로를 확인합니다.
SHOW hba_file;3. 두 서버의 SCRAM 시크릿 동기화
incoming 서버에서 암호 해시를 가져옵니다.
SELECT rolpassword FROM pg_authid WHERE rolname = 'example';foreign 서버에서 동일한 값을 설정합니다.
ALTER ROLE example PASSWORD 'scram-sha-256$...'; -- paste the whole thing중요: SCRAM 해시는 양쪽 서버에서 완전히 동일해야 합니다.
4. postgres_fdw와 USER MAPPING 설정
incoming 서버에서 다음 SQL을 실행합니다.
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER foreign_fdw
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', dbname 'postgres', use_scram_passthrough 'true');
CREATE USER MAPPING FOR example
SERVER foreign_fdw
OPTIONS (user 'example');
주의: SCRAM 패스스루를 사용하므로 USER MAPPING에 비밀번호를 지정할 필요가 없습니다.
5. 외부 테이블 가져오기 및 쿼리 실행
IMPORT FOREIGN SCHEMA public LIMIT TO (fdw_table)
FROM SERVER foreign_fdw INTO public;
외부 테이블을 가져온 후 다음 쿼리를 실행합니다.
SELECT * FROM fdw_table;
쿼리가 정상적으로 실행되면 SCRAM 패스스루를 통한 서버 간 연결이 완료된 것입니다.
dblink_fdw에서 SCRAM 패스스루 사용하기
dblink_fdw의 설정 절차도 동일합니다. 다만 외부 테이블을 가져오는 대신 다음과 같이 직접 쿼리를 실행합니다.
SELECT * FROM dblink('foreign_fdw', 'SELECT * FROM fdw_table')
AS fdw_table(a int, b int);
PostgreSQL 18 SCRAM 패스스루 활용 이점
SCRAM 패스스루 인증은 PostgreSQL 서버 간에 평문 비밀번호를 별도로 저장하지 않는 연결을 구성할 수 있게 합니다. 특히 여러 데이터베이스에 연합 접근(federation)을 설정하면서 USER MAPPING의 비밀번호를 별도로 관리하고 싶지 않은 환경에서 유용합니다.
PostgreSQL 18 SCRAM 패스스루 FAQ
SCRAM 패스스루 인증이란 무엇인가요?
클라이언트 인증 과정에서 확보한 SCRAM ClientKey와 ServerKey를 외부 서버의 SCRAM 인증에 사용하는 기능입니다. 이를 통해 USER MAPPING 옵션에 평문 비밀번호를 저장하지 않고 외부 서버에 연결할 수 있습니다.
SCRAM 패스스루를 사용하려면 양쪽 서버가 모두 PostgreSQL 18이어야 하나요?
아닙니다. postgres_fdw 또는 dblink_fdw를 사용하는 클라이언트 측 서버만 PostgreSQL 18 이상이면 됩니다. 외부 서버는 scram-sha-256 인증을 요구하도록 설정해야 합니다.
두 서버의 사용자 비밀번호만 같으면 되나요?
비밀번호 문자열만 같은 것으로는 충분하지 않습니다. 해시, salt, iteration count를 포함한 SCRAM 시크릿이 양쪽 서버에서 완전히 동일해야 합니다.
USER MAPPING에 비밀번호를 입력해야 하나요?
use_scram_passthrough를 활성화하고 필요한 조건을 모두 충족했다면 USER MAPPING에 비밀번호를 지정할 필요가 없습니다. 사용자 이름은 USER MAPPING 옵션에 설정합니다.
최초 클라이언트 연결도 SCRAM을 사용해야 하나요?
네. 클라이언트에서 메인 서버로 들어오는 연결과 메인 서버에서 외부 서버로 나가는 연결 모두 SCRAM을 사용해야 패스스루 인증이 작동합니다.