18.9. SSL을 사용한 TCP/IP 연결 보호

PostgreSQLSSL 연결을 사용하여 보안 강화를 위한 클라이언트/서버 통신을 암호화하는 기본적인 지원이 있다. 이것은 클라이언트와 서버 시스템에 OpenSSL을 설치해야 하고 PostgreSQL에서의 지원이 빌드 시 활성화되어야 한다(16장 참조).

컴파일된 SSL 지원을 사용함으로써 postgresql.conf에서 파라미터 sslon으로 설정하면 SSL를 활성화한 상태로 PostgreSQL 서버를 시작할 수 있다. 서버는 동일한 TCP 포트에서 일반 및 SSL 연결을 listen하고 SSL 연결 여부에 대해 클라이언트 연결을 성사시킨다. 기본적으로 이것은 클라이언트의 옵션이다. 일부 또는 모든 연결에 대해 SSL의 사용을 요구하도록 서버를 설정하는 방법은 20.1절을 참조 바란다.

PostgreSQL은 시스템 차원(system-wide)의 OpenSSL 환경 설정 파일을 판독한다. 기본적으로 이 파일의 이름은 openssl.cnf이고 openssl version -d로 보고된 디렉터리에 위치한다. 이러한 기본값은 환경 변수 OPENSSL_CONF를 원하는 환경 설정 파일 이름에 설정함으로써 덮어쓸 수 있다.

OpenSSL은 다양한 암호화 및 다양한 레벨의 인증 알고리즘을 지원한다. 암호 목록을 OpenSSL 환경 설정 파일에 지정할 수 있는 반면, postgresql.conf에서 ssl_ciphers를 수정함으로써 데이터베이스 서버에서 특별히 사용하기 위한 암호를 사용자가 지정할 수 있다.

참고: NULL-SHA 또는 NULL-MD5 암호를 사용하여 암호화 오버헤드 없이 인증을 하는 것이 가능하다. 단, 중간자(man-in-the-middle)는 클라이언트와 서버 사이의 통신을 판독하고 패스할 수 있다. 또한 암호화 오버헤드는 인증 오버헤드에 비해 아주 적다. 이러한 이유로, NULL 암호는 권장되지 않는다.

SSL 모드에서 시작하려면 서버 인증서가 포함된 파일과 개인 키가 존재해야 한다. 기본적으로, 이러한 파일은 각각 서버의 데이터 디렉터리에서 이름이 server.crtserver.key일 것으로 예상되지만, 환경 설정 파라미터ssl_cert_filessl_key_file을 사용하여 다른 이름과 위치를 지정할 수 있다. Unix 시스템에서 server.key에 대한 권한은 월드 또는 그룹에 대한 액세스를 불허해야 한다. 이것은 chmod 0600 server.key 명령에 의해 수행된다. Alternatively, the file can be owned by root and have group read access (that is, 0640 permissions). That setup is intended for installations where certificate and key files are managed by the operating system. The user under which the PostgreSQL server runs should then be made a member of the group that has access to those certificate and key files.

개인 키가 암호로 보호되는 경우 서버는 암호를 묻는 메시지를 표시하고 암호가 입력되기 전에는 서버가 시작되지 않는다.

경우에 따라 서버 인증서를 클라이언트가 직접 신뢰하지 않고 "중간" 인증 기관에서 서명할 수 있다. 해당 인증서를 사용하려면 server.crt 파일에 서명 기관의 인증서를 첨부한 다음, 해당 상급 기관의 인증서를 첨부하는 순으로 클라이언트에 의해 신뢰된 인증 기관, "root" 또는 "중간"까지 첨부한다(예를 들면 클라이언트의 root.crt 파일에서 인증서로 서명된).

18.9.1. 클라이언트 인증서 사용

신뢰된 인증서 제공을 클라이언트에게 요구하려면 사용자가 신뢰하는 인증 기관(CA)의 인증서를 데이터 디렉터리의 root.crt 파일에 삽입하고, postgresql.confssl_ca_file 파라미터를 root.crt로 설정하고 pg_hba.conf의 적절한 hostssl 라인에서 clientcert=1 옵션을 설정해야 한다. 그러면, SSL 연결 시작 중에 인증서가 클라이언트로부터 요청된다(클라이언트에서 인증서 설정 방법에 대한 설명은 32.18절 참조). 서버는 클라이언트 인증서가 신뢰된 인증 기관 중 한 곳에서 서명된 것인지 검증한다.

