홈페이지 : http://www.openphp.com , http://www.openpython.com
안녕 하세요? 조성준 입니다.!
Warn: 실력이 미천하고 어설프니 도움이 않될수 있습니다.!
PostgreSQL의 인증관련(접근과 패스워드암호화 관련) 설정파일인 pg_hba.conf에 대해 설명합니다.
잠깐 ! : PostgreSQL의 pg_hba.conf 파일을 통해 외부접근에 대한 처리는 되도록 배재하는것이 좋습니다. 외부접근제어는 시스템 OS Kernel Level의
packet Filter(iptable,ipchain,pf,ip_f..)를 이용하는 것이 PostgreSQL로의 불법로그인으로 인한 PostgreSQL인증체크처리 부하라 던지 전체적인 성능에 이득이 됩니다.
이미Kernel단에서 해당 IP나 IP Block에 대해서 접근제어를 해주는 것인 전체적인 성능에 좋습니다.
- PG_HBA.conf -
pg_hba.conf는 PostgreSQL Host Base Authentication.의 약자로 initdb에서 생성된 클러스터 폴더(PGDATA)에 들어 있습니다. pg_hba.conf는 PostgreSQL의 인증 시스템관련 정보를 담고 있는 설정파일로 설정방법이 간단한편으로 실제적인 계정에 대한 정보는 PostgreSQL의 카탈로그 테이블인 pg_user 에서 관리하고
접근 Host나 Host의 테이타 전송방식과 암호화 전송방식에 대한 설정을 가지고 있다. 그런 이유로 계정에서 대한 권한이나 패스워드등의 변경은 실시간으로 적용이 가능하나 접근자의 접근방식과
암호전달 방식에 대해서는 pg_ctl reload나 pg_ctl restart를 통해 daemon이 다시 pg_hba.conf파일을 로드하게 해주어야 한다. 불편성이 있는듯 하지만. 불법 접근에 대한 처리시에 빠른 응답으로 PostgreSQL Server 부담을 줄이기 위함으로 최대한의 성능을 위한 것이다.
* 작성방법 *
[] : 로 불력화한 부분은 제외돼도 상관없다는 뜻입니다.
인용 또는 결과 :
HostType Databasename username [CIDR-addsredd or IP-Mask] Auth.-method [Auth.OPtion]
[root@good /root]$ _
* HostType *
Host타입은 접근자의 접근 위치(Unix Domain Socket 또는 TCP/IP와 SSL TCP)와 통신의 암호화 관련 설정입니다. local , host , hostssl , hostnossl 을 지원한다.
local은 자칫 locahost로 생각할수 있겠지만 local은 Unix Domain Socket을 통한 접속에 해당하는 것으로 다소 해깔릴수 있으니 주의 하시기 바랍니다.
잠깐! : 기존에 DB Application에서 PostgreSQL에 접속시 host 명을 주지 않으며, Unix Domain Socket으로 통신을하였으나 PostgreSQL 8.0이상부터는
host=/tmp 또는 host=/tmp/.s.PGSQL.포트번호 로 접근을 하셔야만 pg_hba.conf에 설정한 local 설정에 해당됩니다. 주의 하시기 바랍니다.
hostssl은 ssl인증서를 통한 암호화 통신만 지원하면 localhost , 127.0.0.1 식의 즉 TCP/IP접속에 해당된다.
hostnossl은 ssl 접속은 불가능 하며, TCP/IP통신을 지원합니다.
host나 hostssl 로 설정한 상태에서 SSL기능을 사용하실려면 PostgreSQL 컴파일시 --with-openssl 옵션을 주어야 하며, postgresql.conf에 ssl=true로 설정을 해주셔야만 합니다.
* DataBase Name *
특정한 디비에 대한 접속을 제한할수있으며 ,(콤마)로 여러개의 디비로 접근 제어가 가능합니다. 모든 디비에 대한 접근을 풀려면 all로 설정하시면 됩니다. 만약에 설정할 디비가 수십개라면 기재하기 불편하실경우 @dblist.txt 식으로 설정하고 dblist.txt을 PGDATA로 설정한 폴더의 안에 넣어 두시면됩니다.
* username *
계정설정으로 ,(콤마)구분으로 할수 있으며,Database의 @파일명 식으로 따로 파일을 만들어서 처리하실수도 있습니다. PostgreSQL의 계정 그룹 카탈로그 테이블인 pg_group 또는 create group 명령으로 그룹을 만들어 계정들은 하위(SYSID)에 묶어두었을때는 +(플러스) 키를 붙인 그룹명으로 설정하면 해당 그룹에 대한 모든 접근이 가능해집니다.
* [CIDR-addsredd or IP-Mask] *
이 부분으로 접근에 대한 IP나 IP Block을 차단하는것보다는 Kernel Level의 Packet filter로 막는것이 전체적인 성능향상에 도움이 됩니다. 다만 다중사용(웹호스팅,ASP등)의 경우를 제외하고는 이부분 사용을 자재해주시기 바랍니다. PortgreSQL의 기본 Service Port는 5432입니다.
IPv4 CIDR 구분으로 해당 C Class에 대해 모두 접근처리를 할떄는 : xxxx.xxxx.xxxx.0/24 해당 IP에 대한 접근처리를 하실떄는 : xxxx.xxxx.xxxx.xxxx/32
위의 식으로 설정하시면 되면 아래 예제에서 좀더 자세히 알려드리겠습니다.
* Authentication Method *
이 부분은 실제적인 계정의 패스워드에 대한 서버로의 전송을 어찌할것인가를 정하는것입니다. PostgreSQL Sever와 Client와의 접속에는 처음 Client가 접속을 하게 되면 pg_hba.conf에 대해 검색해서 해당 접속에 대한 접근허용을 확인하고 확인이 되면 이 Auth.Method에 설정된 암호화 방식으로 패스워드를 전송하라고, 응답메세지를 보내고 다시 CLient가 Server로 로그인을 하게 되는 방식입니다.
인용 또는 결과 :
trust : 패스워드 없이 접근 가능.주위할것은 local(Unix Domain Socket)이외에는 적극 비추천.!
reject : 당돌히 거부.!!
md5 : 패스워드를 md5로 암호화 해서 전송 (기본 적극 추천)
crypt : cryppt 로 암호화 해서 전송 PostgreSQL 7.2 이후부터는 사용되지 않습니다.(이전 버전설정 호환용)
password : 이건 그냥 text로 패스워드를 전송하는건데 사실 하느니 못합니다. 스니핑에 바로 보이니
krb4,krb5 : KerberOS V4,5를 지원한다.
ident : IDent Map방식은 추천드리지는 않습니다. 로그인후 접속유지되는 구조가 아닌경우는
pam : PAM(Pluggable Authentication Modules) 서비스를 사용한 인증입니다.ident와 마찬가지로 비추
[root@good /root]$ _
위에서 설명드린것중 SSL,KerberOS와 Ident,Pam인증을 따로 다른 장에서 설명을 드리겠습니다. (현재 테스트중) 추천드리지않는 다고하나 이는 일반적인 평준화되어진 시스템에서는 비추천이지만 특정서비스에서는 필요한것이므로
테스트하여 완벽해지게 스스로 이해하고나면 올려드리겠습니다.(시간이 좀 나면요 ^^) 위중 TCP/IP를 통한 접속의 경우는 기본은 md5로 하시기 바랍니다. 최소한의 보안을 위해 md5를 쓰시기 바랍니다.
- pg_hba.conf 설정예제 -
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust
[root@good /root]$ _
설명 : local접속 즉 Unix Domain Socket을 통한 접속에 대해 모든 디비,유저에 대해서 패스워드 없이접근을 허용함
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust
[root@good /root]$ _
설명 : TCP/IP접근시 127.0.0.1에서 접근시 모든디비,모든유저로의 접근에 패스워드 필요없음
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust
[root@good /root]$ _
설명 : TCP/IP접근시 127.0.0.1에서 접근시 모든디비,모든유저로의 접근에 패스워드 필요없음
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all openphp 192.168.0.1/32 md5
[root@good /root]$ _
설명 : 192.168.0.1 IP에서 TCP/IP로 openphp계정으로 모든 디비에 대한 접근이 허용되며, md5로 패스워드를 암호화 하여야함
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD host openphp,openpython openphp 192.168.0.1/32 md5
[root@good /root]$ _
설명 : 192.168.0.1 IP에서 TCP/IP로 openphp계정으로 openphp,openpython 디비에 대한 접근이 허용되며, md5로 패스워드를 암호화 하여야함
인용 또는 결과 :
# TYPE DATABASE USER CIDR-ADDRESS METHOD host remotedb +remotegroup 0.0.0.0/0 md5
[root@good /root]$ _
설명 : 원격 어디서든지 remotegroup의 SYSID로 설정된 계정들로 remotedb로의 접근이 허용되며 패스워드는 md5로 패스워드 암호화 하여야함
위와 같이 간단히 설정예제를 알려드렸습니다.
좀더 많은 예제를 원하신면 http://borg.postgresql.org/docs/8.0/interactive/client-authentication.html#EXAMPLE-PG-HBA.CONF로 가보시기 바랍니다.
|