19.3. 연결 및 인증

19.3.1. 접속 설정
19.3.2. 인증
19.3.3. SSL

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_socket_group (string)

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

이 매개 변수는 윈도우즈에서는 지원하지 않는다. 모든 설정값은 무시된다.

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로 하여 유사한 효과를 낼 수 있다.

bonjour (boolean)

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

bonjour_name (string)

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

tcp_keepalives_idle (integer)

네트워크 활동이 없는 클라이언트가 연결을 정상적인 연결을 하고 있는지 OS가 TCP keepalive 메시지를 보내는 간격이다. 단위를 지정하지 않으면 초단위로 간주한다. 0 (기본값)을 지정하면, OS 설정값을 사용한다. 이 매개 변수는 TCP_KEEPIDLE 또는 이에 상응하는 소켓 옵션을 지원하는 시스템과 Windows에서만 지원되며, 그 외 시스템에서는 0이어야 한다. Unix 도메인 소켓을 통해 연결된 세션에서 이 매개 변수는 무시되고 항상 0으로 읽힌다.

참고

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

tcp_keepalives_interval (integer)

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

참고

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

tcp_keepalives_count (integer)

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

참고

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

tcp_user_timeout (integer)

Specifies the amount of time that transmitted data may remain unacknowledged before the TCP connection is forcibly closed. If this value is specified without units, it is taken as milliseconds. 0 (기본값)을 지정하면, OS 설정값을 사용한다. 이 매개 변수는 OS TCP_USER_TIMEOUT 설정을 지원하는 경우만 지원되며, 그 외 OS에서는 0 이어야한다. 유닉스-도메인 소켓을 사용하는 세션에서는 이 값이 무시되며, 항상 0으로 간주한다.

참고

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

19.3.2. 인증

authentication_timeout (integer)

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

password_encryption (enum)

When a password is specified in CREATE ROLE or ALTER ROLE, this parameter determines the algorithm to use to encrypt the password. The default value is md5, which stores the password as an MD5 hash (on is also accepted, as alias for md5). Setting this parameter to scram-sha-256 will encrypt the password with SCRAM-SHA-256.

Note that older clients might lack support for the SCRAM authentication mechanism, and hence not work with passwords encrypted with SCRAM-SHA-256. See 20.5절 for more details.

krb_server_keyfile (string)

Sets the location of the server's Kerberos key file. The default is FILE:/usr/local/pgsql/etc/krb5.keytab (where the directory part is whatever was specified as sysconfdir at build time; use pg_config --sysconfdir to determine that). If this parameter is set to an empty string, it is ignored and a system-dependent default is used. This parameter can only be set in the postgresql.conf file or on the server command line. See 20.6절 for more information.

krb_caseins_users (boolean)

Sets whether GSSAPI user names should be treated case-insensitively. The default is off (case sensitive). This parameter can only be set in the postgresql.conf file or on the server command line.

db_user_namespace (boolean)

This parameter enables per-database user names. It is off by default. This parameter can only be set in the postgresql.conf file or on the server command line.

If this is on, you should create users as username@dbname. When username is passed by a connecting client, @ and the database name are appended to the user name and that database-specific user name is looked up by the server. Note that when you create users with names containing @ within the SQL environment, you will need to quote the user name.

With this parameter enabled, you can still create ordinary global users. Simply append @ when specifying the user name in the client, e.g. joe@. The @ will be stripped off before the user name is looked up by the server.

db_user_namespace causes the client's and server's user name representation to differ. Authentication checks are always done with the server's user name so authentication methods must be configured for the server's user name, not the client's. Because md5 uses the user name as salt on both the client and server, md5 cannot be used with db_user_namespace.

참고

This feature is intended as a temporary measure until a complete solution is found. At that time, this option will be removed.

19.3.3. SSL

See 18.9절 for more information about setting up SSL.

ssl (boolean)

SSL 연결을 설정한다. 이 매개 변수는 서버 시작 시에만 설정 가능하다. SSL 통신은 유일하게 TCP/IP 연결만 가능하다. 기본값은 off이다.

ssl_ca_file (string)

SSL 서버 인증 기관(CA)이 포함된 파일 이름을 지정한다. 상대 경로를 사용하면, 그 기준 디렉터리는 데이터 디렉터리다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은, 로드된 CA 파일이 없고 클라이언트 인증서 검증이 수행되지 않음을 뜻하는 빈칸이다.

ssl_cert_file (string)

SSL 서버 인증서가 포함된 파일 이름을 지정한다. 상대 경로를 사용하면, 그 기준 디렉터리는 데이터 디렉터리다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은 server.crt이다.

