Ottenere errore: autenticazione peer non riuscita per l'utente "postgres", quando si tenta di far funzionare pgsql con le rotaie


738

Ricevo l'errore:

FATAL: Peer authentication failed for user "postgres"

quando provo a far funzionare Postgres con Rails.

Ecco il mio pg_hba.conf, il mio database.ymle un dump della traccia completa .

Ho cambiato l'autenticazione in md5 in pg_hba e ho provato diverse cose, ma nessuna sembra funzionare.

Ho anche provato a creare un nuovo utente e database secondo Rails 3.2, FATAL: autenticazione peer non riuscita per l'utente (PG :: Errore)

Ma non si presentano su pgadmin o anche quando corro sudo -u postgres psql -l.

Qualche idea su dove sbaglio?


1
1): assicurati di avere un utente chiamato "postgres" creato e che abbia diritto sul tuo database 2): assicurati che abbia una password 3): assicurati che config / database.yml contenga le credenziali dei diritti (nome utente + password)
MrYoshiji,

2
ho bisogno che il peer e il rientro siano sempre impostati su md5
Artem.Borysov,

13
Vedi anche questa risposta : la connessione potrebbe non localhostriuscire ma riuscire 127.0.0.1.
uvsmtid,

9
Nel mio caso, dovevo aggiungere host: localhostil database.ymlfile.
Mihail Velikov,

Risposte:


1028

Il problema è ancora il tuo pg_hba.conffile ( /etc/postgresql/9.1/main/pg_hba.conf*).

Questa linea:

local   all             postgres                                peer

Dovrebbe essere:

local   all             postgres                                md5

* Se non riesci a trovare questo file, l'esecuzione locate pg_hba.confdovrebbe mostrare dove si trova il file.

Dopo aver modificato questo file, non dimenticare di riavviare il server PostgreSQL. Se sei su Linux, sarebbe sudo service postgresql restart.

Queste sono brevi descrizioni di entrambe le opzioni secondo i documenti PostgreSQL ufficiali sui metodi di autenticazione .

Autenticazione peer

Il metodo di autenticazione peer funziona ottenendo il nome utente del sistema operativo del client dal kernel e utilizzandolo come nome utente del database consentito (con mappatura opzionale del nome utente). Questo metodo è supportato solo su connessioni locali.

Autenticazione password

I metodi di autenticazione basati su password sono md5 e password. Questi metodi funzionano in modo simile, tranne per il modo in cui la password viene inviata attraverso la connessione, ovvero rispettivamente con hash MD5 e testo in chiaro.

Se sei preoccupato per gli attacchi "sniffing" della password, allora è preferibile md5. La password semplice dovrebbe sempre essere evitata, se possibile. Tuttavia, md5 non può essere utilizzato con la funzione db_user_namespace. Se la connessione è protetta dalla crittografia SSL, la password può essere utilizzata in modo sicuro (sebbene l'autenticazione con certificato SSL possa essere una scelta migliore se si dipende dall'utilizzo di SSL).

Posizione di esempio per pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Dovrai ricaricare il tuo servizio postgresql dopo averlo modificato/etc/init.d/postgresql reload
funkotron,

78
mettendolo qui poiché ho sempre dimenticato dove si trova questo file/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron Almeno sulla mia installazione di ElementaryOS (Ubuntu), sudo service postgreql restartfunziona anche.
Marnen Laibow-Koser,

13
Per rispondere alla mia domanda: l'autenticazione "peer" significa che Postgres richiede al sistema operativo il tuo nome di accesso e lo utilizza per l'autenticazione, quindi l'utente sul sistema operativo e su Postgres deve essere lo stesso. 'md5' utilizza l'autenticazione con password crittografata.
Dennis,

9
Capisco il cambiamento. Ma perché non è questo il comportamento predefinito? C'è qualche svantaggio usando md5?
Victor Marconi,

364

Dopo aver installato Postgresql ho fatto i seguenti passaggi.

  1. apri il file pg_hba.confper Ubuntu in cui si trova /etc/postgresql/9.x/maine cambia questa riga:

    peer locale di tutti i postgres

    per

    fiducia locale di tutti i postgres
  2. Riavvia il server

    $ sudo service postgresql restart
  3. Accedi a psql e imposta la tua password

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Finalmente cambia il pg_hba.confda

    fiducia locale di tutti i postgres

    per

    locale tutti i postgres md5

