エラー内容
[環境] 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にログインを試みる(エラー発生)
1. ユーザの作成(成功)
PostgreSQLをインストール後、ターミナルからcreateuser
コマンドで、ユーザ(正しくはロール)を作成することができます。
postgres
にLinux上で切り替え、ユーザの作成を行います。
# 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に設定しました。
※お恥ずかしながら、どの部分が今回の認証方式か分からなかったので、すべてのpeer
をtrust
に変更しました。
※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」のエラー文が出てしまった場合は、
のどちらかを試してあげるとよいと思います。