エラーの取得:pgsqlをRailsで動作させようとしたときに、ユーザー「postgres」のピア認証が失敗しました


738

エラーが発生します:

FATAL: Peer authentication failed for user "postgres"

PostgresをRailsで動作させようとしたとき。

ここに、私のpg_hba.conf、私のdatabase.yml、そして完全なトレースのダンプがあります

pg_hbaで認証をmd5に変更し、別のことを試みましたが、どれも動作しないようです。

Rails 3.2に従って新しいユーザーとデータベースを作成してみました。致命的:ユーザーのピア認証に失敗しました(PG :: Error)

しかし、それらはpgadminに表示されませんsudo -u postgres psql -l

私が間違っているところはありますか?


1
1):「postgres」という名前のユーザーが作成されており、データベースに対する権限を持っていることを確認してください2):ユーザーにパスワードがあることを確認してください3): config / database.ymlに権限資格情報が含まれていることを確認してください(ユーザー名+パスワード)
吉路さん


13
この回答もご覧ください。接続は失敗するかもしれませんがlocalhost、成功するかもしれません127.0.0.1
uvsmtid

9
私の場合host: localhostdatabase.ymlファイルを追加する必要がありました。
Mihail Velikov

回答:


1028

問題はまだpg_hba.confファイル(/etc/postgresql/9.1/main/pg_hba.conf*)です。

この行:

local   all             postgres                                peer

する必要があります:

local   all             postgres                                md5

*このファイルが見つからない場合は、実行locate pg_hba.confするとファイルの場所が表示されます。

このファイルを変更した後、PostgreSQLサーバーを再起動することを忘れないでください。Linuxを使用している場合は、そうなりますsudo service postgresql restart

これらは、認証方法に関するPostgreSQL公式ドキュメントによる両方のオプションの簡単な説明です。

ピア認証

ピア認証方法は、カーネルからクライアントのオペレーティングシステムのユーザー名を取得し、それを許可されたデータベースユーザー名として使用します(オプションのユーザー名マッピングを使用)。このメソッドは、ローカル接続でのみサポートされています。

パスワード認証

パスワードベースの認証方法は、md5とパスワードです。これらの方法は、パスワードが接続を介して送信される方法、つまりそれぞれMD5ハッシュおよびクリアテキストを除いて、同様に動作します。

パスワードの「スニッフィング」攻撃を心配している場合は、md5をお勧めします。可能であれば、プレーンなパスワードは常に避けてください。ただし、md5をdb_user_namespace機能とともに使用することはできません。接続がSSL暗号化によって保護されている場合、パスワードを安全に使用できます(SSLの使用に依存している場合は、SSL証明書認証の方が適している場合があります)。

のサンプルの場所pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf


50
これを変更した後は、postgresqlサービスをリロードする必要があります/etc/init.d/postgresql reload
funkotron

78
このファイルの場所を常に忘れているので、ここにこれを配置します/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron少なくとも私のElementaryOS(Ubuntu)のインストールでsudo service postgreql restartも動作します。
Marnen Laibow-Koser 2014

13
私自身の質問に答えるには、「ピア」認証とは、postgresがオペレーティングシステムにログイン名を要求し、これを認証に使用することを意味します。したがって、OSとpostgresのユーザーは同じである必要があります。「md5」は暗号化されたパスワード認証を使用します。
デニス14年

9
私は変化を理解しています。しかし、なぜこれがデフォルトの動作ではないのですか?md5を使用して何か欠点はありますか?
Victor Marconi

363

Postgresqlをインストールした後、以下の手順を実行しました。

  1. pg_hba.confUbuntu のファイルを開き、/etc/postgresql/9.x/main次の行を変更します。

    ローカルのすべてのpostgresピア

    ローカルのすべてのpostgres信頼
  2. サーバーを再起動します

    $ sudo service postgresql restart
  3. psqlにログインし、パスワードを設定します

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. 最後に変更さpg_hba.confから

    ローカルのすべてのpostgres信頼

    ローカルのすべてのpostgres md5

