PostgreSQL을 AWS RDS에서 사용하다 보면, 특히 PostgreSQL 15 버전 이상으로 업그레이드하거나 새로 구성했을 때 예상치 못한 연결 오류를 마주치는 경우가 있습니다. 그중에서도 아래와 같은 메시지를 보면 당황스러울 수밖에 없죠.
FATAL: no pg_hba.conf entry for host "12.34.56.78", user "myuser", database "mydatabase", no encryption
혹은 다음과 같이 SSL과 관련된 메시지가 뜰 수도 있습니다.
psql: error: connection to server at "my-rds-instance.xxxxxx.ap-northeast-2.rds.amazonaws.com", port 5432 failed: FATAL: no pg_hba.conf entry for host "172.31.20.30", user "myuser", database "mydatabase", SSL off
이 글에서는 이러한 오류가 발생하는 근본적인 원인을 짚어보고, AWS RDS 환경에서의 안전한 해결 방법을 알아보겠습니다.
PostgreSQL은 버전이 올라가면서 보안 정책이 강화되고 있습니다.
특히:
password_encryption
기본값이 scram-sha-256
으로 변경과거에는 SSL 없이도 접속이 가능했지만, 이제는 암호화되지 않은 연결을 제한하는 추세입니다.
애플리케이션이나 DB 클라이언트가 SSL 옵션 없이 접속을 시도하면 문제가 생깁니다.
예를 들어:
pg_hba.conf 직접 수정 불가
RDS에서는 해당 파일을 수정할 수 없고, 파라미터 그룹을 통해 설정을 간접적으로 제어합니다.
rds.force_ssl 파라미터 존재
이 값이 1
이면 모든 연결에 SSL을 강제합니다.
이 경우, SSL 없이 연결하면 위와 같은 오류가 발생합니다.
AWS 공식 문서에서 RDS CA 인증서(.pem)를 다운로드하세요.
리전에 따라 적절한 인증서를 사용해야 합니다.
예시: rds-ca-2019-root.pem
, rds-ca-rsa2048-g1.pem
등
const { Pool } = require('pg');
const fs = require('fs');
const rdsCaCertPath = '/path/to/rds-ca-2019-root.pem';
const pool = new Pool({
user: 'myuser',
host: 'my-rds-instance.xxxxxx.ap-northeast-2.rds.amazonaws.com',
database: 'mydatabase',
password: 'mypassword',
port: 5432,
ssl: {
rejectUnauthorized: true,
ca: fs.readFileSync(rdsCaCertPath).toString(),
}
});
또는 연결 문자열 방식으로:
const connectionString = `postgresql://myuser:mypassword@my-rds-instance.xxxxxx.ap-northeast-2.rds.amazonaws.com:5432/mydatabase?sslmode=verify-full&sslrootcert=${rdsCaCertPath}`;
const pool = new Pool({ connectionString });
psql "host=my-rds-instance.xxxxxx.ap-northeast-2.rds.amazonaws.com \
port=5432 \
dbname=mydatabase \
user=myuser \
sslmode=verify-full \
sslrootcert=/path/to/rds-ca-2019-root.pem"
옵션 | 설명 |
---|---|
disable | SSL 사용 안 함 (이 오류의 주원인) |
allow | SSL 지원 시 사용, 아니면 비암호화 연결 |
prefer | 가능하면 SSL 사용 |
require | SSL 사용, CA 검증은 안 함 |
verify-ca | SSL + CA 인증서 검증 |
verify-full | 가장 안전, CA + 호스트명 일치 검증 (권장) |
SSL 구성이 정말 어렵다면, 다음 방법으로 일시적으로 SSL 강제를 비활성화할 수 있습니다.
단, 이 방법은 보안적으로 매우 취약하므로 프로덕션 환경에서는 사용 금지입니다.
rds.force_ssl
을 검색0
으로 변경주의: PostgreSQL 15 이상에서는
rds.force_ssl
을 0으로 바꿔도 내부pg_hba.conf
가 비SSL 연결을 막을 수 있습니다.
이 오류는 대부분 클라이언트가 암호화되지 않은 방식으로 DB에 연결을 시도하고,
PostgreSQL 15+와 AWS RDS는 이를 허용하지 않도록 구성되어 있기 때문에 발생합니다.
SSL 연결을 설정하고, 인증서와 적절한
sslmode
를 사용하세요.
간단한 문제 같아 보이지만, 실무에서 접하면 꽤나 번거로운 오류입니다.
하지만 한 번만 제대로 구성해두면, 보안적으로도 훨씬 안전한 환경을 유지할 수 있어요.
이 글이 같은 문제로 고민 중인 분들에게 도움이 되었기를 바랍니다.
실제 운영 환경에서는 모든 DB 연결에 SSL/TLS를 적용하는 것이 기본 보안 수칙입니다.
시간이 조금 더 들더라도 보안은 반드시 챙기고 넘어갑시다!
궁금한 점이나 다른 오류에 대한 글이 필요하시다면 댓글이나 문의 주세요
좋은 정보 감사하빈다