본문 바로가기

개발

PostgreSQL 보안의 핵심: pg_hba.conf 파일 완벽 이해하기!

반응형

PostgreSQL 데이터베이스를 운영하거나 개발할 때, 보안은 무엇보다 중요합니다. 특히

pg_hba.conf 파일은 PostgreSQL의 클라이언트 인증 설정을 정의하는 핵심적인 파일이죠. 이 파일이 바로 PostgreSQL 서버가 클라이언트의 연결 요청을 받았을 때, 해당 연결을 허용할지, 그리고 어떤 인증 방식을 사용할지 결정하는

보안 규칙서와 같습니다.

pg_hba.conf는 "Host-Based Authentication"의 약자로, 어떤 클라이언트, 어떤 사용자, 어떤 데이터베이스가 어떤 방식으로 접속할 수 있는지를 명시합니다. 이 글에서는

pg_hba.conf 파일의 역할과 중요성, 그리고 주요 구문과 설정 예시를 개발자 주니어개발 입문자의 눈높이에 맞춰 쉽고 자세하게 알아보겠습니다!

목차

  • pg_hba.conf 파일, 왜 중요할까요?
    • 보안의 첫 관문: 인증 제어와 방식 지정
  • pg_hba.conf 기본 구문 파헤치기
    • TYPE: 연결 유형
    • DATABASE: 대상 데이터베이스
    • USER: 대상 사용자/역할
    • ADDRESS: 클라이언트 주소
    • METHOD: 인증 방식 (trust, md5, scram-sha-256 등)
  • 실제 예시: pg_hba.conf 설정 분석 (주의 사항 포함!)
    • local all all trust
    • host all all 127.0.0.1/32 md5
    • host all all 0.0.0.0/0 md5
  • PostgreSQL 문제 해결과 pg_hba.conf의 역할
  • pg_hba.conf, 이것만은 꼭 기억하세요!

pg_hba.conf 파일, 왜 중요할까요?

 

pg_hba.conf 파일은 PostgreSQL 데이터베이스의 보안 설정에서 가장 중요한 파일 중 하나입니다. 이 파일이 제대로 설정되지 않으면, 데이터베이스에 대한 무단 접근이 허용되거나, 반대로 정당한 사용자의 접속이 차단될 수 있습니다.

보안의 첫 관문: 인증 제어와 방식 지정

  • 인증 제어: 누가(User), 어디서(Host/IP Address), 어떤 데이터베이스(Database)로 접속할 수 있는지를 통제합니다.
  • 인증 방식 지정: 비밀번호 기반(md5, scram-sha-256), OS 사용자 기반(peer, ident), 또는 비밀번호 없이(trust) 등 다양한 인증 방식을 지정합니다.

예를 들어, postgres 사용자의 비밀번호가 설정되지 않아 로그인할 수 없던 문제의 경우, 이 파일의 부재 또는 잘못된 설정 때문일 수 있습니다.

pg_hba.conf 기본 구문 파헤치기

 

pg_hba.conf 파일의 각 라인은 하나의 인증 규칙을 정의하며, 주석은 #으로 시작합니다. 기본 형식은 다음과 같습니다:

TYPE DATABASE USER ADDRESS METHOD [OPTIONS]

각 필드의 의미를 자세히 살펴보겠습니다:

TYPE: 연결 유형

  • local: 유닉스 도메인 소켓을 통한 연결을 의미하며, 대부분 같은 서버/컨테이너 내부에서만 가능합니다.
  • host: TCP/IP 연결을 의미하며, 네트워크를 통한 IPv4 주소용 연결입니다.
  • hostssl: SSL 암호화된 TCP/IP 연결을 의미합니다.
  • hostnossl: SSL 암호화되지 않은 TCP/IP 연결을 의미합니다.

DATABASE: 대상 데이터베이스

  • all: 모든 데이터베이스에 적용됩니다.
  • replication: 복제 연결에 적용됩니다.
  • 특정 데이터베이스 이름: 명시된 데이터베이스에만 적용됩니다.
  • sameuser: 사용자와 같은 이름의 데이터베이스에 적용됩니다.
  • samerole: 역할과 같은 이름의 데이터베이스에 적용됩니다.

USER: 대상 사용자/역할

  • all: 모든 사용자에게 적용됩니다.
  • 특정 사용자/역할 이름: 명시된 사용자 또는 역할에만 적용됩니다.
  • +groupname: 특정 역할 그룹의 모든 멤버에게 적용됩니다.

ADDRESS: 클라이언트 주소

  • all: 모든 IP 주소에 적용됩니다.
  • 0.0.0.0/0: 모든 IPv4 주소를 의미합니다.
  • ::/0: 모든 IPv6 주소를 의미합니다.
  • 192.168.1.0/24: 특정 IP 대역을 CIDR 형식으로 지정합니다.
  • 127.0.0.1/32: 로컬 호스트에만 적용됩니다.

