: PostgreSQL의 pg_hba.conf 파일을 통해 외부접근에 대한 처리는 되도록 배재하는것이 좋습니다.
외부접근제어는 시스템 OS Kernel Level의 Packet Filter( iptable, ipchain...)를 이용하는 것이 PostgreSQL로의 불법로그인으로 인한 PostgreSQL 인증체크처리 부하라던지 전체적인 성능에 이득이 됩니다.
즉, Kernal단에서 해당 IP나 IP Block에 대해서 접근제어를 해주는 것이 전체적인 성능에 좋습니다.
pg_hba.conf
디폴트 pg_hba.conf 파일은, 데이터 디렉토리가 initdb로 초기화될 때에 설치되며, initdb에서 생성된 클러스터 폴더(PGDATA)에 들어 있습니다.
( HBA : host-based authentication 호스트 기반의 인증 약어 )
pg_hba.conf는 PostgreSQL의 인증시스템관련 정보를 담고 있는 설정파일로 설정방법이 간단한편으로 실제적인 계정에 대한 정보는 PostgreSQL의 카탈로그 테이블인 pg_user에서 관리하고 접근 Host나 Host의 데이터 전송방식과 암호화 전송방식에 대한 설정을 가지고 있다. 그런 이유로 계정에 대한 권한이나 패스워드등의 변경은 실시간으로 적용이 가능하나 접근자의 접근방식과 암호전달 방식에 대해서는 pg_ctl reload나 pg_ctl restart를 통해 daemon이 다시 pg_hba.conf파일을 로드하게 해주어야 한다. 불편성이 있는듯 하지만, 불법접근에 대한 처리시에 빠른 응답으로 Postgres Server부담을 줄이기 위함으로 최대한의 성능을 위한 것입니다.
[ pg_hba.conf 내용 ]
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections: 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 enterprisedb 127.0.0.1/32 md5 #host replication enterprisedb ::1/128 md5
작업 방법
1.Host Type
Host Type은 접근자의 접근위치와 통신의 암호화 관련 설정입니다.
local, host, hostssl, hostnossl을 지원합니다.
local은 자칫 localhost로 생각할 수 있겠지만, local은 Unix Domain Socket을 통한 접속에 해당되는 것으로 다소 햇갈릴수 있으니 주의 하시기 바랍니다.
데이터베이스의 백업 및 복구
hostssl은 ssl인증서를 통한 암호화 통신만 지원하며 localhost, 127.0.0.1식의 즉 TCP/IP접속에 해당된다.
hostnossl은 ssl접속은 불가능하며, TCP/IP통신을 지원합니다.
host나 hostssl로 설정한 상태에서 SSL기능을 사용하시려면 Postgres컴파일시 --with-openssl옵션을 주어야 하며, postgresql.conf에 ssl=true로 설정을 해주셔야만 합니다.
2.Database Name
특정한 디비에 대한 접속을 제한할 수 있으며 ,(콤마)로 여러 개의 DB로 접근 제어가 가능합니다.모든 DB에 대한 접근을 풀려면 all로 설정하시면 됩니다. 만약에 설정할 DB가 수십개라면 기재하기 불편하실경우 @dblist.txt 식으로 설정하고 dblist.txt을 PGDATA로 설정한 폴더의 안에 넣어 두시면됩니다.
3.User Name
계정설정으로 ,(콤마)구분으로 할 수 있으며, Database의 @파일명 식으로 따로 파일을 만들어서 처리하실수도 있습니다. PostgreSQL의 계정 그룹 카탈로그 테이블인 pg_group 또는 create_group 명령으로 그룹을 만들어 계정들은 하위(SYSID)에 묶어두었을때는 +(플러스) 키를 붙인 그룹명으로 설정하면 해당 그룹에 대한 모든 접근이 가능해집니다.
4.CIDR-ADDRESS or IP-Mask
IPv4 CIDR구분으로 해당 C Class에 대해 모두 접근처리를 할 경우는 : xxx.xxx.xxx.0/24
해당 IP에 대한 접근처리를 할 경우는 : xxx.xxx.xxx.xxx/32
5.Authentication Method
이 부분은 실제적인 계정의 패스워드에 대한 서버로의 전송을 어떻게 할 것인가를 정하는 것입니다.
PostgreSQL Server와 Client와의 접속에는 처음 Client가 접속을 하게 되면 pg_hba.conf에 대해 검색해서 해당 접속에 대한 접근허용을 확인하고 확인이 되면 이 Auth.Method에 설정된 암호화 방식으로 패스워드를 전송하라고 응답메시지를 보내고 다시 Client가 Server로 로그인을 하게 되는 방식입니다.
trust : 패스워드 없이 접근 가능
reject : 거부
md5 : 패스워드를 md5로 암호화해서 전송
crypt : crypt로 암호화 해서 전송 Postgres 7.2이후부터는 사용 않함. (이전버전설정 호환용)
password : text로 패스워드를 전송하는 것.
krb4, krb5 : KerberOS V4, 5를 지원한다.
ident : 접속 ClientOS User이름을 확인하는 방법?
pam : PAM(Pluggable Authentication Modules)서비스를 사용한 인증
하늘소2014-04-30 (수) 10:53
설정 예
# 로컬 시스템상의 모든 유저가 임의의 데이터베이스에
# 임의의 데이터베이스 유저명으로 Unix 도메인 소켓을 사용해 접속하는 것을 허가
# (로컬 접속에서는 디폴트).
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all all trust
# 로컬 loopback의 TCP/IP 접속을 사용하는 것은 위와 같다.
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 127.0.0.1/32 trust
# 분리된 netmask 열을 사용하고 있는 것을 제외하고 위와 같다.
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host all all 127.0.0.1 255.255.255.255 trust
# IP주소 192.168. 93. x를 가지는 모든 호스트의 모든 유저가,
# ident가 그 접속에 대해 보고하는 것과 같은 유저명(전형적으로는 Unix 유저명)으로
# 데이터베이스 "postgres"에 접속하는 것을 허가.
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host postgres all 192.168.93.0/24 ident sameuser
# 유저의 패스워드가 올바르게 입력되었을 경우,
# 호스트 192.168. 12.10부터의 유저가 데이터베이스 "postgres"에 접속하는 것을 허가
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host postgres all 192.168.12.10/32 md5
# 선행하는 "host"행이 없으면, 이 2행에 의해 192.168. 54.1으로 접속 시도는
# 모두 거부(이 항목이 최초로 일치되기 때문에).
# 다만, 인터넷상의 다른 모든 장소로부터의 Kerberos 5 접속은 허가.
# 제로 마스크는, 호스트 IP주소의 비트를 고려하지 않고
# 어느 호스트라도 조합할 수 있는 것을 의미합니다.
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 192.168.54.1/32 reject
host all all 0.0.0.0/0 krb5
# 192.168. x.x 호스트로부터의 유저가, ident 검사를 통과하는 경우,
# 어느 데이터베이스라도 접속을 허가. 만약, 예를 들면, ident가 "bryanh"라고 인정해
# "bryanh"가 PostgreSQL의 유저 "guest1"로서
# 접속 요구를 내는 경우, "bryanh"는 "guest1"로 접속이 허가된다고 합니다.
# 맵 "omicron"에 대한 기재사항이 pg_ident.conf에 있으면 접속을 허가.
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 192.168.0.0/16 ident omicron
# 로컬 접속에 대해서, 이하의 단 3행 밖에 기재가 없는 경우, 로컬 유저는
# 자신의 데이터베이스(데이터베이스 유저명과 같은 이름의 데이터베이스)에게만 접속 허가.
# 다만 관리자와 롤 "support"의 멤버는 모든 데이터베이스에 접속 가능.
# $PGDATA/admins 파일은 관리자의 리스트를 포함한다.
# 모든 경우에 패스워드가 필요.
#
# TYPE DATABASE USER CIDR-ADDRESS METHOD
local sameuser all md5
local all @admins md5
local all +support md5
# 위의 마지막 2행은 1개의 행으로 정리하는 것이 가능.
local all @admins,+support md5
# 데이터베이스의 열에는 리스트나 파일명도 사용할 수 있지만, 그룹은 사용할 수 없다.
local db1,db2,@demodbs all md5