DataBase/PostgreSQL

[PostgreSQL] pg_hba.conf / DB의 보안설정의 필요성

범데이 2022. 5. 31. 01:17
728x90

1. 개요

익명의 호스트가 내 PostgreSQL DB에 인증을 시도하기 시작했다. 그것도 1초 주기로..

로그를 보아하니 postgres라는 Database에 postgres라는 User로 접근을 하려고 하는데, password인증에 실패하고 있다.

 

기존에는 모든 타입에 모든 Database, 모든 Host의 연결을 md5방식으로 접근을 하도록 설정해두었는데, 오늘은 이 보안 취약점을 보완하고자 PostgreSQL 의 보안 설정 파일인 pg_hba.conf 파일에 대해 알아보자.

 

 

(해당 포스팅은 postgresql 공식 가이드를 따라 번역 및 작성하였습니다. 자세한 내용은 해당사이트를 참고해 주세요.)

 

 

 

2. pg_hba.conf 파일이란?

PostgreSQL에서 클아이언트 인증은 일반적으로 pg_hba.conf라는 이름으로 데이터베이스 클러스터의 데이터 디렉토리에 저장되는 구성 파일에 의해 제어된다. (hba는 host-based authentication을 뜻한다.)

 

기본 pg_hba.conf 파일은 데이터 디렉토리가 initdb에 의해 초기화될때 설치된다.

 

 

파일의 일반적인 규칙은 다음과 같다.

- 파일의 일반적인 형식은 pg_hba.conf 파일 내 한 줄에 하나씩 레코드의 집합이다.

- #주석 문자 뒤의 모든 텍스트와 마찬가지로 빈 줄은 무시된다.

- 백슬래시로 줄을 끝내면 레토드를 다음 줄로 계속할 수 있다.(백슬래시는 줄 끝을 제외하고는 특별하지 않는다.)

- 레코드는 공백 이나 혹은 탭으로 구분되는 여러 필드로 구성된다. 

- 필드 값이 큰따옴표로 묶인 경우 필드에 공백이 포함될 수 있다.

- 데이터베이스, 사용자 또는 주소필드(예: all 또는 replication)에서 키워드 중 하나를 인용하면 단어가 특별한 의미를 잃어버리고 데이터베이스, 사용자 또는 호스트를 해당 이름과 일치시킨다.

- 백슬래시 줄 연속은 인용된 텍스트 또는 주석 내에서도 적용된다.

  

주요 작성 규칙은 다음과 같다.

- 각 레코드는 연결 유형, 클라이언트 IP 주소범위(연결 유형과 관련된 경우), 데이터베이스 이름, 사용자 이름 및 이러한 매개변수와 일치하는 연결에 사용할 인증 방법을 지정한다.

- 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름이 일치하는 첫 번째 레코드를 사용하여 인증을 수행한다.

- "fall-through" 또는 "backup"이 없다.

- 하나의 레코드가 선택되고 인증이 실패하면 후속 레코드는 고려되지 않는다.

- 일치하는 레코드가 없으면 액세스가 거부된다.

 

 

레코드는 다음과 같이 여러가지 포맷을 가질 수 있다:

local         database  user  auth-method [auth-options]
host          database  user  address     auth-method  [auth-options]
hostssl       database  user  address     auth-method  [auth-options]
hostnossl     database  user  address     auth-method  [auth-options]
hostgssenc    database  user  address     auth-method  [auth-options]
hostnogssenc  database  user  address     auth-method  [auth-options]
host          database  user  IP-address  IP-mask      auth-method  [auth-options]
hostssl       database  user  IP-address  IP-mask      auth-method  [auth-options]
hostnossl     database  user  IP-address  IP-mask      auth-method  [auth-options]
hostgssenc    database  user  IP-address  IP-mask      auth-method  [auth-options]
hostnogssenc  database  user  IP-address  IP-mask      auth-method  [auth-options]

 

주요 필드의 의미는 다음과 같다:

 

TYPE

local

  이 레코드는 Unix 도메인 소켓을 사용한 연결 시도와 일치한다. 이 유형의 레코드가 없으면 Unix 도메인 소켓 연결이 허용되지 않는다.

 

host

  이 레코드는 TCP/IP를 사용한 연결 시도와 일치한다. host레코드는 SSL 또는 비 SSL 연결 시도 및 GSSAPI 암호화 또는 비 GSSAPI 암호화 연결 시도와 일치한다.

 

 

