★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

20.3. 接続と認証 #

20.3.1. 接続設定 #

listen_addresses (string) #

クライアントアプリケーションからの接続をサーバが監視するTCP/IPアドレスを指定します。 この値は、ホスト名をカンマで区切ったリスト、そして/もしくは、数値によるIPアドレスです。 *という特別なエントリは利用可能な全てのIPインタフェースに対応します。 エントリ0.0.0.0は全てのIPv4アドレスの監視を、そしてエントリ::は全てのIPv6アドレスの監視を許容します。 リストが空の場合、サーバはいかなるIPインタフェースも全く監視しないで、Unixドメインソケットのみを使用して接続が行われます。 リストが空でない場合、少なくとも1つのTCP/IPアドレスがリスニングできる場合にサーバは起動します。 開くことのできなかったすべてのTCP/IPアドレスに対して警告が発せられます。 デフォルトの値はlocalhostで、ローカルなTCP/IP loopback接続のみ許可します。

クライアント認証(第21章)は、誰がサーバにアクセスできるかを細かく制御できますが、listen_addressesは接続要求を受け付けるインタフェースを制御します。 これは、セキュアでないネットワークインタフェース上での悪意のある接続試行の繰り返しを防ぐのに役立ちます。 このパラメータはサーバ起動時にのみ設定できます。

port (integer) #

サーバが監視するTCPポートで、デフォルトは 5432です。 サーバが監視する全てのIPアドレスに対し、同じポート番号が使用されることを覚えておいてください。 このパラメータはサーバ起動時のみ設定可能です。

max_connections (integer) #

データベースサーバに同時接続する最大数を決定します。 デフォルトは典型的に100接続ですが、カーネルの設定が(initdbの過程で)それをサポートしていない場合、もっと少なくなることがあります。 このパラメータはサーバ起動時のみに設定可能です。

スタンバイサーバを運用している場合、このパラメータはプライマリサーバでの設定と同じ、もしくはより高い値に設定しなければなりません。そうしないと問い合わせがスタンバイサーバ内で受け入れられません。

reserved_connections (integer) #

pg_use_reserved_connections権限を持つロールによる接続のために予約される接続スロットの数を決定します。 空き接続スロットの数がsuperuser_reserved_connectionsより大きく、かつsuperuser_reserved_connectionsreserved_connectionsの合計以下の場合は常に、新しい接続はスーパーユーザあるいはpg_use_reserved_connections権限を持つロールに対してのみ受け入れられます。 superuser_reserved_connections以下の接続スロットが利用可能な場合、新しい接続はスーパーユーザに対してのみ受け入れられます。

デフォルトの値は0接続です。 この値は max_connections - superuser_reserved_connectionsより小さくなくてはなりません。 このパラメータはサーバ起動時のみ設定可能です。

superuser_reserved_connections (integer) #

PostgreSQLのスーパーユーザによる接続のために予約されている接続スロットの数を決定します。 最大、max_connectionsの数までの接続を同時に有効にすることができます。 有効な同時接続数がmax_connectionsからsuperuser_reserved_connectionsを差し引いた数以上のときは、新規接続はスーパーユーザのみが許可されます。 このパラメータによる接続スロット予約は、reserved_connectionsによるスロット予約が使い果たされた後の緊急使用のための最終的な予備を意図しています。

デフォルトの値は3接続です。 この値は max_connectionsからreserved_connectionsを引いたものより小さくなくてはなりません。 このパラメータはサーバ起動時のみ設定可能です。

unix_socket_directories (string) #

クライアントアプリケーションからの接続をlistenするサーバ上のUnixドメインソケットのディレクトリを指定します。 複数のディレクトリをカンマで区切って指定することにより、複数のソケットを作ることができます。 項目の間の空白は無視されます。 名前の中に空白かカンマが必要なら、ディレクトリ名を二重引用符で囲ってください。 空の値はUnixドメインソケットをlistenしないことを意味します。 この場合、TCP/IPソケットを使ってサーバに接続することだけが可能になります。

@で始まる値は、抽象名前空間にUnixドメインソケットを作ることを指定します(今の所これはLinuxでのみサポートされています)。 この場合、この値はディレクトリではなくファイルシステムの名前空間と同様の方法で、実際のソケット名の接頭辞が求められます。 ファイルシステムの位置ではないため、抽象ソケット名接頭辞は自由に選択できますが、それにもかかわらず@/tmpのようなファイルシステム的な値を使うのが慣例です。

