19.3. 연결 및 인증

19.3.1. 접속 설정

listen_addresses (string)

서버가 클라이언트 애플리케이션으로부터의 연결을 listen하는 TCP/IP 주소를 지정한다. 값은 호스트 이름 및/또는 숫자 IP 주소가 쉼표로 구분된 형태를 취한다. 특수 입력 *는 사용 가능한 IP 인터페이스 모두를 뜻한다. 0.0.0.0은 모든 IPv4 주소에 대해 listen하며, ::는 모든 IPv6 주소에 대해 listen한다. 목록이 빈칸이면 서버가 IP 인터페이스를 일절 listen하지 않으며, 이런 경우 Unix 도메인 소켓만 사용해서 연결할 수 있다. 기본값은 localhost이며, 로컬 TCP/IP "루프백" 연결이 만들어진다. 클라이언트 인증(20장)으로 서버 접근에 대한 권한을 세분화할 수 있는 경우, listen_addresses는 연결 시도를 수락하는 인터페이스를 제어함으로써 안전하지 않은 네트워크 인터페이스 상에서 악의적 연결 요청이 반복되는 것을 방지할 수 있다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

port (integer)

기본적으로 서버가 listen하는 TCP 포트는 5432이다. 서버가 listen하는 모든 IP 주소에 동일한 포트 번호가 사용된다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

max_connections (integer)

데이터베이스 서버로의 동시 연결 최대 수를 결정한다. 기본값은 일반적으로 100개 연결이지만 커널 설정이 지원하지 않는 경우 여기에 미치지 못할 수 있다(initdb 중에 결정됨). 이 매개변수는 서버 시작 시에만 설정 가능하다.

대기 서버 실행 중에 사용자는 max_connections를 마스터 서버 값보다 크거나 같게 설정해야 한다. 그렇지 않으면 대기 서버에서 쿼리가 허용되지 않는다.

superuser_reserved_connections (integer)

PostgreSQL 슈퍼유저의 연결용으로 예약된 연결 "슬롯" 수를 결정한다. 최대 max_connections 연결 수가 동시에 활성화된다. 활성화된 동시 연결 수가 max_connections에서 superuser_reserved_connections를 뺀 값 이상이면 슈퍼유저만 새롭게 연결되고 복제 연결은 되지 않는다.

기본값은 3이고, max_connections 미만이어야 한다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

unix_socket_directories (string)

서버가 클라이언트 애플리케이션 연결을 listen하는 도메인 소켓의 디렉터리를 지정한다. 복수 디렉터리를 쉼표로 구분하여 나열하면 복수 소켓을 생성할 수 있다. 항목 간 공백은 무시된다. 이름에 공백이나 쉼표를 넣어야 하는 경우 디렉터리 이름 앞뒤에 이중따옴표를 사용한다. 값을 빈칸으로 두면 Unix 도메인 소켓에서 일절 listen하지 않는다. 이때 TCP/IP 소켓만 서버에 연결하는 데 사용될 수 있다. 기본값은 통상 /tmp이지만, 빌드 시에는 변경 가능하다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

소켓 외에도, 파일 자체의 이름도 .s.PGSQL.nnnn이다. 여기서 nnnn은 서버의 포트 번호이며, 이름이 .s.PGSQL.nnnn.lock인 일반 파일은 각각의 unix_socket_directories 디렉터리에 생성된다. 어떤 파일이든 수동으로 삭제하면 절대 안 된다.

Unix 도메인 소켓이 없는 Windows와 이 매개변수는 무관하다.

unix_socket_group (string)

Unix 도메인 소켓의 소유자 그룹을 설정한다. (소켓을 소유한 사용자는 항상 서버를 시작하는 사용자이다.) unix_socket_permissions 매개변수와 함께 unix_socket_group을 Unix 도메인 연결용 추가 액세스 제어 메커니즘으로 사용할 수 있다. 기본적으로 unix_socket_group은 비어 있는 string이며, 서버 사용자의 기본 그룹을 사용한다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

Unix 도메인 소켓이 없는 Windows와 이 매개변수는 무관하다.

unix_socket_permissions (integer)

Unix 도메인 소켓의 액세스 권한을 설정한다. Unix 도메인 소켓은 일반적인 Unix 파일 시스템 권한 집합을 사용한다. 매개변수 값은, chmodumask 시스템 쉘에서 수용되는 숫자 형식을 따른다(관례적인 8진수 형식을 사용하려면 0(영)으로 시작되는 숫자여야 한다.).

기본 권한은 누구나 연결 가능한 0777이다. 합리적인 다른 대안은 0770(사용자와 그룹만. unix_socket_group 참조) 및 0700(사용자만)이다. (Unix 도메인 소켓의 경우 쓰기 권한에만 해당되는 문제이므로, 읽기 설정이나 취소 또는 실행 권한과는 무관하다.)

이러한 액세스 제어 메커니즘은 20장에 설명된 것과는 별개이다.

이 매개변수는 서버 시작 시에만 설정 가능하다.

