pg_hba.confファイルについて

皆さんこんにちは！haruです。

PostgreSQL でクライアント接続を行う際に、pg_hba.confファイルを編集して接続可能なIPアドレスを許可します。
pg_hba.confファイルは設定方法が多岐にわたるため、マニュアルの中から要点のみを抜粋してまとめていきたいと思います。

詳細が気になる方は、以下をご参照ください。
[詳細はこちら](https://pgsql-jp.github.io/current/html/auth-pg-hba-conf.html)
```
[postgres@postgreSQL ~]$ find / -name pg_hba.conf 2> /dev/null
/var/lib/pgsql/15/data/pg_hba.conf
[postgres@postgreSQL ~]$ vi /var/lib/pgsql/15/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD
・・・
host    all             all             0.0.0.0/0               trust
```

# キーワード
**UNIXドメインソケット**
LinuxなどのUNIX系OS（オペレーティングシステム）で実行されるプロセス間通信の終点に使われるインターフェースのこと。

**TCP/IP**
Transmission Control Protocol/Internet Protocol の略で、インターネット上で通信する仕組みの一つ。
まずIPがネットワーク経由でデータを細かく分割したパケットを受け取り、その後TCPがパケットの内容をチェックしながら正しい順番にデータを組み立て直す仕組みのこと。

**SSL**
Secure Sockets Layer の略で、インターネット上の通信を暗号化する仕組みのこと。

**ハッシュ**
特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理のこと。

# pg_hba.conf ファイル
クライアントからの認証は、pg_hba.confファイルという設定ファイルで管理されており、このファイルに記述されているIPアドレスのみ許可します。
このファイルのデフォルトは、PostgreSQLインストール工程のうち initdb コマンドで初期化される際に自動で作成されます。

# 各設定項目
### TYPE
- **local**
UNIXドメインソケットを使用する接続に対応します。

- **host**
TCP/IPを使用した接続に対応します。
 
- **hostssl**
SSLで暗号化されている場合にのみTCP/IPネットワークを使用する接続に対応します。

- **hostnossl**
hostsslと反対の動作で、SSLを使用していないTCP/IPの接続のみに対応します。

- **hostgssenc**
TCP/IPを使用した接続に対応するが、GSSAPI暗号化を使用する場合に限ります。

- **hostnogssenc**
hostgssencとは反対の動作で、GSSAPI暗号化を使用していないTCP/IPの接続のみに対応します。

### DATABASE
この項目はデータベース名を指定します。

- **all**
すべてのデータベースを対応します。

- **sameuser**
要求されたデータベースとユーザー名が同じ場合に対応します。

- **samerole**
要求されたデータベースとロールメンバーが同じ場合に対応します。
スーパーユーザーにおいても、明示的に指定しないと該当しません。

- **erplication**
ストリーミングレプリケーション接続が要求された場合に対応します。
ロジカルレプリケーション接続には対応しません。

### USER
- **all**
全てのユーザが対応します。
それ以外の場合には特定のデータベースユーザの名前もしくは+で始まるグループ名のどちらかになります。

### ADDRESS
こちらはその名の通り、IPアドレスを指定します。
詳細はかなり細かいため、気になる場合は公式マニュアルをご参照ください。

### METHOD
- **trust**
接続を無条件で許可します

- **reject**
接続を無条件に拒否します。

- **scram-sha-256**
SCRAM-SHA-256認証を実行します。
SCRAM-SHA-256認証とは、セキュリティ面で堅牢性が高い認証方法です。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-password.html)

- **md5**
SCRAM-SHA-256あるいはMD5認証を実行します。
MD5認証は、パスワードの漏洩を防ぐ認証方法ですが、パスワードハッシュの漏洩は防げません。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-password.html)

- **password**
クライアントに対して認証時に平文のパスワードを要求します。

- **ges**
TCP/IP接続を使用するときのみ、ユーザの認証にGSSAPIを使用します。

- **sspi**
Windowsを使用するときのみ、ユーザの認証にSSPIを使用します。 
SSPI認証は、シングルサインオンで安全な認証行うWindowsの技術です。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/sspi-auth.html)

- **ident**
クライアントOSのユーザー名と要求されたデータベースユーザ名をidentサーバに尋ねて一致するかを検査します。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-ident.html)

- **peer**
クライアントOSのユーザー名と要求されたデータベースユーザ名が一致するかを検査します。

- **ldap**
LDAPサーバを使用して認証します。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-ldap.html)

- **radius**
RADIUSサーバを使用して認証します。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-radius.html)

- **cert**
SSLクライアント証明書を使用して認証します。 
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-cert.html)

- **pam**
オペレーティングシステムによって提供されるPAM（Pluggable Authentication Modules）サービスを使用した認証です。
PAMはユーザ名/パスワードの組の確認と接続されたリモートホスト名またはIPアドレスを任意に確認するためだけに使用されます。 
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-pam.html)

- **bsd**
オペレーティングシステムによって提供されたBSD認証サービスを使用して認証します。
BSD認証は、パスワードを照合するためにBSD認証を使用すること以外はpasswordと同じように動作します。
[詳しくはこちら](https://pgsql-jp.github.io/current/html/auth-bsd.html)

以上です！