エラー内容
[環境] 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認証の設定を解除する。
のどちらかで、今回のエラーを回避することができました。 順に説明をしていきます。
エラー発生までの手順
- ユーザの作成(成功)
- 作成したユーザで、データベース作成(成功)
- 作成したユーザで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」のエラー文が出てしまった場合は、
- PostgreSQLで作成したユーザと同名のユーザを、Linux上でも作成しておく。
- pg_hba.confを編集し、Peer認証の設定を解除する。
のどちらかを試してあげるとよいと思います。