Dopo aver riavviato il server postgresql, è possibile accedervi con la propria password

Dettagli sui metodi di autenticazione:

fiducia: chiunque sia in grado di connettersi al server è autorizzato ad accedere al database

peer: utilizzare il nome utente del sistema operativo del client come nome utente del database per accedervi.

md5 - autenticazione basata su password

per ulteriori riferimenti consultare qui


18
cambiare il metodo in "fiducia" ha funzionato per me. +1 per la spiegazione dei dettagli del metodo di autenticazione.
La-comadreja,

4
Su OS X homebrew il valore predefinito è trust, mentre su Ubuntu in qualche modo il valore predefinito è impostato su "peer", il che ha portato a discrepanze tra la mia configurazione e quella del mio collega. Abbiamo cambiato il suo in MD5 che non ha aiutato, quindi "fiducia" è la vera risposta qui (stiamo solo facendo test di sviluppo). Dovrebbe ottenere più voti.
xji,

2
puoi anche impostare md5 ovunque fin dall'inizio
Artem.Borysov,

2
In questo modo funziona per me, usando prima il metodo md5 non lo era.
sianipard,

devi usare le stesse password? sudo passwd postgres
Peter Krauss,

213

Se ti connetti tramite localhost (127.0.0.1) non dovresti riscontrare quel particolare problema. Non mi farei molto male con pg_hba.conf ma invece regolerei la tua stringa di connessione:

psql -U someuser -h 127.0.0.1 database

dove someuser è il tuo utente a cui ti stai connettendo e database è il database a cui l'utente ha l'autorizzazione a connettersi

Ecco cosa faccio su Debian per installare postgres:

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

Godere!


16
Penso che questa sia la soluzione migliore in quanto risolve effettivamente il problema locale senza pasticciare senza confondere con la configurazione globale come le altre risposte raccomandano.
jeteon

1
Ho dovuto passare host: 127.0.0.1dal default a localhost in config / database.yml - è sulla stessa macchina, quindi non capisco perché
Anthony,

Anthony, stai dicendo che hai riscontrato un errore di connessione fino a quando non hai impostato localhost su 127.0.0.1 in database.yml? Ti suggerisco di controllare il tuo file / etc / hosts in questo caso. Altrimenti, potrebbero esserci altre stranezze legate alla risoluzione di localhost.
StylusEater

1
Questo è molto più elegante rispetto al pasticciare con il metodo di autenticazione peer locale.
mdh,

1
Questa è di gran lunga la migliore soluzione IMO
Salil Junior

45

Questo ha funzionato per me !!

sudo -u postgres psql

questo dovrebbe funzionare bene fintanto che l'utente attualmente connesso è nel file sudoers.
Abubacker Siddik,

16

Se hai un problema, devi individuare il tuo pg_hba.conf. Il comando è:

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

e successivamente modifica il file di configurazione:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Il prossimo passo è: riavviare l'istanza db:

service postgresql-9.3 restart

In caso di problemi, è necessario impostare nuovamente la password:

ALTER USER db_user with password 'db_password';


16
  1. Vai a questo /etc/postgresql/9.x/main/ e apri il file pg_hba.conf

Nel mio caso:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Sostituisci peer con md5

Quindi questo sarà cambiato in:

Accesso amministrativo al database tramite socket di dominio Unix locale tutti i peer di 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

Questo:

Accesso amministrativo al database tramite socket di dominio Unix locale tutti 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. Quindi riavviare il server PG:

    $> servizio sudo postgresql restart

Di seguito è riportato un elenco di METODI utilizzati per connettersi con 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.

Nota: se non hai ancora creato l'utente postgres. Crealo e ora puoi accedere al server Postgres usando le credenziali dell'utente.

SUGGERIMENTO: se non funziona dopo il riavvio di postgres, chiudere il terminale e riaprirlo.


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

Questo ha risolto il mio problema


3
Non pensavo che sarebbe stato così semplice, ma questo ha funzionato per me con Debian 9
Hayden Thring,