ssl_crl_file (string)

SSL 서버 인증서 해지 목록(CRL)이 포함된 파일 이름을 지정한다. 상대 경로를 사용하면, 그 기준 디렉터리는 데이터 디렉터리다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은, 로드된 CRL 파일이 없음을 뜻하는 빈칸이다.

ssl_key_file (string)

SSL 서버 개인 키가 포함된 파일 이름을 지정한다. 상대 경로를 사용하면, 그 기준 디렉터리는 데이터 디렉터리다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은 server.key이다.

ssl_ciphers (string)

Specifies a list of SSL cipher suites that are allowed to be used by SSL connections. See the ciphers manual page in the OpenSSL package for the syntax of this setting and a list of supported values. Only connections using TLS version 1.2 and lower are affected. There is currently no setting that controls the cipher choices used by TLS version 1.3 connections. The default value is HIGH:MEDIUM:+3DES:!aNULL. The default is usually a reasonable choice unless you have specific security requirements.

이 설정은 postgresql.conf 파일 또는 서버 실행 명령행 옵션에서만 지정할 수 있다.

기본값 설명:

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 (boolean)

SSL cipher 기본 설정을 서버 것으로 사용할 것인지, 클라이언트 것으로 사용할 것인지 지정한다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은 on이다.

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

ssl_ecdh_curve (string)

ECDH 키 교환에서 사용할 곡선 이름을 지정한다. 연결하는 모든 클라이언트에서 지원되어야 한다. 서버의 타원 곡선 키에서 사용되는 것과 동일한 곡선일 필요는 없다. 이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다. 기본값은 prime256v1이다.

가장 일반적인 곡선의 OpenSSL 이름: prime256v1 (NIST P-256), secp384r1 (NIST P-384), secp521r1 (NIST P-521). 사용 가능한 곡선의 전체 목록은 openssl ecparam -list_curves 명령을 사용하면 표시할 수 있다. 그렇더라도 모든 곡선을 TLS에서 사용할 수 있는 것은 아니다.

ssl_min_protocol_version (enum)

Sets the minimum SSL/TLS protocol version to use. Valid values are currently: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3. Older versions of the OpenSSL library do not support all values; an error will be raised if an unsupported setting is chosen. Protocol versions before TLS 1.0, namely SSL version 2 and 3, are always disabled.

The default is TLSv1.2, which satisfies industry best practices as of this writing.

ssl_max_protocol_version (enum)

Sets the maximum SSL/TLS protocol version to use. Valid values are as for ssl_min_protocol_version, with addition of an empty string, which allows any protocol version. The default is to allow any version. Setting the maximum protocol version is mainly useful for testing or if some component has issues working with a newer protocol.

ssl_dh_params_file (string)

Specifies the name of the file containing Diffie-Hellman parameters used for so-called ephemeral DH family of SSL ciphers. The default is empty, in which case compiled-in default DH parameters used. Using custom DH parameters reduces the exposure if an attacker manages to crack the well-known compiled-in DH parameters. You can create your own DH parameters file with the command openssl dhparam -out dhparams.pem 2048.

이 설정은 postgresql.conf 파일 또는 서버 실행 명령 옵션에서만 지정 가능하다.

ssl_passphrase_command (string)

Sets an external command to be invoked when a passphrase for decrypting an SSL file such as a private key needs to be obtained. By default, this parameter is empty, which means the built-in prompting mechanism is used.

The command must print the passphrase to the standard output and exit with code 0. In the parameter value, %p is replaced by a prompt string. (Write %% for a literal %.) Note that the prompt string will probably contain whitespace, so be sure to quote adequately. A single newline is stripped from the end of the output if present.

The command does not actually have to prompt the user for a passphrase. It can read it from a file, obtain it from a keychain facility, or similar. It is up to the user to make sure the chosen mechanism is adequately secure.

This parameter can only be set in the postgresql.conf file or on the server command line.

ssl_passphrase_command_supports_reload (boolean)

This parameter determines whether the passphrase command set by ssl_passphrase_command will also be called during a configuration reload if a key file needs a passphrase. If this parameter is off (the default), then ssl_passphrase_command will be ignored during a reload and the SSL configuration will not be reloaded if a passphrase is needed. That setting is appropriate for a command that requires a TTY for prompting, which might not be available when the server is running. Setting this parameter to on might be appropriate if the passphrase is obtained from a file, for example.

This parameter can only be set in the postgresql.conf file or on the server command line.