環境
PostgreSQL12.4
Ubuntu20.4
はじめに
PostgreSQLに接続するときの認証には、デフォルトでpeer認証が使われています。 /etc/postgresql/12/main/pg_hba.conf を見ると、デフォルトでは次の設定になっています。
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all peer
設定の見方ですが、1行目は、UNIXドメインソケットを使用した接続、つまり、ローカルからの接続において、すべてのデータベースに対して、postgresユーザーが接続するときは、peer認証が適用されますという意味になります。
2行目は、postgresユーザー以外のユーザーが接続するときも、すべてのデータベースに対して、peer認証が適用されますという意味になります。
設定
特定の1ユーザー(testユーザー)だけパスワード認証にして、残りのユーザーはpeer認証にする場合は次のようにします。
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all test md5
local all all peer
ここで重要なことは、testユーザーは2行目に追加するということです。testユーザーを3行目に追加すれば、パスワード認証は有効になりません。
pg_hba.confの設定はファイヤーウォールを設定する際の記述方法に似ています。pg_hba.confは上から順番に読み込まれます。そして、下位の記述に上位の記述と重複する設定がある場合は、上位の設定の方が有効になります。
上記の例では、test(2行目)の下にall(3行目)があります。testはallの中に含まれるため、重複した記述になっています。この場合、下位にあるallが有効になるのではなく、上位のtestの方が有効になります。つまり、testユーザーはパスワード認証が有効になるということです。METHODにmd5とありますが、パスワードをMD5のアルゴリズムで暗号化するという意味です。パスワードを平文で送る場合は、METHODはpasswordの設定になります。セキュリティが弱くなるため、恐らく、この設定をすることはないかと思います。ちなみに、認証を一切行わない場合は、METHODの設定はtrustになります。更にセキュリティが弱くなるため、この設定もすることはないかと思います。
pg_hba.confの設定を変更したら、PostgreSQLのサービスを再起動する必要があります。再起動しないと設定が有効になりません。
まとめ
さて、peer認証からパスワード認証に変更する理由ですが、PostgreSQLに新規でロールを追加する場合、peer認証だとPostgreSQLにロールを追加した後、Linuxにも同じ名前のユーザー名を追加する必要がでてきます。Linuxには新規ユーザーを追加したくないといった場合は、パスワード認証を採用することで回避することができます。つまり、testユーザーがLinuxにない状態で、別のユーザーでLinuxにログインしていても、下記のコマンドでPostgreSQLにログインできるようになるということです。
#psql -U test -d データベース名
参考
PostgreSQLの公式マニュアル
https://www.postgresql.jp/document/12/html/auth-pg-hba-conf.html