DATABASE

  이 레코드가 일치하는 데이터베이스 이름을 지정한다. 값all은 모든 데이터베이스와 일치하도록 지정한다. sameuser은 요청된 데이터베이스의 이름이 요청된 사용자와 동일한 경우 레코드가 일치하도록 지정한다. samerole은 요청된 사용자가 요청된 데이터베이스와 이름이 같은 역할의 구성원이어야 함을 지정한다. 여러 데이터베이스 이름을 쉼표로 구분하여 제공할 수 있다.

 

 

USER

이 레코드와 일치하는 데이터베이스 사용자 이름을 지정한다. all은 모든 사용자와 일치하도록 지정한다. 그렇지 않으면 특정 데이터베이스 사용자의 이름이거나 앞에 +가 오는 구릅 이름이다. 쉼표로 구분하여 여러 사용자 이름을 제공할 수 있다.

 

 

ADDRESS

이 레코드와 일치하는 클라이언트 컴퓨터 주소를 지정한다. 이 필드에는 호스트 이름, IP 주소 범위 또는 아래에 언급된 특수 키워드 중 하나가 포함될 수 있다.

 

IP 주소 범위는 범위의 시작 주소에 대한 표준 숫자 표기법을 사용한 다음 슬래시( /) 및 CIDR 마스크 길이를 사용하여 지정된다. 마스크 길이는 일치해야 하는 클라이언트 IP 주소의 상위 비트 수를 나타낸다. 이 오른쪽의 비트는 주어진 IP 주소에서 0이어야 한다. /IP 주소, 및 CIDR 마스크 길이 사이에 공백이 없어야 한다.

 

이 방법으로 지정된 IPv4 주소 범위의 일반적인 예는 172.20.143.89/32단일 호스트, 172.20.143.0/24소규모 네트워크 또는 10.6.0.0/16더 큰 호스트에 대한 것이다. IPv6 주소 범위 ::1/128는 단일 호스트(이 경우 IPv6 루프백 주소) 또는 fe80::7a31:c1ff:0000:0000/96소규모 네트워크와 유사할 수 있다. 0.0.0.0/0모든 IPv4 주소를 ::0/0나타내고 모든 IPv6 주소를 나타낸다. 단일 호스트를 지정하려면 IPv4의 경우 32, IPv6의 경우 128의 마스크 길이를 사용해야한다. 네트워크 주소에서 후행 0을 생략하면 안된다.

 

 

AUTH-METHOD

연결이 이 레코드와 일치할 때 사용할 인증 방법을 지정한다. 몇가지 예로 다음 method들이 이ㅆ다.

 

trust

무조건 연결을 허용한다. 이 방법을 사용하면 PostgreSQL 데이터베이스 서버에 연결할 수 있는 모든 사람이 암호나 기타 인증 없이 원하는 PostgreSQL 사용자로 로그인 할 수 있다.

 

reject 

무조건 연결을 거부한다. 이것은 그룹에서 특정 호스트를 필터링(reject) 하는데에 유용하다.예를 들어 한 라인은 특정 호스트의 연결을 차단할 수 있고 나중 라인은 특정 네트워크의 나머지 호스트가 연결할 수 있도록 한다.

 

scram-sha-256

scram-sha-256 인증을 수행하여 사용자의 암호를 확인한다.

 

md5

scram-sha-256 또는 MD5 인증을 수행하여 사용자의 암호를 확인한다.

 

 

 

 

3. 적용

아래와 같이 설치된 postgres의 pg_hba.conf파일을 규칙에 맞게 작성한 뒤에, 저장해준다.

 

그 다음, postgresql서비스를 재시작 해준다.

$sudo systemctl restart postgresql@14-main.service

 

 

4. 적용 결

 

적용한 후, 다음과 같이 액세스 로그가 바뀜을 확인할 수 있다. 

 

로그의 내용을 읽어보면, 동일하게 postgres라는 Database에 postgres라는 User로 접근을 시도하나, pg_hba.conf파일에 일치하는 레코드가 없어서 액세스가 거부됨을 확인할 수 있다.

 


#References

https://www.postgresql.org/docs/current/auth-pg-hba-conf.html

 

21.1. The pg_hba.conf File

21.1. The pg_hba.conf File Client authentication is controlled by a configuration file, which traditionally is named pg_hba.conf and is stored in …

www.postgresql.org

 

반응형

'DataBase > PostgreSQL' 카테고리의 다른 글

[PostgreSQL] Port 변경 방법  (0) 2022.06.04
원격 호스트의 Postgresql 접속하기  (0) 2022.01.23
[PostgreSQL] 시퀀스(Sequence) 사용법  (0) 2021.12.29