デフォルト値は通常/tmpですが、ビルド時に変更できます。 Windowsではデフォルトは空文字で、これはつまりUnixドメインソケットがデフォルトでは作成されないことを意味します。 このパラメータはサーバ起動時のみ設定可能です。

.s.PGSQL.nnnnという名前のソケットファイル(nnnnはポート番号)のほかに、.s.PGSQL.nnnn.lockという通常ファイルがそれぞれのunix_socket_directoriesディレクトリの中に作成されます。 いずれのファイルも手作業で削除してはいけません。 抽象名前空間にあるソケットにはロックファイルは作成されません。

unix_socket_group (string) #

Unixドメインソケット(複数も)を所有するグループを設定します(ソケットを所有するユーザは常にサーバを起動するユーザです)。 unix_socket_permissionsパラメータとの組合せで、Unixドメインソケット接続の追加的アクセス管理機構として使うことができます。 デフォルトでは空文字列で、サーバユーザのデフォルトグループを使用します。 このパラメータはサーバ起動時のみ設定可能です。

このパラメータはWindowsではサポートされていません。 すべての設定は無視されます。 また、抽象名前空間にあるソケットはファイル所有者を持たないので、この場合も設定は無視されます。

unix_socket_permissions (integer) #

Unixドメインソケット(複数も)のアクセスパーミッションを設定します。 Unixドメインソケットは通常のUnixファイルシステムパーミッション設定の一式を使用します。 パラメータ値は、chmodおよびumaskシステムコールが受け付ける数値形式での指定を想定しています。 (通常使われる8進数形式を使用するのであれば、0(ゼロ)で始まらなければなりません。)

デフォルトのパーミッションは、誰でも接続できる0777になっています。 変更するならば0770(ユーザとグループのみです。unix_socket_groupも参照してください)や0700(ユーザのみ)が適切です。 (Unixドメインソケットでは書き込み権限だけが問題になるため、読み込みや実行のパーミッションを設定または解除する意味はありません。)

このアクセス制御機構は 第21章で記述されたものとは別個のものです。

このパラメータはサーバ起動時のみ設定可能です。

このパラメータはSolaris 10の時点でのSolarisなど、ソケットのパーミッションを完全に無視するシステムでは無関係です。 こうしたシステムでは、許可したいユーザだけが検索パーミッションを持つディレクトリをunix_socket_directoriesで指すようにすることによって同じような効果を得ることができます。

抽象名前空間にあるソケットはパーミッションを持たないので、この設定も無視されます。

bonjour (boolean) #

Bonjourによりサーバの存在を公表することを可能にします。デフォルトはoffです。 このパラメータはサーバ起動時のみ設定可能です。

bonjour_name (string) #

Bonjourサービス名を指定します。 このパラメータが空文字列''(デフォルトです)に設定されていると、コンピュータ名が使用されます。 サーバがBonjourサポート付でコンパイルでされていない場合は無視されます。 このパラメータはサーバ起動時のみ設定可能です。

20.3.2. TCP Settings #

tcp_keepalives_idle (integer) #

クライアントとのやり取りがなくなった後、オペレーティングシステムがTCPのkeepaliveパケットをクライアントに送信するまでの時間を指定します。 この値が単位なしで指定された場合は、秒単位であるとみなします。 0(デフォルトです)の場合はオペレーティングシステムのデフォルト値を使用します。 Windowsでは、システムのデフォルト値を読み取る方法がないため、値0を設定すると、このパラメータは2時間に設定されます。 このパラメータはTCP_KEEPIDLEまたは同等のソケットオプションをサポートするシステムと、Windowsでのみサポートされます。 その他のシステムではゼロでなければなりません。 Unixドメインソケット経由で接続されたセッションでは、このパラメータは無視され、常にゼロとして読み取られます。

tcp_keepalives_interval (integer) #

TCPのkeepaliveメッセージに対してクライアントから応答がない場合に、再送を行うまでの時間を指定します。 この値が単位なしで指定された場合は、秒単位であるとみなします。 0(デフォルトです)の場合はシステムのデフォルト値を使用します。 Windowsでは、システムのデフォルト値を読み取る方法がないため、値0を設定すると、このパラメータが1秒に設定されます。 このパラメータはTCP_KEEPINTVLまたは同等のソケットオプションをサポートするシステムと、Windowsでのみサポートされます。 その他のシステムではゼロでなければなりません。 Unixドメインソケット経由で接続されたセッションでは、このパラメータは無視され、常にゼロとして読み取られます。

