PostgreSQL: FATAL - Peer authentication failed for user (PG::ConnectionBad) - ruby-on-rails

I am working with PostgreSQL and I have a user with password matching the one specified in database.yml
postgres=# select * from pg_user
;
usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valuntil | useconfig
------------+----------+-------------+----------+-----------+---------+----------+----------+-----------
goodsounds | 16386 | t | t | t | t | ******** | |
postgres | 10 | t | t | t | t | ******** | |
(2 rows)
But when I try creating a database by running the command
rails db:create
I get the error
FATAL: Peer authentication failed for user "goodsounds"
Here is my pg_hba.conf:
# Database administrative login by Unix domain socket
local all postgres peer
# 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 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 trust
#host replication postgres ::1/128 trust
Previously "trust" above was md5 but I changed to see if that would help.
Here is my database.yml:
# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
# gem install pg
# On Mac OS X with macports:
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
adapter: postgresql
encoding: unicode
database: goodsounds_development
pool: 5
username: goodsounds
password: test
# Connect on a TCP socket. Omitted by default since the client uses a
# domain socket that doesn't need configuration. Windows does not have
# domain sockets, so uncomment these lines.
host: localhost
port: 5432
# Schema search path. The server defaults to $user,public
#schema_search_path: myapp,sharedapp,public
# Minimum log levels, in increasing order:
# debug5, debug4, debug3, debug2, debug1,
# log, notice, warning, error, fatal, and panic
# The server defaults to notice.
#min_messages: warning
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
adapter: postgresql
encoding: unicode
database: goodsounds_test
pool: 5
username: goodsounds
password: test
production:
adapter: postgresql
encoding: unicode
database: goodsounds_production
pool: 5
username: goodsounds
password: test

"Peer authentication" means that it's using a unix socket and expecting the connecting unix user to have the same unix username as the postgresql username.
Since your local unix username is funkdified and you're trying to connect as user goodsounds over a unix domain socket (local) connection where your pg_hba.conf specifies peer authentication, Pg correctly rejects your connection attempt.
This is the default behaviour for many installs when using unix sockets.
You can:
Connect via TCP/IP by specifying a hostname in your database connection settings;
edit pg_hba.conf to use md5 password authentication instead of peer authentication for unix sockets (local connection type) so Pg accepts password authentication; or
Connect with a PostgreSQL username the same as your unix username and create the user in PostgreSQL if it doesn't exist yet.
See the docs for pg_hba.conf and the rest of the client authentication chapter of the documentation.
Note that changes to pg_hba.conf do not take effect immediately, you must restart or at least reload PostgreSQL to get it to reread pg_hba.conf.
Oh, also, if you have multiple PostgreSQL versions installed you might have a libpq from one version and a server from another. In this case make sure the location for the unix socket that libpq connects to by default is the same as the server's unix_socket_directories or override it with (e.g.) host=/tmp in your connection string.

I was facing same problem on Ubuntu machine so I removed this error by following some steps.
Switch to postgres user
$ sudo su - postgres
it will ask for password and by default password is postgres
After switch the user to postgres, open psql console
$ psql
so check the version of postgres if multiple versions are available
psql=# select VERSION();
PostgreSQL 9.1.13 on x86_64-unk.... # so version is 9.1
Now Open postgres user
vim /etc/postgresql/9.1/main/pg_hba.conf
9.1 is version return form upper command
and replace
local all postgres peer
to
local all postgres md5
Restart the service
sudo service postgresql restart
I write steps on my blog also
http://tarungarg402.blogspot.in/2014/10/set-up-postgresql-on-ubuntu.html

If "peer authentication" does not work, try md5 authenticaion.
To specify host try something like this:
psql -d <dbname> -U <username> -h <hostname>
or this:
psql -d <dbname> -U <username> -h <hostname> -W

edit /etc/postgresql/9.3/main/pg_hba.conf
# "local" is for Unix domain socket connections only
local all all peer
change to below line and it works for me
# "local" is for Unix domain socket connections only
local all all md5