이 매개변수는 특히 현재 Solaris 10인 Solaris 시스템과 무관하다. Solaris는 소켓 권한을 완전히 무시한다. 원하는 대상 그룹(audience)에 한정된 검색 권한을 갖고 있는 디렉터리를 unix_socket_directories로 하여 유사한 효과를 낼 수 있다. Unix 도메인 소켓이 없는 Windows에서 이 매개변수는 사용할 수 없다.

bonjour (boolean)

Bonjour를 통해 서버의 존재를 알린다. 기본값은 off이다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

bonjour_name (string)

Bonjour 서비스 이름을 지정한다. 이 매개변수가 비어 있는 string ''으로 설정된 경우 컴퓨터 이름이 사용된다(기본값). 서버가 Bonjour 지원으로 컴파일되지 않은 경우 이 매개변수가 무시된다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

tcp_keepalives_idle (integer)

TCP가 keepalive 메시지를 클라이언트에 전송하기 전에 비활성화 상태로 대기하는 초 수를 지정한다. 0 값은 시스템 기본값을 사용한다. 이 매개변수는 TCP_KEEPIDLE 또는 TCP_KEEPALIVE 심볼을 지원하는 시스템과 Windows에서만 지원되며, 0이어야 한다. Unix 도메인 소켓을 통해 연결된 세션에서 이 매개변수는 무시되고 항상 0으로 읽힌다.

참고: Windows는 시스템 기본값을 읽을 수 있는 방법이 없으므로 Windows에서 0 값은 이 매개변수가 2시간으로 설정된다.

tcp_keepalives_interval (integer)

클라이언트에 의해 승인되지 않은 TCP keepalive 메시지를 재전송하기 전에 대기하는 초 수를 지정한다. 0 값은 시스템 기본값을 사용한다. 이 매개변수는 TCP_KEEPINTVL 심볼을 지원하는 시스템과 Windows에서만 지원되며, 0이어야 한다. Unix 도메인 소켓을 통해 연결된 세션에서 이 매개변수는 무시되고 항상 0으로 읽힌다.

참고: Windows는 시스템 기본값을 읽을 수 있는 방법이 없으므로 Windows에서 0 값은 이 매개변수가 1초로 설정된다.

tcp_keepalives_count (integer)

몇 개의 TCP keepalive를 분실해야 클라이언트와 서버의 연결 상태를 dead로 판단하는 기준이 되는 지를 정한다. 0 값은 시스템 기본값을 사용한다. 이 매개변수는 TCP_KEEPCNT 심볼을 지원하는 시스템과 기타 시스템에서만 지원되며, 0이어야 한다. Unix 도메인 소켓을 통해 연결된 세션에서 이 매개변수는 무시되고 항상 0으로 읽힌다.

참고: 이 매개변수는 Windows에서 지원되지 않으며, 0이어야 한다.

19.3.2. 보안 및 인증

authentication_timeout (integer)

클라이언트 인증이 완료되는 최대 시간. 초 단위. 장차 되려고 하는 클라이언트가 이 시간 내에 인증 프로토콜이 완료되지 않은 경우 서버가 연결을 닫는다. 이로써 응답이 없는 클라이언트가 연결을 무기한 점유하는 것을 방지한다. 기본값은 1분이다(1m). 이 매개변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

ssl (boolean)

SSL 연결을 설정한다. 이것을 사용하기 전에 18.9절을 읽어보기 바란다. 기본값은 off이다. 이 매개변수는 서버 시작 시에만 설정 가능하다. SSL 통신은 유일하게 TCP/IP 연결만 가능하다.

ssl_ca_file (string)

SSL 서버 인증 기관(CA)이 포함된 파일 이름을 지정한다. 기본값은, 로드된 CA 파일이 없고 클라이언트 인증서 검증이 수행되지 않음을 뜻하는 빈칸이다. (PostgreSQL의 이전 릴리스에서 이 파일의 이름은 root.crt로 하드 코딩되었다.) 상대 경로는 데이터 디렉터리에 상대적이다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

ssl_cert_file (string)

SSL 서버 인증서가 포함된 파일 이름을 지정한다. 기본값은 server.crt이다. 상대 경로는 데이터 디렉터리에 상대적이다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

ssl_crl_file (string)

SSL 서버 인증서 해지 목록(CRL)이 포함된 파일 이름을 지정한다. 기본값은, 로드된 CRL 파일이 없음을 뜻하는 빈칸이다. (PostgreSQL의 이전 릴리스에서 이 파일의 이름은 root.crl로 하드 코딩되었다.) 상대 경로는 데이터 디렉터리에 상대적이다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

ssl_key_file (string)

SSL 서버 개인 키가 포함된 파일 이름을 지정한다. 기본값은 server.key이다. 상대 경로는 데이터 디렉터리에 상대적이다. 이 매개변수는 서버 시작 시에만 설정 가능하다.

ssl_ciphers (string)