tcp_keepalives_count (integer) #

サーバのクライアントへの接続が切れたと判断されるまでのTCP keepaliveメッセージの数を指定します。 0(デフォルトです)の場合はオペレーティングシステムのデフォルト値を使用します。 このパラメータはTCP_KEEPCNTまたは同等のソケットオプションをサポートするシステムでのみサポートされます(Windowsは含みません)。 その他のシステムではゼロでなければなりません。 Unixドメインソケット経由で接続されたセッションでは、このパラメータは無視され、常にゼロとして読み取られます。

tcp_user_timeout (integer) #

未応答の送信データが残ったままの接続が強制的に閉じられるまでの時間を指定します。 この値が単位なしで指定された場合は、ミリ秒単位であるとみなします。 0(デフォルトです)の場合はオペレーティングシステムのデフォルト値を使用します。 このパラメータは、TCP_USER_TIMEOUTをサポートするシステム(Windowsは含みません)でのみ使用できます。他のシステムでは、0にする必要があります。 UNIXドメインソケットで接続しているセッションではこのパラメータは無視され、常に0として扱われます。

client_connection_check_interval (integer) #

問い合わせを実行中に、クライアントがまだ接続しているどうかの追加のチェックを行う時間間隔を指定します。 このチェックはソケットをポーリングすることによって行われ、その接続がクローズされていることをカーネルが報告することによって、長時間実行中の問い合わせをより早くアボートさせることができます。

このオプションは、Linux、macOS、illumos、BSDファミリーのオペレーティングシステムによって公開されるカーネルイベントに依存しており、現在他のシステムでは利用できません。

値が単位なしに指定されると、ミリ秒であるとみなされます。 デフォルト値は0で、接続のチェックは無効になります。 接続チェックがない場合、サーバは接続が失われたことを、次のソケットへのアクセス、すなわちソケットの待受、データの受信、送信のときにだけ検出します。

ネットワーク障害を含めて、TCP接続が失われたことをすべてのシナリオにおいて既知のタイムフレームの中で確実にカーネルが検出するためには、オペレーティングシステムのTCP keepalive設定、あるいはPostgreSQLtcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count設定を調整することが必要になるかもしれません。

20.3.3. 認証 #

authentication_timeout (integer) #

クライアント認証を完了するまでの最大時間です。 もし、この時間内に自称クライアントが認証プロトコルを完了しない場合、サーバは接続を閉じます。 これはハングしたクライアントが接続を永久に占有することを防ぎます。 この値が単位なしで指定された場合は、秒単位であるとみなします。 デフォルトは1分(1m)です。 このパラメータはpostgresql.confファイル、またはサーバのコマンドラインでのみ設定可能です。

password_encryption (enum) #

CREATE ROLEあるいはALTER ROLEでパスワードを設定する際に、このパラメータはパスワードを暗号化するアルゴリズムを指定します。 可能な値は、SCRAM-SHA-256でパスワードを暗号化するscram-sha-256とパスワードをMD5ハッシュとして格納するmd5です。 デフォルト値はscram-sha-256です。

古いクライアントはSCRAM認証機構をサポートしていない可能性があり、したがってSCRAM-SHA-256による暗号化は動作しないかもしれないことに注意してください。 さらなる詳細については21.5をご覧ください。

scram_iterations (integer) #

SCRAM-SHA-256を使用してパスワードを暗号化するときに実行される計算の反復回数です。 デフォルトは4096です。 反復回数が多いほど、格納されたパスワードに対するブルートフォース攻撃に対する保護が強化されますが、認証の速度は低下します。 反復カウントは暗号化時に固定されるため、値を変更してもSCRAM-SHA-256で暗号化された既存のパスワードには影響しません。 変更された値を有効にするには、新しいパスワードを設定する必要があります。

krb_server_keyfile (string) #

Kerberosサーバーキーファイルの場所を設定します。 デフォルトはFILE:/usr/local/pgsql/etc/krb5.keytabです。 (ディレクトリ部分は構築時にsysconfdirで指定されたものです。 pg_config --sysconfdirを使って確認してください。) このパラメータが空文字列に設定されると、それは無視されてシステム依存のデフォルトが使用されます。 このパラメータはpostgresql.confファイル、またはサーバのコマンドラインでのみ設定可能です。 詳細は21.6をご覧ください。