postgresqlサーバーを再起動した後、自分のパスワードでアクセスできます

認証方法の詳細:

信頼-サーバーに接続できるすべてのユーザーがデータベースへのアクセスを許可されます

ピア-クライアントのオペレーティングシステムのユーザー名をデータベースユーザー名として使用してアクセスします。

md5-パスワードベースの認証

詳細については、こちらをご覧ください


18
方法を「信頼」に変更することでうまくいきました。認証方法の詳細については、+ 1。
La-comadreja 2014年

4
OS Xの自作ではデフォルトが信頼ですが、Ubuntuではどういうわけかデフォルトが「ピア」に設定されているため、私のセットアップと同僚のセットアップとの間に不一致が生じました。私たちは彼をMD5に変更しましたが、役に立たなかったので、「信頼」が本当の答えです(開発テストのみを行っています)。賛成票を増やす必要があります。
xji 2014年

2
md5を最初から設定することもできます
Artem.Borysov

2
この方法は私にとってはうまくいき、メソッドmd5を最初に使用することはできませんでした。
sianipard

同じパスワードを使用する必要がありますか? sudo passwd postgres
Peter Krauss 2017

211

localhost(127.0.0.1)経由で接続する場合、その特定の問題は発生しません。pg_hba.confをあまり変更しませんが、代わりに接続文字列を調整します。

psql -U someuser -h 127.0.0.1 database

ここで、someuserは接続しているユーザーであり、databaseはユーザーが接続する権限を持つデータベースです。

postgresをセットアップするためにDebianで行うことは次のとおりです。

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root 

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    Shall the new role be a superuser? (y/n) n
    Shall the new role be allowed to create databases? (y/n) y
    Shall the new role be allowed to create more new roles? (y/n) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

楽しい!


16
他の回答が推奨するように、グローバル構成をいじることなく、いじることなくローカルの問題を実際に解決するので、これは最良の解決策だと思います。
jeteon

1
host: 127.0.0.1config / database.ymlのデフォルトからlocalhostに変更する必要がありました-同じマシン上にあるため、理由がわかりません
Anthony

Anthony、database.ymlでlocalhostを127.0.0.1に調整するまで、接続障害が発生したと言っていますか?その場合は、/ etc / hostsファイルを確認することをお勧めします。それ以外の場合は、localhostの解決に関連する他の奇妙な点があるかもしれません。
StylusEater 2017年

1
これは、ローカルピア認証方法をいじるよりもはるかにエレガントです。
mdh 2017

1
これは、群を
抜い


16

問題がある場合は、を見つける必要がありますpg_hba.conf。コマンドは次のとおりです。

find / -name 'pg_hba.conf' 2>/dev/null

その後、構成ファイルを変更します。

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

次のステップは次のとおりです。dbインスタンスを再起動します。

service postgresql-9.3 restart

問題がある場合は、もう一度パスワードを設定する必要があります。

ALTER USER db_user with password 'db_password';


16
  1. この/etc/postgresql/9.x/main/に移動し、pg_hba.confファイルを開きます

私の場合:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. ピアmd5に置き換えます

したがって、これは次のように変更されます。

UNIXドメインソケットローカルのすべてのpostgresピアによるデータベース管理ログイン

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

この:

UNIXドメインソケットローカルによるデータベース管理ログインすべてのpostgres md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. 次に、pgサーバーを再起動します。

    $> sudo service postgresql restart

以下は、postgresとの接続に使用されるメソッドのリストです。

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

注:まだpostgresユーザーを作成していない場合。これを作成すると、そのユーザー資格情報を使用してpostgresサーバーにアクセスできます。

ヒント: postgresの再起動後に機能しない場合は、ターミナルを閉じて再度開いてください。


15
sudo psql --host=localhost --dbname=database-name --username=postgres

これは私の問題を解決しました


3
そんなに簡単だとは思いませんでしたが、debian 9でうまくいきました
Hayden Thring

これはUbuntu 19.10
Vithal Reddy

おかげで、Ubuntu 19.10とpsql 12.3に対応しています
Happy Singh