중간 CAroot.crt에 나타나면 파일에도 루트 CA에 인증서 체인이 포함되어야 한다. ssl_crl_file 파라미터가 설정된 경우 Certificate Revocation List (CRL) 항목도 확인된다. (SSL 인증서 사용을 보여주는 다이어그램은 http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s02.html 참조)

pg_hba.confclientcert 옵션은 모든 인증 방법에서 사용할 수 있지만 hostssl로 지정된 행에만 해당된다. clientcert가 지정되지 않았거나 0으로 설정되면, 환경 설정된 것이 있을 경우 서버가 CA 목록 대비 제공된 클라이언트 인증서를 계속 검증하지만, 클라이언트 인증서의 제공을 요구하지는 않는다.

서버의 root.crt는 클라이언트 인증서 서명을 위해 신뢰된 것으로 간주되는 최상위 CA가 나열되어 있다. 대부분의 경우 클라이언트 인증서에 대해 CA를 신뢰하더라도 원칙적으로는 서버의 인증서를 서명한 CA를 나열할 필요는 없다.

사용자가 클라이언트 인증서를 설정하는 경우 cert 인증 방법을 사용한다면 인증서로 사용자 인증을 제어하고 연결 보안도 제공할 수 있다. 자세한 내용은 20.3.9절을 참조 바란다. (It is not necessary to specify clientcert=1 explicitly when using the cert authentication method.)

18.9.2. SSL 서버 파일 사용

표 18-2는 서버에서 SSL 설정과 관련된 파일들을 요약한 것이다. (표시된 파일 이름은 기본값 또는 일반적인 이름이다. 로컬로 환경 설정된 이름은 다를 수 있다.)

표 18-2. SSL 서버 파일 사용

파일내용효과
ssl_cert_file ($PGDATA/server.crt)서버 인증서클라이언트로 전송되어 서버 ID 표시
ssl_key_file ($PGDATA/server.key)서버 개인 키소유자가 보낸 서버 인증서 검증; 인증서 소유자가 믿을만하다는 것을 나타내지는 않음
ssl_ca_file ($PGDATA/root.crt)신뢰된 인증서 기관클라이언트 인증서가 신뢰된 인증 기관에 의해 서명되었는지 확인
ssl_crl_file ($PGDATA/root.crl)인증 기관에서 취소된 인증서클라이언트가 인증서가 이 목록에 있으면 안 됨

server.key, server.crt, root.crtroot.crl 파일(또는 환경 설정된 다른 이름)은 서버 시작 중에만 검사되므로 변경 내용을 적용하려면 서버를 재시작해야 한다.

18.9.3. 자체 서명된 인증서 생성

서버용 자체 서명된 인증서를 빠르게 생성하려면 다음과 같은 OpenSSL 명령을 사용해야 한다.

openssl req -new -text -out server.req

openssl이 요청하는 정보를 입력하고, 로컬 호스트 이름을 "Common Name"으로 입력했는지 확인한다. 챌린지 패스워드는 비워둘 수 있다. 프로그램은 보호된 패스프레이즈인 키를 생성한다. 4글자 미만의 패스프레이즈는 수락되지 않는다. 패스프레이즈를 삭제하려면(서버의 자동 시작을 원하는 경우처럼) 다음 명령을 실행한다.

openssl rsa -in privkey.pem -out server.key
rm privkey.pem

이전 패스프레이즈를 입력하여 기존 키를 해제하기 위해 아래와 같이 입력한다.

openssl req -x509 -in server.req -text -key server.key -out server.crt

그러면 인증서가 자체 서명된 인증서로 전환되고, 서버가 찾는 위치로 키와 인증서가 복사된다. 마지막으로, 다음과 같이 입력한다.

chmod og-rwx server.key

이렇게 하는 이유는 권한이 이것보다 좀 더 자유로운 경우에 서버가 파일을 거부하기 때문이다. 서버 개인 키와 인증서를 생성하는 방법에 대한 자세한 내용은 OpenSSL 문서를 참조 바란다.

자체 서명된 인증서를 테스트용으로 사용할 수 있지만 클라이언트가 서버 ID를 검증할 수 있도록 인증 기관(CA) (전역 CA 또는 로컬 CA 중 하나)에 의해 서명된 인증서는 실제 운영 중에 사용되어야 한다. 모든 클라이언트가 기관에 대해 로컬인 경우 로컬 CA를 사용하는 것이 권장된다.