Questo funziona su Ubuntu 19.10
Vithal Reddy il

Grazie, Funziona su Ubuntu 19.10 e psql 12.3
Happy Singh,

10

Ho avuto lo stesso problema.

La soluzione di depa è assolutamente corretta.

Assicurati solo di avere un utente configurato per utilizzare PostgreSQL.

Controlla il file:

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

L'autorizzazione di questo file dovrebbe essere concessa all'utente con cui hai registrato il tuo psql.

Ulteriore. Se sei bravo fino ad ora ..

Aggiornamento secondo le istruzioni di @ depa.

vale a dire

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

e quindi apportare modifiche.


Sto affrontando lo stesso problema. Ma quali autorizzazioni dovrei avere non lo so. Mi potete aiutare. Sto ottenendo l'output per il comando 'ls' è-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

Se si desidera mantenere la configurazione predefinita ma si desidera l'autenticazione md5 con connessione socket per una specifica connessione utente / db, aggiungere una riga "locale" PRIMA della riga "locale tutto / tutto":

# 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

Il "PRIMA" in questa risposta merita una maggiore elaborazione in altre risposte. Si scopre che psql esamina sequenzialmente i file nel file pg_hba.conf come indicato nei documenti: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# TIPO DI DATABASE METODO DI INDIRIZZO UTENTE nome utente locale dbname md5 # <- questa riga non in ordine
Kiry Meas

7

Stavo spostando la directory dei dati su un server clonato e avevo problemi ad accedere come Postgres. Ripristinare la password di postgres in questo modo ha funzionato per me.

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

Le modifiche sopra hanno funzionato per me, dopo aver capito che dovevo riavviare il server Postgres. Per Ubuntu:

sudo /etc/init.d/postgresql restart

6

La modifica del peer METHOD in modo che si fidi di pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | riga 85) risolve il problema. L'aggiunta di md5 richiede una password, quindi se è necessario evitare l'uso di password, utilizzare trust anziché md5 .


6

Utilizzare host=localhostin connessione.

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

5

il comando seguente funziona per me:

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 il

3

Devi solo impostare METHOD per fidarti.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

E ricaricare il server Postgres.

# service postgresql-9.5 reload

Le modifiche in pg_hba.conf non richiedono il server postgres RESTART. basta ricaricare.


3

Molte delle altre risposte riguardano le impostazioni nei vari file di configurazione, e quelle relative pg_hba.confall'applicazione si applicano e sono corrette al 100%. Tuttavia, assicurati di modificare i file di configurazione corretti .

Come altri hanno già detto, le posizioni dei file di configurazione possono essere sovrascritte con varie impostazioni all'interno del file di configurazione principale, oltre a fornire un percorso al file di configurazione principale sulla riga di comando con l' -Dopzione.

È possibile utilizzare il comando seguente durante una sessione psql per mostrare dove vengono letti i file di configurazione (supponendo che sia possibile avviare psql). Questo è solo un passaggio per la risoluzione dei problemi che può aiutare alcune persone:

select * from pg_settings where setting~'pgsql';  

Dovresti anche assicurarti che la home directory per il tuo utente postgres sia dove ti aspetti che sia. Lo dico perché è abbastanza facile trascurarlo a causa del fatto che il tuo prompt visualizzerà ' ~' invece del percorso effettivo della tua home directory, rendendolo non così ovvio. Molte installazioni impostano come default la home directory dell'utente di postgres /var/lib/pgsql.

Se non è impostato come dovrebbe essere, interrompere il servizio postgresql e utilizzare il comando seguente durante l'accesso come root. Assicurati anche che l'utente postgres non abbia effettuato l'accesso a un'altra sessione:

usermod -d /path/pgsql postgres

Infine, assicurati che la tua variabile PGDATA sia impostata correttamente digitando echo $PGDATA, che dovrebbe produrre qualcosa di simile a:

/path/pgsql/data

Se non è impostato o mostra qualcosa di diverso da quello che ti aspetti che sia, esamina i tuoi file di avvio o RC come .profile o .bash.rc - questo varierà notevolmente a seconda del tuo sistema operativo e della tua shell. Dopo aver determinato lo script di avvio corretto per il computer, è possibile inserire quanto segue:

export PGDATA=/path/pgsql/data

Per il mio sistema, l'ho inserito in /etc/profile.d/profile.local.shmodo che fosse accessibile a tutti gli utenti.

Ora dovresti essere in grado di avviare il database come al solito e tutte le impostazioni del tuo percorso psql dovrebbero essere corrette!


3

pg_config serve per le informazioni sulla compilazione, per aiutare le estensioni e i programmi client a compilare e linkare PostgreSQL. Non sa nulla delle istanze PostgreSQL attive sulla macchina, solo i binari.

pg_hba.conf può apparire in molti altri posti a seconda di come è stato installato Pg. Il percorso standard è pg_hba.conf all'interno della directory data_dati del database (che potrebbe essere in / home, / var / lib / pgsql, / var / lib / postgresql / [versione] /, / opt / postgres /, etc etc etc etc) ma utenti e packager possono metterlo dove vogliono. Purtroppo.

L'unico modo valido per trovare pg_hba.conf è chiedere a un'istanza PostgreSQL in esecuzione dove si trova pg_hba.conf o chiedere al sysadmin dove si trova. Non puoi nemmeno fare affidamento sul chiedere dove si trova il datadir e sull'analisi di postgresql.conf perché uno script init potrebbe passare un parametro come -c hba_file = / some / other / path all'avvio di Pg.

Quello che vuoi fare è chiedere a PostgreSQL:

SHOW hba_file;

Questo comando deve essere eseguito su una sessione di superutente, quindi per gli script di shell potresti scrivere qualcosa del tipo:

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

e impostare le variabili d'ambiente PGUSER, PGDATABASE, ecc. per assicurarsi che la connessione sia corretta.

Sì, questo è un po 'un problema a base di gallina e uovo, in quanto se l'utente non riesce a connettersi (diciamo, dopo aver rovinato la modifica di pg_hba.conf) non è possibile trovare pg_hba.conf per risolverlo.

Un'altra opzione è guardare l'output del comando ps e vedere se l'argomento della directory dei dati del postmaster -D è visibile lì, ad es

ps aux  | grep 'postgres *-D'

poiché pg_hba.conf sarà all'interno della directory dei dati (a meno che tu non sia su Debian / Ubuntu o su qualche derivato e usi i loro pacchetti).

Se stai prendendo di mira specificamente i sistemi Ubuntu con PostgreSQL installato dai pacchetti Debian / Ubuntu diventa un po 'più facile. Non hai a che fare con Pg compilato a mano dalla fonte per cui qualcuno ha avviato un datadir nella propria directory home o un'installazione Enterprise PB in / opt, ecc. Puoi chiedere a pg_wrapper, il multi Debian / Ubuntu -version Pg manager, in cui PostgreSQL utilizza il comando pg_lsclusters da pg_wrapper.

Se non riesci a connetterti (Pg non è in esecuzione o devi modificare pg_hba.conf per connetterti) dovrai cercare nel sistema i file pg_hba.conf. Su Mac e Linux farà qualcosa come sudo find / -type f -name pg_hba.conf. Quindi controlla il file PG_VERSION nella stessa directory per assicurarti che sia la versione PostgreSQL giusta se ne hai più di una. (Se pg_hba.conf è in / etc /, ignoralo, è invece il nome della directory principale). Se hai più di una directory di dati per la stessa versione di PostgreSQL dovrai guardare le dimensioni del database, controlla la riga di comando dei postgres in esecuzione da ps per vedere se la sua directory di dati -D argomento corrisponde a dove stai modificando, ecc. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Il mio problema era che non ho digitato alcun server. Ho pensato che fosse un valore predefinito a causa del segnaposto ma quando ho digitato localhost ha funzionato.


2

Se stai cercando di individuare questo file in Cloud 9, puoi farlo

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

Premere Iper modificare / inserire, premere ESC3 volte e digitare :wqsalverà il file ed uscirà


2

Se stai affrontando questo problema con le rotaie e sai che hai già creato quel nome utente con password insieme ai diritti corretti, devi solo inserire quanto segue alla fine del tuo file database.yml.

host: localhost

il file complessivo apparirà come sotto

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

Non è necessario toccare il pg_hba.conffile. Buona codifica


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.