10

私も同じ問題を抱えていました。

depaのソリューションは完全に正しいです。

PostgreSQLを使用するように設定されたユーザーがいることを確認してください。

ファイルを確認します。

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

このファイルの権限は、psqlを登録したユーザーに付与する必要があります。

さらに。あなたが今まで良ければ…

@depaの指示に従って更新します。

すなわち

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

次に変更を加えます。


同じ問題に直面しています。しかし、どのようなアクセス許可が必要かはわかりません。手伝って頂けますか。「ls」コマンドの出力を取得しています-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

デフォルトの設定を維持したいが、特定のユーザー/データベース接続のソケット接続を使用したmd5認証が必要な場合は、「local all / all」行の前に「local」行を追加します。

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   username     dbname                           md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

この回答の「BEFORE」は、他の回答でさらに詳しく説明する価値があります。これは、ドキュメントに記載された順番通りpg_hba.confファイルにはpsqlが調べレコードが判明:postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

#TYPE DATABASE USER ADDRESS METHOD local username dbname md5#<-this line Not in order
Kiry Meas

7

クローンサーバーのデータディレクトリを移動していて、postgresとしてログインできませんでした。このようにpostgresパスワードをリセットすると、うまくいきました。

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

上記の編集は、postgresサーバーを作成した後に再起動する必要があることがわかったので、うまくいきました。ubuntuの場合:

sudo /etc/init.d/postgresql restart

6

pg_hba.conf を信頼するようにMETHOD ピアを変更(/etc/postgresql/9.1/main/pg_hba.conf | 85行目)すると、問題が解決します。md5を追加するとパスワードが要求されるため、パスワードの使用を回避する必要がある場合は、md5の代わりに信頼を使用してください。


6

host=localhost接続して使用します。

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);

5

以下のコマンドは私のために働きます:

psql -d myDb -U username -W

man psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
Yaroslav Nikitenko

3

METHODを信頼するように設定するだけです。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

そして、postgresサーバーをリロードします。

# service postgresql-9.5 reload

pg_hba.confの変更では、RESTART postgresサーバーは必要ありません。ただリロード。


3

他の回答の多くは、さまざまな構成ファイルの設定に関係しており、pg_hba.confdoに関係する回答が適用され、100%正しいです。ただし、正しい構成ファイルを変更していることを確認してください。

他の人が述べたように、構成ファイルの場所は、メイン構成ファイル内のさまざまな設定で上書きできるほか、-Dオプションを使用してコマンドラインでメイン構成ファイルへのパスを指定できます。

psqlセッション中に次のコマンドを使用して、構成ファイルが読み取られている場所を表示できます(psqlを起動できる場合)。これは、一部の人々を助けることができるトラブルシューティング手順です:

select * from pg_settings where setting~'pgsql';  

また、postgresユーザーのホームディレクトリが予想どおりの場所にあることを確認する必要があります。プロンプトが~ホームディレクトリの実際のパスの代わりに' ' を表示するため、これを見過ごすのは非常に簡単であり、それほど明白ではないため、これを言います。多くのインストールでは、デフォルトでpostgresユーザーのホームディレクトリがに設定されてい/var/lib/pgsqlます。

想定どおりに設定されていない場合は、postgresqlサービスを停止し、rootとしてログインして次のコマンドを使用します。また、postgresユーザーが別のセッションにログインしていないことを確認してください:

usermod -d /path/pgsql postgres

最後にecho $PGDATA、を入力してPGDATA変数が正しく設定されていることを確認します。これにより、次のようなものが出力されます。

/path/pgsql/data

設定されていないか、予想とは異なる場合は、.profileや.bash.rcなどの起動ファイルまたはRCファイルを調べてください。これは、OSやシェルによって大きく異なります。マシンの正しい起動スクリプトを決定したら、次のものを挿入できます。

export PGDATA=/path/pgsql/data

私のシステムでは、これ/etc/profile.d/profile.local.shをすべてのユーザーがアクセスできるように配置しました。

