無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

PostgreSQLの認証とアクセス権限の制御

PostgreSQLSQL 文を実行する際に、理解が必要な主な各種の認証とアクセス権限の制御方法について学びます。

ここで、OS は Ubuntu 20.04 LTS、PostgreSQL は 11 を想定しています。

PostgreSQL の認証やアクセス権限の制御には下記のようないくつかの層があります。

  • (1) OSによる制御
    • まずはOSによるアクセス制御があります。例えば、Linux なら iptables などで外部からのアクセスを許可が必要です。デフォルトでは TCP 5432 ポートを使うので、このポートへのアクセスが許可されている必要があります。
  • (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]

各フィールドの意味

接続方式

接続データベース(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アドレスの範囲を指定することができます。その他、いくつか特殊な指定方法もあります。

  • 単一のホスト例
    • 172.20.143.89/32 (単一ホストを指定するには、IPv4では32、IPv6では128というマスク長を使用する)
  • 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 :

https://www.postgresql.jp/docs/11/auth-pg-hba-conf.html