krb_caseins_users (boolean) #

GSSAPIユーザ名を大文字小文字の区別なく取り扱うかどうかを設定します。 デフォルトはoff(大文字小文字を区別する)です。 このパラメータはpostgresql.confファイル、またはサーバのコマンドラインでのみ設定可能です。

gss_accept_delegation (boolean) #

クライアントからのGSSAPI委任を受け入れるかどうかを設定します。 デフォルトはoffです。 これは、クライアントからの資格証明が受け入れられないことを意味します。 これをonに変更すると、サーバは、クライアントから委任された資格証明を受け入れます。 このパラメータは、postgresql.confファイルまたはサーバコマンドラインでのみ設定できます。

db_user_namespace (boolean) #

このパラメータはデータベース毎のユーザ名を可能にします。 デフォルトはオフです。 このパラメータはpostgresql.confファイル、またはサーバのコマンドラインでのみ設定可能です。

これがオンの場合、username@dbnameの様にしてユーザを作成しなければなりません。 usernameが接続中のクライアントより渡された時、 @およびデータベース名がユーザ名に付加され、そのデータベース特有のユーザ名をサーバが見に行きます。 SQL環境下で@を含む名前のユーザを作成する場合、そのユーザ名は引用符で括られなければならないことに注意してください。

このパラメータを有効にしていても通常の広域ユーザを作成することができます。 クライアントにユーザ名を指定する時に、たとえばjoe@のように単に@を付け加えてください。 @はサーバがユーザ名を検索する以前に取り去られます。

db_user_namespaceはクライアントとサーバのユーザ名の表示を区別することができます。 認証検査は常にサーバのユーザ名で行われるので、認証方式はクライアントのではなくサーバのユーザ名で構成されなければなりません。 md5では、クライアントおよびサーバの両方でユーザ名をソルトとして使用するので、md5db_user_namespaceと一緒に使用することはできません。

注記

この機能は完全な解決方法が見つかるまでの一時的なものです。 完全な解決方法が見つかったら、このオプションは削除される予定です。

20.3.4. SSL #

SSLの設定の詳細は、19.9を参照してください。 TLSプロトコルを使用した転送暗号化を制御するための構成パラメータは、SSLプロトコルのサポートが推奨されていないにもかかわらず、歴史的な理由からsslと名付けられています。 SSLはこの文脈でTLSと同じ意味で使用されます。

ssl (boolean) #

SSLによる接続を有効にします。 このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。 デフォルトは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_crl_dirが設定されていない限り)。

ssl_crl_dir (string) #

SSLクライアント証明書失効リスト(CRL)が入っているディレクトリ名を設定します。 相対パスの場合は、データディレクトリからの相対パスになります。 このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。 デフォルトは空で、この場合CRLファイルは読み込まれません(ssl_crl_fileが設定されていない限り)。

このディレクトリはOpenSSLコマンドのopenssl rehashあるいはc_rehashで準備されなければなりません。 詳細はそれらのドキュメントをご覧ください。

この設定を使用すると、指定したディレクトリ内のCRLが接続時に必要に応じて読み込まれます。 新しいCRLをこのディレクトリに追加することが可能で、即座に使用されます。 サーバが起動されるとき、あるいは設定が再読込されるときに読み込まれるssl_crl_fileとは異なります。 両方の設定は一緒に使用できます。

ssl_key_file (string) #

SSLサーバの秘密鍵が入っているファイル名を設定します。 相対パスの場合は、データディレクトリからの相対パスになります。 このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。 デフォルトは server.key です。

ssl_ciphers (string) #

SSL接続で使うことのできるSSL暗号スイートのリストを指定します。 設定構文と使用可能な値のリストについてはOpenSSLパッケージの ciphersマニュアルをご覧ください。 TLSバージョン1.2あるいはそれ以下のバージョンを使用する接続のみが影響を受けます。 今の所、TLSバージョン1.3接続で使用される暗号の選択を制御する設定はありません。 デフォルト値はHIGH:MEDIUM:+3DES:!aNULLです。 特別なセキュリティ要件でなければ通常これが適当です。

このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。

デフォルト値の説明:

HIGH #