Here's how I solved it;
Run the command below to confirm your PostgreSQL version.
psql --version
Navigate to the PostgreSQL configuration directory on your server, which is in /etc/postgresql/10/main. Take note that 10 is the version of my PostgreSQL installation on my server. Your version might be 9.5, 11 or 12 or any other version.
cd ~
cd /etc/postgresql/10/main
Once you navigate into the /etc/postgresql/10/main directory, open the file pg_hba.conf using the command below. This file controls: which hosts are allowed to connect, how clients are authenticated, which PostgreSQL user names they can use, which databases they can access:
sudo nano pg_hba.conf
Replace the following line below:
# Database administrative login by Unix domain socket
local all postgres peer
with the line below:
# Database administrative login by Unix domain socket
local all postgres md5
Also, replace the following line below:
# "local" is for Unix domain socket connections only
local all all peer
with the line below:
# "local" is for Unix domain socket connections only
local all all md5
Additionally, we may want to allow inbound connections to the PostgreSQL database in production (to allow host connections from all databases, all users, all addresses using the md5 method).
To achieve this, add the line below at the end of the file, and then save the file:
# remote connections
host all all all md5
Still within the /etc/postgresql/10/main directory, open and edit the file postgresql.conf using the command below:
sudo nano postgresql.conf
Replace the line # listen_address='127.0.0.1' or the line listen_address='127.0.0.1' or the line # listen_address='localhost' or the line listen_address='localhost' with the line below, in order to allow PostgreSQL database to listen to connections from all addresses:
listen_addresses = '*'
Save the file, and navigate to the root directory of your server:
cd ~
Restart or reload the PostgreSQL server using the command below:
sudo systemctl restart postgresql # To restart
sudo systemctl reload postgresql # To reload

Related

Logs say "fe_sendauth: no password supplied" but rails console working without problems

I'm trying to deploy rails app with capistrano, nginx and puma. When I visit the app I get errors like this in my production.log:
[11c972c9-c8fb-404f-93c3-9fc614ad815b] ActiveRecord::ConnectionNotEstablished (connection to server at "localhost" (127.0.0.1), port 5432 failed: fe_sendauth: no password supplied
):
When I log to this machine and run bin/rails console it works without any problems, I can create records, query records. Connection to database works without problems.
RAILS_ENV is set to production in /etc/environment
Any idea what could be the problem?
database.yml
default: &default
adapter: postgresql
encoding: unicode
host: localhost
password: <%= ENV['APP_DATABASE_PASSWORD'] %>
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
production:
<<: *default
database: app_production
username: app
pg_hba.conf
local all postgres peer
# 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 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
The solution for me was to delete PostgreSQL completely using,
sudo apt-get --purge remove postgresql\*
Click yes on that pop-up, re-install PostgreSQL using,
sudo apt update
then,
sudo apt install postgresql postgresql-contrib
then,
sudo service postgresql start
Finally, you'll also need to create a database user so that you are able to connect to the database from Rails. First, check what your operating system username is:
whoami
If your username is "stack", for example, you'd need to create a Postgres user with that same name. To do so, run this command to open the Postgres CLI:
sudo -u postgres -i
From the Postgres CLI, run this command (replacing "stack" with your username):
createuser -sr stack
Then enter control + d or type logout to exit.

ROR is unable to connect PostgreSQL could not connect to server: Permission denied; while console can connect

I have a Ruby on Rails application running on nginx server (application server is on Red Hat OS). The database is installed on another server (same OS: Red Hat).
From console of the application server, I'm able to connect to the database using same db credentials as in application. But the ruby application is not able to make a connection. It is throwing error
The error log /var/log/nginx/error.log has below error message
stderr:
PG::ConnectionBad (could not connect to server: Permission denied
Is the server running on host "10.178.61.135" and accepting
TCP/IP connections on port 5432?
):
Also, to mention I'm able to run the rake db:migrate successfully
The database.yml file looks like below:
production:
adapter: postgresql
encoding: unicode
database: applicationdatabase
host: 10.178.61.135
pool: 30
port: 5432
timeout: 10000
username: dbuser
password: dbpassword
On Database server the connection config /var/lib/pgsql/11/data/pg_hba.conf:
# Allow replication connections from localhost, by a user with the replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
host all all 0.0.0.0/0 md5
Database privilege
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+-------------+----------+-------------+-------------+-----------------------------
applicationdatabase | dbuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/dbuser +
| | | | | dbuser=CTc/dbuser
Other configs and versions
# Web app Server
nginx/1.10.1
Phusion passenger 5.0.29
Ruby 2.1.9
Rails 4.1.5
pg 0.17.1
RHEL 7.7
# DB Server
PostgreSQL 11.3
RHEL 7.7
If 'psql' on the app server can connect but your application itself cannot, it sounds like something on the app server machine, like selinux or apparmor, which controls which users or apps can use the network.