METHOD: 인증 방식 (trust, md5, scram-sha-256 등)

  • trust: 비밀번호 없이 연결을 허용합니다. 이는 매우 위험하며, 초기 설정이나 로컬 디버깅용으로만 사용하고 프로덕션에서는 절대 사용하지 않아야 합니다.
  • md5: MD5 해시된 비밀번호 인증을 사용합니다. 일반적인 비밀번호 인증 방식입니다.
  • scram-sha-256: 더 강력한 SCRAM-SHA-256 비밀번호 인증을 사용합니다 . md5보다 보안이 강화된 최신 방식입니다.
  • peer (local 전용): 클라이언트의 OS 사용자 이름과 PostgreSQL 사용자 이름이 같으면 인증을 허용합니다.
  • ident (host 전용): 클라이언트 시스템의 ident 서버를 통해 사용자 이름을 확인합니다.
  • password: 암호화되지 않은 비밀번호를 전송합니다. 보안상 매우 위험하므로 사용하지 않습니다.
  • reject: 연결을 무조건 거부합니다.
  • OPTIONS: map, krb_srvname 등 추가적인 옵션을 지정할 수 있습니다.

실제 예시: pg_hba.conf 설정 분석 (주의 사항 포함!)

사용자님의 경우 다음과 같은 pg_hba.conf 설정 내용이 문서에 포함되어 있었습니다:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    replication     repl            192.168.10.0/24         trust
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
host    all             all             0.0.0.0/0               md5

각 라인의 의미를 살펴보겠습니다:

  • local all all trust:
    • 의미: PostgreSQL 컨테이너 내부에서 유닉스 도메인 소켓을 통해 접속하는 모든 사용자(all)가 모든 데이터베이스(all)에 비밀번호 없이(trust) 접속할 수 있도록 허용합니다. psql -U postgres로 접속하여 ALTER USER postgres WITH PASSWORD ... 명령을 실행할 수 있었습니다.
    • 역할: 이전에 postgres 사용자에게 비밀번호가 할당되지 않아 로그인할 수 없던 문제를 해결하는 데 결정적인 역할을 했습니다. 이 설정 덕분에 비밀번호 없이
  • host all all 127.0.0.1/32 md5:
    • 의미: IPv4 로컬호스트(컨테이너 내부의 127.0.0.1)를 통해 접속하는 모든 사용자(all)가 모든 데이터베이스(all)에 MD5 비밀번호 인증(md5)을 사용하여 접속하도록 허용합니다.
  • host all all ::1/128 md5:
    • 의미: IPv6 로컬호스트(::1)를 통해 접속하는 모든 사용자(all)가 모든 데이터베이스(all)에 MD5 비밀번호 인증(md5)을 사용하여 접속하도록 허용합니다.
  • host all all 0.0.0.0/0 md5:
    • 의미: 모든 IPv4 주소(0.0.0.0/0)를 통해 접속하는 모든 사용자(all)가 모든 데이터베이스(all)에 MD5 비밀번호 인증(md5)을 사용하여 접속하도록 허용합니다.
    • 주의: 0.0.0.0/0은 인터넷상의 모든 IP를 허용한다는 의미이므로, 보안상 매우 위험할 수 있습니다. 실제 서비스 환경에서는 반드시 필요한 특정 IP 대역으로 제한하거나, VPN/SSH 터널링 등 추가 보안 조치를 사용해야 합니다.

PostgreSQL 문제 해결과 pg_hba.conf의 역할

pg_hba.conf 파일은 데이터베이스 접속 문제 해결에 있어 매우 중요한 요소입니다. 초기

postgres 사용자 비밀번호 문제와 같이 User postgres has no password assigned 오류를 해결하기 위해, local all all trust 설정은 비밀번호 없이 postgres 계정으로 접속하여 ALTER USER 명령을 실행할 수 있는 발판을 마련했습니다.

또한, 이 파일을 통해 PostgreSQL 컨테이너 내부 및 외부에서 클라이언트가 데이터베이스에 연결할 수 있는 규칙이 명확히 정의됩니다. 따라서 pg_hba.conf는 데이터베이스 보안의 핵심이므로, 특히 trust0.0.0.0/0과 같은 광범위한 설정은 문제 해결 후 반드시 더 엄격하게 조정하여 보안을 강화해야 합니다.

pg_hba.conf, 이것만은 꼭 기억하세요!

 

pg_hba.conf 파일은 PostgreSQL 데이터베이스의 접근 제어와 인증 방식을 정의하는 핵심 보안 파일입니다.

TYPE, DATABASE, USER, ADDRESS, METHOD 다섯 가지 주요 필드를 통해 연결 규칙을 설정하며 ,

trust와 같은 인증 방식은 초기 설정이나 디버깅 외에는 보안상 매우 위험하므로 사용에 각별히 주의해야 합니다.

개발자 주니어개발 입문자로서 PostgreSQL을 다룰 때, pg_hba.conf의 역할과 중요성을 정확히 이해하는 것은 데이터베이스를 안전하게 운영하는 데 필수적입니다. 항상 최소 권한의 원칙을 지키고, 프로덕션 환경에서는 엄격한 보안 설정을 적용하는 것을 잊지 마세요!

반응형