9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PostgreSQL】『対向(peer)認証に失敗しました』―psqlログインできない際の対応

Last updated at Posted at 2020-11-30

背景

以下の環境でWEBシステムを構築し、EC2上のPstgreSQLへマイグレーションを試みた際に、『対向(peer)認証に失敗しました』というエラーが発生。
その対処を以下に記します。

先人たちの知恵をお借りするなどして解決できたことを、この場をお借りして感謝するとともに、大変恐縮ですが自分のメモとしても、こちらへまとめておきます。

環境

  • AWS EC2 (Amazon Linux 2)
  • Python 3.7.9    ※2020/11/29時点のAmazon Linux2でのデフォルト
  • Django 3.1.3
  • PostgreSQL 11.5  ※同上
  • Nginx 1.12     ※同上
  • Gunicorn
  • Putty 0.74

1.現象

EC2上のPostgreSQLへ、pythonの仮想環境(venv)よりpython manage.py migrateを試みた際に下記エラーが発生。
この時点までに、PostgreSQLでちゃんとユーザーにログイン権限とパスワードを設定しています。

ターミナル
(venv) > python manage.py migrate

・・・割愛・・・

psql: FATAL:  ユーザ "postgres" で対向(peer)認証に失敗しました

2.原因

peer認証という仕組みにあり。

Peer認証とは、カーネルからクライアント上のシステムユーザ名を取得し、PostgreSQLデータベースユーザと同一である場合のみ接続が許可される。

つまり、PostgreSQL内のユーザーとUNIXユーザで、ユーザー名が一致してさえいれば認証情報なしでログイン出来てしまう仕組みです。
ログインの際、postgresユーザー名とパスワードを指定しても、ローカルからのアクセスはUNIXユーザー名とパスワードがpostgresのものと同じでないとダメだったのです。

ちなみに、peer認証のデメリットは以下とのこと。

peer認証のデメリットは、パスワードを入力せずに済むが、ユーザー毎に権限を変えて使い分けたいときや一時的に別のpsqlユーザーとしてログインしたいときは相当にやりづらいですし、psql側でユーザーを作る際に、同名のUNIXユーザーも追加する必要があるために面倒。

3.対処

以下の手順ですすめます。

1) postgresユーザー:"postgres"のパスワードをもう一度設定する

ターミナル
$ sudo su postgres -c 'psql --username=postgres'

2) psqlに入る

ターミナル
postgres=# ALTER USER postgres with encrypted password 'your_password';

3) PostgreSQL側の挙動を変更するために、pg_hba.conf を編集
(上記環境ですと、/var/lib/pgsql/data/pg_hba.confにあります。)

コマンドプロンプトより、sudo vi /var/lib/pgsql/data/pg_hba.confと入力。
ファイルを開くと以下のようになっています。

pg_hba.conf
# ローカルで動いているpsqlへアクセスする場合
local   all             all                                     peer
# 他のクライアントからpsqlへアクセス可能にする場合(例)
host    all             all             127.0.0.1/32            peer

パスワード認証させたい場合は、peerの部分をmd5に変更して保存します。

pg_hba.conf
#ローカルで動いているpsqlへアクセスする場合
local   all             postgres                                md5
#他のクライアントからpsqlへアクセス可能にする場合(例)
host    all             all             127.0.0.1/32            md5

編集時に「i」キー押下、編集後「esc」押下し:wq!と入力して保存。
(保存せずに抜けたい場合は:q!を入力。)
コマンドプロンプトに戻ります。

4) PostgreSQLの再起動

ターミナル
> sudo service postgresql restart

これで再度ログインを行なうと今度はパスワードを求められ、正しい情報を入力することで、自分のUNIXユーザーでもログインできる設定になります。

4.結果

自分のUNIXユーザーからpostgresユーザー:"postgres"として、psqlログインできました。

ターミナル
> psql -U postgres -h localhost -W

・・・【割愛】・・・

postgres=#

参考

(編集後記)

Qiita初投稿です。
誤記や記載不足等ありましたら、ご指摘くださいませ。
何卒よろしくお願いいたします。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?