error: no pg_hba.conf entry for host user database no encryption 해결법

doohyunlm·2025년 5월 26일
3

error

목록 보기
12/12
post-thumbnail

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 환경에서의 안전한 해결 방법을 알아보겠습니다.


오류의 원인 분석

1. PostgreSQL 15+의 SSL 정책 강화

PostgreSQL은 버전이 올라가면서 보안 정책이 강화되고 있습니다.
특히:

  • PostgreSQL 14부터는 password_encryption 기본값이 scram-sha-256으로 변경
  • PostgreSQL 15부터는 SSL 연결에 대한 기본 정책이 더 엄격해졌습니다.

과거에는 SSL 없이도 접속이 가능했지만, 이제는 암호화되지 않은 연결을 제한하는 추세입니다.


2. 클라이언트의 비암호화 연결 시도

애플리케이션이나 DB 클라이언트가 SSL 옵션 없이 접속을 시도하면 문제가 생깁니다.
예를 들어:

  • Node.js, Java, Python 애플리케이션에서 SSL 설정이 누락된 경우
  • psql, DBeaver, pgAdmin 등에서 SSL 설정 없이 접속하는 경우

3. AWS RDS의 특징

  • pg_hba.conf 직접 수정 불가
    RDS에서는 해당 파일을 수정할 수 없고, 파라미터 그룹을 통해 설정을 간접적으로 제어합니다.

  • rds.force_ssl 파라미터 존재
    이 값이 1이면 모든 연결에 SSL을 강제합니다.
    이 경우, SSL 없이 연결하면 위와 같은 오류가 발생합니다.


이 오류가 초래하는 문제

  • DB 연결 실패 → 애플리케이션 장애
  • SSL 없이 접속하면 중간자 공격 위험 증가
  • 프로덕션 환경에서는 치명적인 보안 이슈로 이어질 수 있음

해결 방법

1. 클라이언트에서 SSL 연결 구성 (가장 권장)

🔹 CA 인증서 준비

AWS 공식 문서에서 RDS CA 인증서(.pem)를 다운로드하세요.
리전에 따라 적절한 인증서를 사용해야 합니다.
예시: rds-ca-2019-root.pem, rds-ca-rsa2048-g1.pem

🔹 Node.js (pg 라이브러리) 예제

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 명령어 예제

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"

🔹 sslmode 옵션 설명

옵션설명
disableSSL 사용 안 함 (이 오류의 주원인)
allowSSL 지원 시 사용, 아니면 비암호화 연결
prefer가능하면 SSL 사용
requireSSL 사용, CA 검증은 안 함
verify-caSSL + CA 인증서 검증
verify-full가장 안전, CA + 호스트명 일치 검증 (권장)

2. rds.force_ssl 파라미터 설정 확인 (비추천, 예외 상황에서만)

SSL 구성이 정말 어렵다면, 다음 방법으로 일시적으로 SSL 강제를 비활성화할 수 있습니다.

단, 이 방법은 보안적으로 매우 취약하므로 프로덕션 환경에서는 사용 금지입니다.

설정 방법:

  1. AWS RDS 콘솔 접속
  2. "파라미터 그룹" 메뉴 선택
  3. 사용 중인 파라미터 그룹 선택
  4. rds.force_ssl을 검색
  5. 값을 0으로 변경
  6. 저장 후 변경 적용

주의: PostgreSQL 15 이상에서는 rds.force_ssl을 0으로 바꿔도 내부 pg_hba.conf가 비SSL 연결을 막을 수 있습니다.


3. 네트워크 보안 설정 확인 (가능성 낮지만 확인 추천)

  • RDS 보안 그룹 인바운드에 애플리케이션 IP가 5432 포트로 접근 가능해야 합니다.
  • VPC 서브넷의 NACL(Network ACL)이 해당 트래픽을 허용하는지도 확인해보세요.

결론

이 오류는 대부분 클라이언트가 암호화되지 않은 방식으로 DB에 연결을 시도하고,
PostgreSQL 15+와 AWS RDS는 이를 허용하지 않도록 구성되어 있기 때문에 발생합니다.

가장 확실한 해결책은?

SSL 연결을 설정하고, 인증서와 적절한 sslmode를 사용하세요.

간단한 문제 같아 보이지만, 실무에서 접하면 꽤나 번거로운 오류입니다.
하지만 한 번만 제대로 구성해두면, 보안적으로도 훨씬 안전한 환경을 유지할 수 있어요.


마무리하며

이 글이 같은 문제로 고민 중인 분들에게 도움이 되었기를 바랍니다.
실제 운영 환경에서는 모든 DB 연결에 SSL/TLS를 적용하는 것이 기본 보안 수칙입니다.
시간이 조금 더 들더라도 보안은 반드시 챙기고 넘어갑시다!

궁금한 점이나 다른 오류에 대한 글이 필요하시다면 댓글이나 문의 주세요


profile
백엔드 개발자

1개의 댓글

comment-user-thumbnail
2025년 5월 30일

좋은 정보 감사하빈다

답글 달기