보안 연결에 사용할 수 있는 SSL cipher 스위트suite 목록을 지정한다. 이 설정 구문 및 지원되는 값 목록은 OpenSSL 패키지의 ciphers 설명서를 참조 바란다. 기본값은 HIGH:MEDIUM:+3DES:!aNULL이다. 이것은 특별한 보안 요구사항이 없을 경우에 일반적으로 합당하다. 이 설정은 서버를 실행 할 때만 지정할 수 있다.

기본값 설명:

HIGH

HIGH 그룹에서 cipher를 사용하는 Cipher 스위트(예: AES, Camellia, 3DES)

MEDIUM

MEDIUM 그룹에서 cipher를 사용하는 Cipher 스위트(예: RC4, SEED)

+3DES

HIGH 에 대한 OpenSSL 기본 순서는 3DES 서열이 AES128보다 높기 때문에 문제가 된다. 3DES는 AES128보다 보안 수준이 떨어지고 느리기까지 하므로 이것은 잘못된 것이다. +3DES는 다른 모든 HIGHMEDIUM cipher 뒤로 재배치한다.

!aNULL

인증이 없는 익명의 cipher 스위트를 실행하지 않는다. 해당 cipher 스위트는 중간자(man-in-the-middle) 공격에 취약하므로 사용해서는 안 된다.

사용 가능한 cipher 스위트 상세 내역은 OpenSSL 버전에 따라 달라진다. 현재 설치된 OpenSSL 버전에 대한 실제 상세 내역은 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' 명령을 사용해야 한다. 이 목록은 서버 키 유형에 따라 런타임 시 필터링된다는 점에 유의해야 한다.

ssl_prefer_server_ciphers (bool)

SSL cipher 기본 설정을 서버 것으로 사용할 것인지, 클라이언트 것으로 사용할 것인지 지정한다. 기본값은 true이다. 이 설정은 서버를 실행할 때만 지정할 수 있다.

다른 PostgreSQL 버전은 이 설정이 없으며, 항상 클라이언트 기본 설정을 사용한다. 이 설정은 주로 해당 버전의 이전 버전과의 호환성에 대한 것이다. 서버가 적절하게 환경 설정되어 있을 가능성이 높으므로 보통은 서버의 기본 설정을 사용하는 것이 더 낫다.

ssl_ecdh_curve (string)

ECDH 키 교환에서 사용할 곡선 이름을 지정한다. 연결하는 모든 클라이언트에서 지원되어야 한다. 서버의 타원 곡선 키에서 사용되는 것과 동일한 곡선일 필요는 없다. 기본값은 prime256v1이다. 이 설정은 서버를 실행할 때만 지정할 수 있다.

가장 일반적인 곡선의 OpenSSL 이름: prime256v1 (NIST P-256), secp384r1 (NIST P-384), secp521r1 (NIST P-521).

사용 가능한 곡선의 전체 목록은 openssl ecparam -list_curves 명령을 사용하면 표시할 수 있다. 그렇더라도 모든 곡선을 TLS에서 사용할 수 있는 것은 아니다.

password_encryption (boolean)

ENCRYPTED 또는 UNENCRYPTED를 쓰지 않고 패스워드를 CREATE USER 또는 ALTER ROLE에 지정한 경우 이 매개변수는 패스워드를 암호화할 것인지 결정한다. 기본값은 on이다(패스워드 암호화).

krb_server_keyfile (string)

Kerberos 서버 키 파일의 위치를 설정한다. 자세한 내용은 20.3.3절을 참조 바란다. 이 매개변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

krb_caseins_users (boolean)

GSSAPI 사용자 이름의 대소문자를 구분할 것인지 설정한다. 기본값은 off이다(대소문자 구분). 이 매개변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

db_user_namespace (boolean)

이 매개변수는 데이터베이스별 사용자 이름을 사용한다. 기본값은 off이다. 이 매개변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

on일 경우 username@dbname처럼 사용자를 생성해야 한다. 연결된 클라이언트에 의해 username이 전달되는 경우, @ 및 데이터베이스 이름이 사용자 이름에 추가되고 해당 데이터베이스 특정 사용자 이름이 서버에서 조회된다. SQL 환경에서 사용자 이름에 @를 넣어 사용자를 생성하면 사용자 이름에 따옴표를 사용해야 한다는 점에 유의해야 한다.

이 매개변수를 사용해서 일반 전역 사용자를 생성할 수 있다. 예를 들면 joe@처럼 사용자 이름에 간단히 @를 추가하면 된다. @는 사용자 이름이 서버에 의해 조회되기 전에 제거된다.

db_user_namespace는 클라이언트와 서버의 사용자 이름이 다르게 표시되게 한다. 인증 검사는 항상 서버의 사용자 이름이 이용되므로 인증 방법은 클라이언트가 아니라 서버의 사용자 이름으로 환경 설정되어야 한다. md5는 사용자 이름을 클라이언트와 서버에서 솔트로 사용하므로, md5db_user_namespace와 함께 사용할 수 없다.

참고: 이 기능을 완벽한 솔루션을 찾을 때까지의 임시 방편용이다. 때가 되면 이 옵션이 삭제된다.