HIGHグループ(たとえばAES, Camellia, 3DES)を使用する暗号スイート

MEDIUM #

MEDIUMグループ(たとえば RC4, SEED)を使用する暗号スイート

+3DES #

OpenSSLHIGHに対するデフォルトの並び順には問題があります。 3DESがAES128より高いとしているからです。 3DESはAES128よりもセキュアではなく、またずっと遅いので、これは間違っています。 +3DESではそれを他のすべてのHIGHMEDIUM暗号よりも後に位置づけます。

!aNULL #

認証を行わない匿名暗号スイートを無効にします。 そういった暗号スイートはMITM攻撃に対して脆弱で、使用すべきではありません。

OpenSSLのバージョンにより、利用可能な暗号スイートの詳細は異なります。 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' コマンドを使って現在インストールされているOpenSSLのバージョンに関する詳細情報を得てください。 ここで得られるリストは、サーバキータイプにより実行時にフィルターされることに注意してください。

ssl_prefer_server_ciphers (boolean) #

サーバのSSL暗号設定をクライアントに優先して使うかどうかを指定します。 このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。 デフォルトはonです。

バージョン9.4より前の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) #

使用するSSL/TLSプロトコルバージョンの最小値を設定します。 今の所使用できる値はTLSv1TLSv1.1TLSv1.2TLSv1.3です。 古いバージョンのOpenSSLライブラリはすべての値をサポートしません。 サポートしていない値が設定されるとエラーが発生します。 TLS 1.0より前のプロトコルバージョン、すなわちSSLバージョン2あるいは3は常に無効となります。

デフォルトはTLSv1.2で、本稿執筆時点では業界のベストプラクティスを満たしています。

このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。

ssl_max_protocol_version (enum) #

使用するSSL/TLSプロトコルバージョンの最大値を設定します。 使用できる値はssl_min_protocol_versionと、すべてのプロトコルバージョンを許可する空文字です。 デフォルトはすべてのプロトコルバージョンを許可する設定です。 最大プロトコルバージョンの設定は主にテスト、あるいは新しいプロトコルを使った時にコンポーネントのどこかに問題がある時に有用です。

このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。

ssl_dh_params_file (string) #

いわゆる短命DH系SSL暗号で使用するディフィー・ヘルマンパラメータを格納するファイル名を指定します。 デフォルトは空で、この場合はコンパイル時に決められたデフォルトのDHパラメータが使用されます。 攻撃者が、よく知られたコンパイル時設定のDHパラメータを解読しようとしている場合には、カスタムDHパラメータを使うことでその危険性を低減できます。 openssl dhparam -out dhparams.pem 2048を使って、独自のDHパラメータファイルを作ることができます。

このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。

ssl_passphrase_command (string) #

秘密鍵などのSSLファイルを復号する際に、パスフレーズの入手が必要な時に起動される外部コマンドを設定します。 デフォルトではこのパラメータは空文字で、組み込みのプロンプト機構が使用されます。

このコマンドは、パスフレーズを標準出力に書き出し、コード0で終了しなければなりません。 パラメータの値の%pはプロンプト文字列に置き換えられます。 (%を使いたい場合は%%としてください。) プロンプト文字列はおそらく空白文字を含むので、適切に引用符付けするように注意してください。 出力の最後に一個の改行があれば、削除されます。

このコマンドは実際にはパスフレーズ用にユーザにプロンプトを表示する必要はありません。 ファイルからパスフレーズが読めるなら、キーチェーン機構やその他から取得します。 選択された仕組みが適切にセキュアかどうかを確認するのはユーザ次第です。

このパラメータはpostgresql.confファイル内、またはサーバのコマンドラインのみで設定可能です。

ssl_passphrase_command_supports_reload (boolean) #

このパラメータは、キーにパスフレーズが必要な場合、設定ファイルの再読み込み中にssl_passphrase_commandで設定されたパスフレーズコマンドも呼び出されるかどうかを設定します。 このパラメータがoff(デフォルト)なら、ssl_passphrase_commandは再読込の際に無視され、パスフレーズが必要な場合、SSL設定は再読込されません。 この設定は、サーバ実行中は存在しないかもしれないTTYがプロンプトに必要なコマンドに適しています。 たとえばパスフレーズがファイルから読み込める場合には、この設定をonにするのが適切です。

このパラメータはpostgresql.confファイル内、またはサーバのコマンドラインのみで設定可能です。