背景
以下の環境で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
と入力。
ファイルを開くと以下のようになっています。
# ローカルで動いているpsqlへアクセスする場合
local all all peer
# 他のクライアントからpsqlへアクセス可能にする場合(例)
host all all 127.0.0.1/32 peer
パスワード認証させたい場合は、peer
の部分をmd5
に変更して保存します。
#ローカルで動いている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=#
参考
- peer認証の関係でpsqlログインできない時の対処法 @tomlla様
- PostgreSQL “対向(peer)認証に失敗しました” エラーが出るときの対処法
- PostgreSQL 認証に失敗しないための Ident、MD5、Trust 比較
(編集後記)
Qiita初投稿です。
誤記や記載不足等ありましたら、ご指摘くださいませ。
何卒よろしくお願いいたします。