これで、通常どおりデータベースを初期化でき、すべてのpsqlパス設定が正しいはずです。


3

pg_configは、拡張機能とクライアントプログラムのコンパイルとPostgreSQLへのリンクを支援するための準拠情報です。マシン上のアクティブなPostgreSQLインスタンスについては何も認識せず、バイナリのみを認識します。

pg_hba.confは、Pgのインストール方法に応じて、他の多くの場所に表示されます。標準の場所は、データベースのdata_directory内のpg_hba.confです(/ home、/ var / lib / pgsql、/ var / lib / postgresql / [version] /、/ opt / postgres /などにあります)。しかし、ユーザーとパッケージャーは好きな場所に置くことができます。残念ながら。

pg_hba.confを見つける唯一の有効な方法は、実行中のPostgreSQLインスタンスにpg_hba.confがどこにあるか、またはsysadminにどこにあるかを尋ねることです。Pgの起動時にinitスクリプトが-c hba_file = / some / other / pathのようなパラメーターを渡す可能性があるため、datadirがどこにあるかを尋ねたり、postgresql.confを解析したりすることさえできません。

あなたがやりたいことはPostgreSQLに尋ねることです:

SHOW hba_file;

このコマンドはスーパーユーザーセッションで実行する必要があるため、シェルスクリプトでは次のように記述します。

psql -t -P format=unaligned -c 'show hba_file';

また、環境変数PGUSER、PGDATABASEなどを設定して、接続が正しいことを確認します。

はい、これは多少問題があります。ユーザーが接続できない場合(たとえば、pg_hba.confの編集を台無しにした後で)、修正するためにpg_hba.confを見つけることができません。

別のオプションは、psコマンドの出力を見て、postmasterデータディレクトリ引数-Dがそこに表示されるかどうかを確認することです。たとえば、

ps aux  | grep 'postgres *-D'

pg_hba.confはデータディレクトリ内にあるため(Debian / Ubuntuまたはその派生物を使用していて、それらのパッケージを使用している場合を除きます)。

Debian / UbuntuパッケージからPostgreSQLがインストールされているUbuntuシステムをターゲットにしている場合は、少し簡単になります。誰かがinitdbでホームディレクトリにデータディレクトリを作成した、または/ optにEnterpriseDB Pgをインストールした、手動でコンパイルされたソースからのPgを処理する必要はありません。pg_wrapper、Debian / Ubuntu multiに問い合わせることができます。 -version pgmanager。PostgreSQLはpg_wrapperからpg_lsclustersコマンドを使用します。

接続できない場合(Pgが実行されていない場合、またはpg_hba.confを編集して接続する必要がある場合)、システムでpg_hba.confファイルを検索する必要があります。MacとLinuxでは、sudo find / -type f -name pg_hba.confのようなものが実行されます。次に、同じディレクトリにあるPG_VERSIONファイルをチェックして、複数ある場合は、それが正しいPostgreSQLバージョンであることを確認します。(pg_hba.confが/ etc /にある場合、これを無視してください。代わりに、それは親ディレクトリ名です)。同じPostgreSQLバージョンに複数のデータディレクトリがある場合は、データベースサイズを確認する必要があります。psから実行中のpostgresのコマンドラインを調べて、データディレクトリ-D引数が編集中の場所と一致するかどうかを確認します。 。 /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

私の問題は、サーバーを入力しなかったことです。プレースホルダーのせいでデフォルトだと思いましたが、localhostと入力するとうまくいきました。


2

Cloud 9でこのファイルを見つけようとしている場合は、

sudo vim /var/lib/pgsql9/data/pg_hba.conf

を押しIて編集/挿入し、ESC3回押し:wqます。タイプするとファイルが保存され、終了します


2

Railsでこの問題に直面していて、正しいユーザー名とパスワードを使用してそのユーザー名をすでに作成していることがわかっている場合は、database.ymlファイルの最後に次のように入力するだけです。

host: localhost

全体的なファイルは以下のようになります

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

pg_hba.confファイルに触れる必要はまったくありません。ハッピーコーディング


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.