2018년 9월 28일 금요일

PostgreSQL 에서 pg_hba.conf 의 ADDRESS 설정

저번 포스트에서 postgresql.conf 의 listen_addresses 에 대해 기록을 했다.
listen_addresses 는 PostgreSQL 서버 입장에서 listen 을 할때에 대한 내용이었다.

pg_hba.conf 는 다른 컴퓨터(클라이언트)에 대한 control 내용이다.

편집기를 통해 pg_hba.conf 파일을 열어보면, 아래와 같은 형태로 되어 있다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

이번에는 ADDRESS 항목에 대해서만 기록해 보자.

pg_hba.conf 의 초기 내용은 아래와 같다.

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

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

"127.0.0.1/32" 라고 되어 있다.
클라이언트 IP 주소가 127.0.0.1 경우만 접속을 허용하겠다는 의미다.
클라이언트 IP 주소가 127.0.0.1 이라는것은,
결국 localhost 접속만 허용하겠다는 의미다.

% psql -h localhost
이 형태의 접속만 허용하겠다는 의미다.

다른 컴퓨터(클라이언트)의 접속을 허용하기 위해서는,
해당 컴퓨터의 IP 주소를 입력하면 된다.

예를 들어,
10.0.2.20 주소를 가지고 있는 클라이언트의 접속을 허용하기 위해서는,
"10.0.2.20/32" 라고 입력하면 된다.
이렇게 하면 10.0.2.20 주소를 가지고 있는 컴퓨터(클라이언트)만 접속할 수 있다.

host    all             all             10.0.2.20/32            trust

만약에,
10.0.2.30 주소를 가지고 있는 클라이언트도 접속을 허용하기 위해서는,
"10.0.2.30/32" 라고 추가적으로 입력하면 된다.
이렇게 하면 10.0.2.30 주소를 가지고 있는 컴퓨터(클라이언트)도 접속할 수 있다.

host    all             all             10.0.2.20/32            trust
host    all             all             10.0.2.30/32            trust

특정 IP 주소 말고, IP 주소 대역대를 입력할 수 있다.
"/32" 를 다른 값으로 넣어주면 된다.
"/32" "/24" 는 서브넷마스크를 의미한다.

host    all             all             10.0.2.0/24            trust

이렇게 하면 IP 주소가 10.0.2.x 대역의 주소를 가지고 있으면 접속이 가능하다.

만약 IP 주소 상관없이 모든 접속을 허용하고 싶게 하고 싶다면,
"/0" 을 입력하면 된다.

host    all             all             10.0.2.0/0            trust

지금까지는 TCP/IP socket 접속에 대한 내용이다.
그렇다면, local 은 무엇인가?

local   all             all                                     trust

local 은 Unix-domain socket(UDS) 을 의미한다.
그러므로 IP 주소를 입력하지 않는다.

아래 내용은 구글링을 통해서 얻은 정보이다.
--------------------------------------------------------------------------------------------
유닉스 도메인 소켓(Unix Domain Socket)은 프로세스간의 데이터 교환을 위한 기술 중 하나로, 파일 시스템을 통해 소켓통신 방식으로 내부 프로세스간의 통신을 하는 구조로 이뤄져있다. 약칭으로 UDS라고 표기하며, 간단하게 ‘유닉스 소켓(Unix socket)‘이라고 부르기도 한다. IPC(Inter Process Communication)의 일부로서 분류할 때는 ‘IPC소켓’이라고 부르기도 한다. POSIX의 표준 운영체제 구성요소 중 하나로 포함되어있다.

UDS의 가장 큰 특징은 소켓통신 방식을 써서 만든 프로세스에 사용이 가능하기 때문에 소켓프로그래밍 구조를 유지한 채로 로컬 프로세스와의 효율적 통신을 가능케 한다는 점이다. TCP, 혹은 UDP형식 데이터를 파일 시스템을 이용해서 통신하는 구조로, 파일 시스템을 통해 파일 주소 및 inode로 각 프로세스에서 참조되며, 통신은 운영체제의 커널상에서 이뤄지기 때문에 inet소켓을 이용해서 네트워크단을 이용해 전달하는 것보다 빠르며 부하가 적게 걸린다.(기본적으로 소켓통신 방식이 TCP/IP의 4계층을 거쳐 전달되기 때문에 지연이 발생하는데 반해서 유닉스 소켓은 어플리케이션 계층에서 TCP계층으로 내려가 바로 데이터를 전달하고, 수신측도 TCP계층에서 수신해 어플리케이션 계층으로 올라간다)
--------------------------------------------------------------------------------------------

Unix-domain socket(UDS)의 특징은 소켓프로그래밍 구조를 유지한 채로 프로세스간 통신이 가능하다.
장점은 모듈화를 잘 하면 소켓 코드를 재사용할 수 있다는 것과, 개발 공수가 적게 들어간다는 것이다.
일반 소켓프로그래밍과 차이점은 TCP 계층 2개만(Application, Transport) 사용한다는 것이다.

% psql
아무런 옵션없이 접속하는 경우, Unix-domain socket 으로 접속한다.

pg_hba.conf 를 사용해서 적절하게 접근 권한을 설정해서 보안을 설정하면 된다.
수정후에는 반드시 restart 혹은 reload 를 해야 한다.

% pg_ctl reload
% pg_ctl restart




출처

댓글 없음:

댓글 쓰기

화곡 어쩌라고, 굴사냥

석화찜(굴찜)을 먹으러 여의도로 갔다 그런데 재료가 모두 소진되었다고 마감이라고 한다 응? 다들 굴에 미쳤나? 굴을 찾아 헤매다 보니, 화곡까지 가게 되었다. 화곡은 처음 가본다. 첫인상은 "술집 겁네 많네" 피똥쌀때까지 마실 수 있...