포스트그레스의 pg_hba.conf 활용 <author>TPLUG(동명정보대학교 POWER LINUX USER GROUP) 주 효식 <htmlurl url="mailto:nogadax@kldp.org" name="nogadax@kldp.org"> <date>2000년 4월4일 <abstract>이 문서는 포스트그레스의 인증 방식등의 환경설정 파일인 pg_hba.conf를 설명하고, 이에 따른 사용상의 예제등을 제시하고자 한다. 또한, JDBC 를 이용한 connection 예제를 보여준다. </abstract> <toc> <sect>Domain Socket <p>pg_hba.conf 설정은 두가지의 방법이 있다. 첫째는 Unix Domain Socket 방법이고 둘째는 Internet Domain Socket 방법이다. <p>다음은 이들 방법의 설명이다. <p>socket 이란 unix 상의 프로세스간 통신을 위해 사용되는 메카니즘으로서, 이러한 통신에는 동일한 기계상의 프로세스간 통신과 네트워크 프로토콜을 이용하는 네트 워크상의 프로세스간 통신이 있다. <p>socket 은 domain 이라는 공통된 통신 특성에 따라 분류되며, 동일한 기계상의 프로세스간 통신을 Unix Domain Socket이라하고, 네트워크상의 프로세스간 통신 을 Internet Domain Socket (혹은 TCP/IP Domain Socket )라 한다. <p>Unix Domain Socket의 좋은 예로는 telnet 을 통한 telnet 디몬과 포스트그레스 디몬과의 통신이다. <p>Internet Domain Socket의 좋은 예로는 ODBC 나 JDBC 를 통해 원격지 즉, 다른 기계상에서 JDBC를 이용한 클라이언트 프로세스와 포스트그레스 디몬과의 통신이다. 그러므로 JDBC 혹은, ODBC 를 통해 포스트그레스 DB서버와의 connection 을 설정하 려할때 pg_hba.conf 의 설정은 Internet Domain Socket 방식으로 설정하여야 한다. <p>만약 127.0.0.1 인 IP Address 가 동일한 기계상의 프로세스간 통신을 위해 사용되었다 할지라도 127.0.0.1 은 네트워크상의 특수한 IP 이므로 이는 네트워크 프로토콜을 이용하는 네트워크상의 프로세스간 통신이다. 그러므로 이는 Internet Domain Socket 이 된다. <sect>pg_hba.conf 설정 <p>(postgresql Host-Based-Access Control) <p>보통 pg_hba.conf 는 $PGDATA 디렉토리에 존재한다. 예로서 포스트그레스의 디폴트 디렉토리는 /usr/local/pgsql이다. 그리고 PGDATA 의 값은 보통 /usr/local/pgsql/data 이다. <p>pg_hba.conf 파일은 일반적으로 레코드들로 이루어져 있으며 레코드란 특정한 형태를 지닌 하나의 라인이다. 라인의 제일 앞에 # 로 되어 있으면 이는 주석 처리가 되어 있는 것이다. 또한 라인이 공란이면 이는 무시되어 진다. <p>pg_hba.conf 의 레코드는 두가지로 분류되며 하나는 Unix Domain Socket 형이며 다른 하나는 Internet Domain Socket(TCP/IP Domain) 형이다. <sect1>Unix Domain Socket 설정<p> <tscreen><verb> 레코드 형식 local database authentication method : local은 unix domain socket 방식의 연결을 허용한다. database 는 연결을 허용하려는 database 이며 모든 database 에 연결을 허용하려면 all 을 적으면 된다. authentication method 는 사용자 인증방식을 설정한다. 예 1) local all trust : local 에서 모든 데이타베이스(all)에 대한 연결을 허용하며 접속하려는 사용자들은 모두 믿을수 있는(trust) 사용자로 인정하며 별다른 인증절차를 거치지 않고 바로 접속할 수 있다. psql을 통한 접속 : psql template1 예 2) local template1 crypt : local 에서 template1 데이타베이스에만 접속을 허용하며 인증 절차로 crypt 방식을 거친다. crypt는 사용자에 대한 패스워드를 묻고 이 패스워드는 암호화되어 보내어진후 pg_shadow라는 파일에 있는 패스워드와 비교한다. 비교된 패스워드가 맞아 떨어지면 접속이 허용된다. psql을 통한 접속 : psql -u template1 (-u 옵션은 유저명과 패스워드를 묻는다) </verb></tscreen> <sect1>Internet Domain Socket 설정<p> <tscreen><verb> 레코드 형식 host databse IP IP_mask auth method : jdbc 와 같은 커넥션을 통해 통신을 하는 client 들이 연결을 하려할 때 허용하거나 불허를 위해 설정한다. (즉, 다른 호스트에서 직접 포스트그레스의 사용자 계정 으로 연결을 하려할 때) host template1 210.110.144.161 255.255.255.255 crypt : 210.110.144.161 의 IP 만이 crypt 방식으로 template1 데이타베이스에 접속을 허용한다. host all 0.0.0.0 0.0.0.0 password : 모든 데이타베이스와 모든 IP 주소들이 password 방식으로 접속을 할수가 있다. </verb></tscreen> <sect1>Authentication method(인증 방법)<p> <tscreen><verb> TRUST : 별다른 인증 절차없이 바로 허용한다. REJECT : 무조건 접속을 거부한다. CRYPT : 유저의 패스워드를 묻는다. 이때 패스워드는 암호화되어 포스트그레스에게 보내어진다. PASSWORD : 유저의 패스워드를 묻는다. 이때 패스워드는 암호화되지 않은 문자 그대로 서버측인 포스트그레스에게 보내어진다. 다음의 인증 방법은 TCP/IP Domain 에만 해당된다. krb4 : Kerberos V4 krb5 : Kerberos V5 ident : 클라이언트 상의 ident 서버가 사용되어지며 $PGDATA/pg_ident.conf 를 따로 설정하여야 한다. </verb></tscreen> <p>또한, 네트워크 상의 커넥션을 하려할 때 논리적인 보안 터널을 사용하는 방법이 있다. 이는 ssh 보안 기법을 적용한 것으로 클라이언트와 포스트 그레스 서버 사이의 네트워크 컨넥션을 ssh를 이용하여 암화화할 수 있다. 적절한 적용으로 안전한 네트워크 컨넥션을 만들 수 있다. <tscreen><verb> 참고사이트는 다음과 같다. http://www.heimhardt.de/htdocs/ssh.html </verb></tscreen> <sect>설정 테스트<p> <sect1>포스트그레스 슈퍼유저 패스워드 <p>테스트를 위해 postgres 의 슈퍼 유저 계정의 패스워드를 만들어야 한다. 이 패스워드는 단지 포스트그레스에 접속을 위한 것이며 telnet 에 로긴을 위한 패스워드는 아니다. <p>여기서 포스트그레스의 슈퍼유저 계정을 postgres 이고 패스워드는 nogadax라고 가정하며 이에 대한 절차는 다음과 같다. <tscreen><verb> 단계 1) [postgres@nogadax postgres]$ psql template1 template1=> alter user postgres with password "nogadax"; ... template1=>\q 단계 2) [postgres@nogadax postgres]$ vi $PGDATA/pg_hba.conf ........... 이부분에서 마지막 부분의 라인을 주석처리한 후 "local all crypt" 을 추가한다. 그런 후 저장하고 빠져 나온다. ........... 단계 3) [postgres@nogadax postgres]$ psql -u template1 username : postgres passwd : nogadax template1=>create user testusr with password "testusr" creatdb; ........... template1=>select usename from pg_user; usename ---------- postgres testusr (2rows) template1=>\q 단계 4) [postgres@nogadax postgres]$ psql -u template1 username : testusr password : testusr template1=>\q [postgres@nogadax postgres]$ </verb></tscreen> <sect1>다양한 설정 예제<p> <tscreen><verb> 예 1) 다음은 가정 일반적인 설정이다. local all trust host all 127.0.0.1 255.255.255.255 trust local 를 통해 모든(all) 데이타베이스에 대한 접속을 허용하며 host 의 IP가 127.0.0.1 인 접속을 허용한다. 예 2) crypt 설정 crypt 에 대한 설정은 미리 유저명과 패스워드가 설정되어 있어야 한다. 또한 psql 접속시 -u 옵션을 적용하영야 한다. local all crypt host all 210.110.144.161 255.255.255.255 crypt 예 3) reject 설정 host all 210.110.144.161 255.255.255.255 reject 210.110.144.161 의 IP 를 가진 곳으로부터의 접속을 허용하지 않는다. 즉, 거부한다(reject) 예 4) password 설정 host all 210.110.144.161 255.255.255.255 password </verb></tscreen> <sect>JDBC CONNECTION 테스트<p> <p> 1. 클라이언트는 power linux 2 를 사용하였고 서버로는 accel 리눅스6.2 를 사용하였다. 포스트그레스는 7.0 beta3 을 사용하였고 jdk1.2.2 를 사용하였다. <p> 2. 테스트를 위해 클라이언트에 포스트그레스 JDBC 드라이버를 설치하여야 하며 설치시 주의할 점이 있다. 만약 jdk1.1.x 를 사용한다면 포스트그레스 JDBC1 을 사용하여야 하며 jdk1.2.x 를 사용한다면 포스트그레스 JDBC2 를 사용하여야 한다. <p> 3. 클라이언트에 JDBC 드라이버 설치 <p>먼저 포스트그레스 JDBC 드라이버를 클라이어트측의 적당한 디렉토리에 복사한다. 여기서는 /usr/local/lib/jdbc_post/ 디렉토리에 복사하였다. 그런 후 CLASSPATH 를 잡아준다. 다음은 CLASSPATH 설정 예이다. <tscreen><verb> CLASSPATH=/usr/local/lib/jdbc_post/postgresql.jar:. export CLASSPATH </verb></tscreen> <p>4. 포스트그레스 서버의 pg_hba.conf 를 적절히 수정해주어야 한다. 테스트할 JDBC 소스 예제를 수행할 클라이언트의 IP 가 "210.110.144.161" 이라고 가정하고 포스트그레스 DB 서버의 IP 주소는 "210.110.144.162"라고 가정한다. 테스트의 수행에 앞서 DB 서버측에 IP 주소가 "210.110.144.161"인 클라이언트측에 대한 인증 설정을 하여야 한다. 설정은 다음과 같이 pg_hba.conf 에 다음 라인을 적절히 추가하여야 한다. <tscreen><verb> host all 210.110.144.161 255.255.255.255 crypt </verb></tscreen> <p>5. 포스트그레스용의 적절한 예제 프로그램을 복사한 후 컴파일 한다. 여기서는 basic.java 를 가지고 테스트 한다. 포스트그레스 JDBC 관련 예제 프로그램은 포스트그레스의 소스 디렉토리의 /src/interfaces/jdbc/example 디렉토리에 있다. <p>또한 basic.java 소스의 제일 첫 라인의 "package example;"을 적절히 처리한다. (주석처리나 삭제등..) <p>컴파일은 다음처럼 한다. <tscreen><verb> javac basic.java </verb></tscreen> <p>실행은 다음처럼 한다. <p>java basic jdbc:postgresql://210.110.144.162/template1 postgres nogadax <p>위의 IP 어드레스 "210.110.144.162" 는 포스트그레스가 있는 서버의 IP 이고 "template1"은 접속하여 테스트하려는 데이타베이스명이다. "postgres"는 접속을 하려하는 포스트그레스 의 DB 사용자명이고 "nogadax" 는 패스워드이다. <p>IP 는 자신의 서버에 맞게 적절히 변경해준다. 만약 하나의 서버상에서 테스트를 하려한다면 IP는 127.0.0.1 이며 pg_hba.conf 의 설정은 다음과 같다. <tscreen><verb> host all 127.0.0.1 255.255.255.255 crypt </verb></tscreen> <sect>기타<p> <p>Domain Socket 에 대한 내용은 "Unix 의 내부 구조"(홍릉 과학 출판사,조유근 역)의 "프로세스간 통신"부분을 참조하였다. <p>pg_hba.conf 는 포스트그레스의 Admin's Guide 의 "SECURITY" 부분을 참조하였다. <p>포스트그레스 JDBC 드라이버 관련 내용은 포스트그레스의 Programmer's Guide 의 "JDBC Interface" 부분을 참조하였다. </article>