Unable to get through Postgres connection with ActiveRecord

For sake of Lord, I'm unable to understand why postgres is complaining about password authentication(using ActiveRecord).
sudo -u postgres psql rdb
This work (no password is asked)
local all postgres peer
# 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
But when connecting with an ORM like ActiveRecord it complains.
ActiveRecord::Base.establish_connection(adapter: 'postgresql', username: 'postgres', database: 'rdb')
The server requested password-based authentication, but no password was provided.
This a basic setup and I was expecting this to work all the time. My last resort would be to allow trust or md5(on pg_hba.conf) but before I move ahead with that can some please provide me with some pointer as to why the above did not work.
Just an update postgres is running at localhost
The sudo command is triggering the local all postgres peer restriction, not asking for a password. The ActiveRecord configuration with the postgresql adapter uses this:
:host - Defaults to a Unix-domain socket in /tmp. On machines without
Unix-domain sockets, the default is to connect to localhost.
Do you have working sockets on your machine? Is /tmp writeable? It might be the case that a TCP connection to 127.0.0.1 is used, triggering the password check as indicated by md5.

How to connect to localhost PostgreSQL on Mac using PSequel GUI?

I followed this tutorial to install PG on my Mac. It's my first time using PG locally. I used Sqlite a lot in my Rails projects before this.
I found this PSequel GUI app and I just installed it. But I've no idea how to connect to my localhost PostgreSQL databases.
What is my:
Host/Socket?
Port? (I use localhost:3000 to test my Rails app locally)
User?
Password?
Database?
Thanks.
localhost:3000 is the default url of webrick webserver. By default postgre SQL service connection is to localhost on 5432 post.
$ cat /etc/services | grep postgres
postgres 5432/tcp # POSTGRES
postgres 5432/udp # POSTGRES
That is for unix like systems. And I have postgres server listening on 5432 port.
$ netstat -l --numeric-ports |grep 5432
tcp 0 0 localhost.localdomain:5432 *:*
unix 2 [ ACC ] STREAM LISTENING 11396 /tmp/.s.PGSQL.5432
So the fields will have the following default values:
Host/Socket
localhost
For test/development purposes most people use local server to connect to db.
Port
5432
That is just postgres server (not webserver) connection port. To validate just list and grep the postgres configuration file, like follows:
# cat /var/lib/pgsql/data/postgresql.conf | grep port
#port = 5432 # (change requires restart)
Here it is commented out, so default values are applied.
User
you are, but you must create the user role before connection as of the postgres user with createuser or psql terminal utilities.
Password
When you will create the user just leave password empty. So you be able then stay the field empty in the form.
Database
That is the database name. Create it with the command if needed.
You should enter below detail for configuration:
Host/Socket? - localhost
Port? - 5432
User? - DB user(My case its: postgres)
Password? - Password for above user
Database? - DB name of your project
You can see screenshot in this site: http://www.psequel.com/

psql: FATAL: Peer authentication failed for user "blah"

On CentOS, I am trying to use rake to migrate data from sqlite3 to postgresql.
When I try to connect to PostgreSQL using the command line:
psql -d <db> -U <user> -W
I get:
psql: FATAL: Peer authentication failed for user "blah"
For testing I even set method to trust for psql. Here are the contents of my pg_hba.conf:
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
Any ideas what might be wrong?
Thanks
Restart PostgreSQL and if that fails post the full pg_hba.conf for us to look at.
Either PostgreSQL has not reloaded this file or you are looking at the wrong pg_hba.conf.

Resources