웹 서버만 보안 서버를 만드는 것이 아니라, PostgreSQL 에서도
서버와 클라이언트간의 통신 패킷이 암호화 되어서 움직이는 보안 DB
서버를 만들 수 있습니다.
이것이 필요하려면, 다음 조건이 만족 되어야합니다.
서버가 일단 --with-openssl 옵션으로 만들어져야하고,
클라이언트가 ssl 연결 기능이 있어야합니다.
예를 들어서 php 컴파일 할때, 사용하는 libpq 놈이 --with-openssl
옵션으로 만들어져야합니다.
jdbc 쪽에서 ssl 연결 기능을 지원해야합니다.
1. 서버 만들기
openssl 패키지가 시스템에 설치 되어있고, PostgreSQL 소스코드에서
configure 명령 실행시 --with-openssl 옵션을 더 추가해줍니다.
openssl 패키지가 일반적인 디렉토리가 아닌 곳에 설치되어있다면 그
경로까지도 지정해 주시고.
다음 make all; make install 하면, 일단 프로그램은 갖추어진
샘입니다.
2. 보안 서버 개요
보안 서버를 이용하는 방법에는 서버에서 제공하는 ssl 기능을
이용하는 방법과, openssh 의 ssh 터널링 기법을 이용하는 방법이
있는데,
전자는 위에서처럼 서버 자체에서 ssl 기능이 포함 된 것이고,
후자는 이런 기능이 없는 서버와 통신은 ssh 프로그램을 이용해서 보안
연결 하는 것입니다.
여기서는 ssh 터널링 이야기는 생략하겠습니다. 그래서, 일단 ssl
기능이 포함되어있는 db 서버를 제대로 가능 하려면, 다음 작업이
필요합니다.
- postgresql.conf 파일에서 ssl 값을 true 로 바꾸고,
- pg_hba.conf 파일에서 hostssl 줄을 추가해서 ssl 연결을 이용할
연결 범위를 지정하고,
- 서버를 실행시키기 위해서 필요한 서버 인증서를
만들어준다.
3. postgresql.conf , pg_hba.conf 파일 수정
postgresql.conf 파일 수정과, pg_hba.conf 파일 수정은 해당 파일을
열어보면 예제로 주석처리 되어있으니 그것을 참조하셔서 적당히
수정하시면됩니다.
postgresql.conf
.....
ssl = true
.....
이렇게 바꾸어 주시면 되구요. 디폴트는 주석처리 되어있는 false
입니다.
pg_hba.conf 파일은
hostnossl all all 127.0.0.1 255.255.255.255 trust
hostssl all all 127.0.0.1 255.255.255.255 reject
hostssl all all 0.0.0.0 0.0.0.0 md5
이런 형태입니다.
설명하면, 일단, localhost 관련은 ssl 기능을 사용하지 않고,
나머지는 모두 ssl 연결만 허용하겠다는 지정입니다.
4. 서버 인증서 만들기.
일단 postgresql 서버를 가동하는 시스템 계정으로 로그인하고,
(디폴트가 postgres 지요, su - postgres) 다음 명령을 차례로
실행합니다.
다음 postgresql.conf 파일이 있는 디렉토리로 이동합니다. 다음
모든 작업 이 postgresql.conf 파일이 있는 디렉토리에서 이루워집니다.
쉽게 말해서 PGDATA 디렉토리가 되는 샘이지요.
$ openssl req -new -text -out server.req
$ openssl rsa -in privkey.pem -out server.key
$ openssl req -x509 -in server.req -text -key server.key -out server.crt
$ chmod og-rwx server.key
이때 두번째 server.key 만들때, common name을 물어볼 때, 서버가
가동되는 호스트 이름을 입력해주고,
challenge password 란에는 비워두시면 됩니다.
다음 같은 방식으로 root.crt 파일도 같이 만드시고, (server 라는
단어를 root 로 바꾸기만 하면 됨) 이때, common name은 그냥 ROOT CA
이런 형태로 지정해주시면 됩니다.
root.crt와, server.crt 를 공인된 것으로 쓰고 있다면, 그것의
이름을 각각 root, server 로 바꾸어서 그냥 사용하셔도 무방합니다.
(안해봐서 모름. 아마 될 것 같음)
5. 실행 및 테스트
모든 작업이 끝났으면, 서버를 재 가동하고, 테스트를 해보면
됩니다. 만일 정상적으로 재가동하지 않았다면, 로그 파일을 보시고
적당히 조치를 취해 주시면 됩니다. 대부분 root.crt, server.crt 파일
없다거나 그 해당 파일의 퍼미션이 이상하다거나 하는 오류들일
것입니다.
다음 테스트 하는 방법은 간단합니다.
[ioseph@bengi ioseph]$ psql mydb
Welcome to psql 7.4.5, the PostgreSQL interactive terminal.
사용법: \copyright 저작권 정보
\h SQL 명령어 도움말
\? 내장 명령어 도움말
\g 또는 명령 끝에 ; 쿼리 실행
\q 마침
화면단위 보기 기능 끔(전체 자료 모두 보여줌)
작업수행시간 보임
mydb=# \q
[ioseph@bengi ioseph]$ psql -h bengi mydb
비밀번호:
Welcome to psql 7.4.5, the PostgreSQL interactive terminal.
사용법: \copyright 저작권 정보
\h SQL 명령어 도움말
\? 내장 명령어 도움말
\g 또는 명령 끝에 ; 쿼리 실행
\q 마침
SSL 연결 (cipher: EDH-RSA-DES-CBC3-SHA, bits: 168)
화면단위 보기 기능 끔(전체 자료 모두 보여줌)
작업수행시간 보임
윗 명령은 SSL 기능이 없는 일반 연결
아랫 명령은 SSL 기능을 이용한 보안 연결 입니다.
차이는 보안 연결이 이루워지면, psql 실행화면에, SSL .... 이 줄이
보이게 됩니다.
6. 마무리.
7.4.5 이전 버전에서도 ssl 보안 서버로 말썽이 많았었는데, 실무에
사용해 보질 않아서 얼마나 더 많은 버그가 숨어 있을지는
모르겠지만,
아무튼 이번에 살펴본 것으로 안전하게 움직이네요. 보안 서버가
필요한 분들에게 도움이 되셨길.
웹 서버도 idc에 있고 db 서버도 idc에 있고, 두 서버의 패킷은 오직
서로간만 통신한다고 안전한 것이 아닙니다.
정말로 웹서버와 db 서버의 패킷이 암호화 되어야할 상황의 시스템을
구축해야할 상황이라면, 한번 시도해 보셔도 될 듯싶네요.
|