PostgreSQLの認証とアクセス権限の制御
PostgreSQL で SQL 文を実行する際に、理解が必要な主な各種の認証とアクセス権限の制御方法について学びます。
ここで、OS は Ubuntu 20.04 LTS、PostgreSQL は 11 を想定しています。
PostgreSQL の認証やアクセス権限の制御には下記のようないくつかの層があります。
- (1) OSによる制御
- (2) PostgreSQL サーバによる制御
- PostgreSQLサーバの設定によって、外部からのアクセスを許可するかを設定します。 postgresql.conf で設定します。
- (3) ロールの認証
- 接続してきたロールがアクセス可能かどうかを認証します。pg_hba.conf で設定します。
- (4) アクセス権限
- 接続してきたロールがデータベースやテーブルなどに対してアクセスする権限を持っているかで制御します。GRANT 文や REVOKE 文で設定します。
ここでは PostgreSQL について学びたいので、(2)〜(4)を学びたいと思います。
(2) PostgreSQL サーバによる制御 (postgresql.conf)
postgresql.conf
ファイルで設定します。
例えば、Ubuntu 20.04 LTS だと下記のパスにファイルがあります。 /etc/postgresql/11/main/postgresql.conf
設定パラメータは、listen_addresses
でデフォルトだとコメントアウトされています。
このパラメータには、アクセスを許可するIPアドレスを指定します。
設定例
リモートからのアクセスを許可しない
listen_addresses = 'localhost'
と指定します。PostgreSQL が起動しているホストからのアクセスのみを許可します。リモートからのアクセスを許可しません。
特定のIPアドレスからのアクセスを許可する
listen_addresses = '192.168.0.100'
と指定します。192.168.0.100 からのアクセスのみを許可します。その他のアクセスを許可しません。
すべてのアクセスを許可する
listen_addresses = '*'
と指定します。すべてのネットワークからのアクセスを許可します。
(3) ロールの認証 (pg_hba.conf)
pg_hba.conf
ファイルで設定します。ここで hbaとは、host-based authentication (ホストベース認証)の略です。
どのような接続方式で、どのデータベースに誰が接続できるかを制御します。
pg_hba.conf ファイルの書式は、1行ごとに記述するものです。1行にはいくつかのフィールドがあり、それらはスペースかタブで区切られます。
具体的には下記の7つの書式のどれかの形式をとります。
local database user auth-method [auth-options] host database user address auth-method [auth-options] hostssl database user address auth-method [auth-options] hostnossl database user address auth-method [auth-options] host database user IP-address IP-mask auth-method [auth-options] hostssl database user IP-address IP-mask auth-method [auth-options] hostnossl database user IP-address IP-mask auth-method [auth-options]
各フィールドの意味
接続方式
- local
- ローカルホストからの接続に対する制御
- host
- リモートホストからの接続に対する制御
- hostssl
- hostnossl
接続データベース(database)
対象となるデータベース名を指定します。複数指定する場合は、カンマで区切ります。
その他、データベース名を指定する方法以外に、下記のような指定ができます。
- all
- すべてのデータベースを指定します。ユーザによって特に制限しない場合に使います。
- sameuser
- アクセスするデータベースと同名のユーザの接続に対応します。
- samerole
- データベースと同じ名前のロールのメンバでなければならないことを指定します。
その他、replication があるが直近で使いそうにないので省略します。
データベース名そのものではなくて、別のファイルにデータベース名のリストを記述した場合は、ファイル名の前に@を付けて、そのファイルを参照するように指定する方法もあるようです。
接続ユーザ(user)
データベースユーザを指定します。このユーザですが、どうも PostgreSQLではロールと、グループと同じ意味のようです。
CREATE ROLEは、PostgreSQLデータベースクラスタに新しいロールを加えます。 ロールとは、データベースオブジェクトを所有することができ、データベース権限を持つことができる実体のことです。 ロールは、使用状況に応じて「ユーザ」、「グループ」、もしくは、その両方であるとみなすことができます。
CREATE ROLE より
- all
- すべてのユーザを指定します
- USER_NAME
- 完全一致するデータベースユーザ名を指定します。
- +USER_NAME
- 先頭に
+
をつけると、そのロールのメンバと一致した場合に対象になります。 - 例えば、roleA は roleB のメンバーだとすると、
+roleB
と指定すると、roleB だけでなく、roleA にも接続を許可することになります。
- 先頭に
これ以外にもユーザ名のリストを含む別のファイルを作成して、ファイル名の前に@をつけて指定する方法もあるようです。
接続元のIPアドレス ( IP-address IP-mask)
データベースに接続するクライアントのアドレスを指定します。
アドレスの記述方法は、ホスト名、IPアドレス、IPアドレスの範囲を指定することができます。その他、いくつか特殊な指定方法もあります。
- 単一のホスト例
- IPアドレスの範囲の例(ネットワーク)
172.20.143.0/24
- 全てのIPv4アドレス
0.0.0.0/0
- 全てのIPv6アドレス
::0/0
- どのIPアドレスにも一致する
all
- サーバ自身のIPアドレスのいずれかにも一致する
samehost
- サーバが直接接続されているサブネット内のアドレスのいずれかにも一致する
samenet
認証方式 (auth-method)
クライアントから PostgreSQL サーバに接続するときの認証方式を指定します。
主に下記のような認証方式があります。
- trust
- 接続を無条件で許可する
- reject
- 接続を無条件で拒否する
- 特定のホストをあるグループから除外するために使う
- scram-sha-256
- SCRAM-SHA-256 暗号化によるパスワード認証を行う
- md5
- md5 暗号化によるパスワード認証を行う
- password
- 平文でパスワード認証を行う
- gss
- GSSAPIによる認証を行う
- sspi
- SSPIによる認証を行う
- Windowsでのみ使用可能
- ident
- クライアントのOSのユーザ名を idnet サーバから取得してデータベース接続ユーザ名として使用する
- peer
- OSのユーザ名をカーネルから取得してデータベースの接続ユーザ名として使用する
- ローカル接続でのみ使用可能
- ldap
- LDAPサーバを使用して認証を行う
- radius
- RADIUSサーバを使用して認証を行う
- cert
- SSLクライアント証明書を使用して認証を行う。
- pam
- PAMを使用して認証を行う
認証オプション (auth-options)
auth-methodフィールドの後ろに、 認証方式のオプションを指定することがあります。 今回知りたいことではなかったので、ここでは、省略します。
(4) アクセス権限
力尽きたので、(4) アクセス権限 についは、また次回学びたいと思います。
参考URL :