This is IT

技術、日常

【PostgreSQL】ユーザ作成後、ログインが出来ない問題を解決した(Peer authentication failed)

エラー内容

[環境] Debian11.0 PostgreSQL15.1

PostgreSQLでユーザを作成後、そのユーザでログインができない!という事象が発生しました。 1日くらいハマっていたのですが、解決できたので手順を共有します。

なお、出力されたエラー文としては下記となっております。

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "ユーザ名"

結論

  • PostgreSQLで作成したユーザと同名のユーザを、Linux上でも作成しておく。
  • pg_hba.confを編集し、Peer認証の設定を解除する。

のどちらかで、今回のエラーを回避することができました。 順に説明をしていきます。

エラー発生までの手順

  1. ユーザの作成(成功)
  2. 作成したユーザで、データベース作成(成功)
  3. 作成したユーザでPostgreSQLにログインを試みる(エラー発生)

1. ユーザの作成(成功)

PostgreSQLをインストール後、ターミナルからcreateuserコマンドで、ユーザ(正しくはロール)を作成することができます。

postgresLinux上で切り替え、ユーザの作成を行います。

# postgresユーザに切り替え
❯ sudo su - postgres

# "testadmin"というユーザをパスワード付きで作成
postgres@DESKTOP-GC00DP4:~$ createuser --pwprompt --interactive testadmin
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) y

引き続き、作成したユーザtestadminで、データベースの作成を行っていきます。

2. 作成したユーザで、データベース作成(成功)

createdb -O <ユーザ名> <データベース名>で、オーナーとなるユーザを指定しながらデータベースを作成することが出来ます。

postgres@DESKTOP-GC00DP4:~$ createdb -O testadmin testhoge

psql -lでデータベースの一覧を出力することで、ちゃんと作成ができているかの確認をすることができます。

postgres@DESKTOP-GC00DP4:~$ psql -l
                                             List of databases
   Name    |   Owner   | Encoding  | Collate | Ctype | ICU Locale | Locale Provider |   Access privileges
-----------+-----------+-----------+---------+-------+------------+-----------------+-----------------------
~~~~~~省略

 testhoge  | testadmin | SQL_ASCII | C       | C     |            | libc            |
(9 rows)

3. 作成したユーザでPostgreSQLにログインを試みる(エラー発生)

今回のメインです。

PostgreSQLを再起動後、psql -U <ユーザ名>で、指定したユーザでデータベースに接続が出来るはずなので、試してみたところ・・・。

# PostgreSQlを再起動
❯ sudo service postgresql restart
Restarting PostgreSQL 15 database server: main.

~
# postgresユーザに切り替え
❯ sudo su - postgres

# 作成したユーザで接続を試みる
postgres@DESKTOP-GC00DP4:~$ psql -U testadmin

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "testadmin"

データベースは作成できたのに・・・。

どういった内容のエラーなのか?

今回のエラーとなっている理由は、ここです。

Peer authentication failed for user "testadmin"

どうやらデフォルトでは、あるユーザで接続をする場合、「Peer認証」をしている模様。

peer認証方式はカーネルからクライアント上のオペレーティングシステムのユーザ名を取得し、 それをデータベースユーザ名(オプションのユーザ名マップとともに)として使用することにより動作します。この方法はローカル接続でのみ使用可能です。

つまり、クライアント(Linux,Unix)でのユーザ名と、PostgreSQLで登録したユーザ名が一致している場合のみ、データベースへの接続が可能な認証方式とのこと。

解決の手順

解決の手順として、2パターンあります。

1つ目は、単純にPeer認証の方式に則って、Linux上でも同名のユーザを作成し、そのユーザからPostgreSQLに接続をする方法。

もう一つは、そもそものPeer認証を無効にする方法です。

1つ目は言わずもがななので、2つ目の方法の説明をしていきます。

Peer認証の無効化

pg_hba.confに認証方式の設定が記述されているので、ここを編集してあげることで、Peer認証の無効化をすることができます。

自分の場合は、/etc/postgresql/バージョン数値/main/に、configファイルが格納されていました。

sudo vim pg_hba.conf等で、中を覗いてみます。

# TYPE  DATABASE        USER          ADDRESS               METHOD

# IPv4 local connections:
host    all             all           127.0.0.1/32          peer
# IPv6 local connections:
host    all             all           ::1/128               peer
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all           127.0.0.1/32          peer
host    replication     all           ::1/128               peer

末カラムに記載されいるpeerが、Peer認証方式の設定となっています。

ここの記述をmd5(パスワード認証)もしくは、trust(接続を無条件で許可)に変更をすることで、Peer認証方式を解除することが可能です。

※ローカルでしか使用しないデータベースだったので、今回はtrustに設定しました。

※お恥ずかしながら、どの部分が今回の認証方式か分からなかったので、すべてのpeertrustに変更しました。

trust認証は推奨されていません。

無事解決!と思いきや・・・?

Peer認証からTrustに設定変更をしたため、これでLinux上でわざわざユーザを作成せずとも接続が出来るはずです。

psql -U <ユーザ名>で接続を試してみます。(PostgreSQLを再起動するのを忘れずに。)

❯ psql -U testadmin
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  database "testadmin" does not exist

今度は、「データベースが"testadmin"が存在しない」という旨のエラー文が出てしまいました。

どうやら、これはデータベース名を明示的に指定しない場合、ユーザ名と同名のデータベースへの接続を試みるという仕様のようです。

psql -U <ユーザ名> -d <接続先のデータベース名>で、接続先のデータベースまでしっかり指定してあげましょう。

postgres@DESKTOP-GC00DP4:~$ psql -U testadmin -d testhoge
psql (15.1 (Debian 15.1-1.pgdg110+1))
Type "help" for help.

testhoge=#

まとめ

以上、自分がはまったところの解決手順でした。 PostgreSQLのデータベースに接続をしようとした際、「Peer authentication failed」のエラー文が出てしまった場合は、

  • PostgreSQLで作成したユーザと同名のユーザを、Linux上でも作成しておく。
  • pg_hba.confを編集し、Peer認証の設定を解除する。

のどちらかを試してあげるとよいと思います。