티스토리 뷰

GIS 회사에 다니다보니 기본 DB는 PostgreSql을 많이 사용한다. (PostGis 함수 사용과 geometry 컬럼 타입 사용을 위해서)

그러다보니 PostgreSql의 이런저런 설정들도 하게 되는데 서버에 설치되어 있는 PostgreSql에 모든 외부 접속 가능하게 설정해놨더니 이상한 프로세스가 생기고 CPU와 메모리를 엄청 차지하게 되었다.

 

다행이 해당 프로세스들은 동기가 다 죽여버렸지만 이와 같은 일이 발생되지 않도록 하기 위해서는 PostgreSql DB 보안을 위해서 모든 외부 접속을 허용하지 않고 필요한 특정 IP들만 허용하도록 IP White List를 설정하기로 했다.

 

PostgreSql 외부 IP White List를 설정하는 방법은 매우 간단하다.

 

pg_hba.conf 파일 수정

PostgreSql이 설치되어 생성된 설정파일이 있는 위치에서 pg_hba.conf 파일만 수정하고 서비스를 재시작하면 된다.

외부 접속을 위한 방화벽 설정과 같은 것은 여기서 다루지 않겠다.

 

pg_hba.conf 파일 위치

PostgreSql을 기본 설치했을 경우 설정파일이 생성되는 위치는 아래와 같다.

Linux

/etc/postgresql/${version}/main/

 

Window

C:\Program Files\PostgreSQL\${version}\data

 

pg_hba.conf 파일에 IP White List 추가

pg_hba.conf 파일을 열어보면 조금 차이가 있을 수도 있지만 기본 아래와 같이 접속 내부 접속 허용만 되어 있다.

참고로 여기서 'local all postgres peer'로 설정되어 있다면 md5로 변경해야한다.

peer 인증은 외부 접속 없이 로컬에서만 사용할 때만 유효한 인증 방법이다.

# IPv4 local connections:
local	all				postgres		md5
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

 

여기에 예를 들어 '123.456.789.10' ip 주소를 가진 외부 네트워크에서 postgreSql에 접속하는 것을 허용하기 위해서는 아래 코드를 추가해준다.

host	all	all	123.456.789.10/32	md5

 

위 코드를 필요한 부분을 하나하나 풀어보면 아래와 같다.

'123.456.789.10'에서는 CIDR ip 표기법으로 표기해서 따로 ip-mask 부분을 입력하지 않았다. 만일 CIDR 표기법으로 입력하지 않았다면 ip-mask 부분의 값도 입력해야 한다.

host	${database}	${user}	${ip}	${ip-mask}	${auth-method}

 

host

이 부분은 기본 로컬 설정을 보듯이 local로 변경해서 local에서 사용할 것에 대한 설정도 할 수 있으며 ssl을 사용한 외부 접속에서만 허용할 hostssl, ssl을 사용하지 않은 외부 접속에서만 허용할 hostnossl로도 입력할 수 있다.

 

${database}

말 그대로 접속을 허용할 database 이름을 작성해주면 된다. 만일 하나의 database로 특정되지 않는다면 all을 사용해 모든 database에 접근을 허용할 수 있다.

 

${user}

DB의 특정 user를 의미한다. CRUD가 외부에서 함부로 되는 것을 방지하기 위해서 이 부분에 이러한 CRUD에 대해 권한을 부여한 user를 넣기도 한다.

 

${ip}

이 부분에 허용할 외부 네트워크 ip 주소를 넣는다. '123.456.789.10/32'와 같이 CIDR 표기법으로 입력했을 경우 뒤의 ${ip-mask} 부분은 입력할 필요가 없으나 '123.456.789.10'와 같이 입력했을 경우에는 ${ip-mask}를 입력해줘야 한다.

 

${ip-mask}

${ip} 부분에 CIDR 표기법으로 ip 주소를 입력해주지 않았을 경우 입력해야한다. '255.255.255.255'와 같이 해당 ip mask 값을 입력해주면 된다.

 

${auth-method}

'md5'로 입력했던 부분인데 외부에서 DB에 접속할 때 인증하는 방식을 입력하는 부분이다. 기본 md5 인증 방식을 이용한다.

그 밖에 trust, reject, password, ident 등의 방식이 있는데 trust는 무조건 허용한다는 의미이고 reject는 무조건 허용하지 않는 다는 의미로 해당 외부 접속은 무조건 허용하지 않는 다는 의미로 사용할 수도 있다.

password는 암호화되지 않은 비밀번호를 텍스트 그대로 전송해서 인증하는 방식으로 암호화가 이뤄지지 않기에 보안적으로 문제가 있을 수 있다.

ident는 클라이언트의 이름을 보고 허용하는 것으로 'ident ${client_name}' 식으로 ident만 입력하지 않고 뒤에 허용할 클라이언트 이름을 입력해 사용한다.

참고로 제일 많이 사용하는 md5는 md5 암호화 방식으로 비밀번호를 암호화해 그것으로 인증을 하는 방식이다.

 

 

위의 설정들을 참고해서 pg_hba.conf에 외부 ip white list들을 설정 완료했다면, pg_hba.conf 파일을 저장해준다.

 

 

PostgreSql 설정 파일 적용

설정 파일을 변경했다고 해서 바로 해당 설정이 DB에 반영되는 것은 아니다.

 

Linux에서는 아래 명령어를 통해 간단하게 postgreSql 서버를 재시작해 설정파일을 반영시킬 수 있다.

systemctl restart postgresql

 

Window에서는 pgAdmin에 들어가서 설정파일을 reload 해와서 반영 시킬 수 있다.

 

설정파일 반영이 완료 되었다면 이제 허용한 외부 IP에서만 해당 PostgreSql DB에 접근할 수 있는 것을 확인할 수 있을 것이다.

 

 

 

 

✋ pg_hba.conf 파일 공식 문서

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

 

20.1. The pg_hba.conf File

20.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

 

✋ peer 인증

https://postgresql.kr/docs/11/auth-peer.html

 

20.9. 피어(peer) 인증

20.9. 피어(peer) 인증 피어(peer) 인증 방법은 클라이언트의 운영 체제 사용자 이름을 커널로부터 획득하고, 허용된 데이터베이스 사용자 이름으로 사용함으로써 작동된다(선택적 사용자 이름 매핑

postgresql.kr

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함