Obtendo erro: A autenticação de pares falhou para o usuário "postgres", ao tentar fazer o pgsql trabalhar com trilhos


738

Estou recebendo o erro:

FATAL: Peer authentication failed for user "postgres"

quando tento fazer o postgres funcionar com o Rails.

Aqui está o meu pg_hba.conf, o meu database.ymle uma cópia do rastreamento completo .

Mudei a autenticação para md5 em pg_hba e tentei coisas diferentes, mas nenhuma parece funcionar.

Também tentei criar um novo usuário e banco de dados de acordo com o Rails 3.2, FATAL: A autenticação de pares falhou para o usuário (PG :: Error)

Mas eles não aparecem no pgadmin ou mesmo quando eu corro sudo -u postgres psql -l.

Alguma idéia de onde estou errado?


1
1): Verifique se você tem um usuário chamado "postgres" criado e com direito no seu banco de dados 2): Verifique se ele tem uma senha 3): Verifique se o seu config / database.yml contém as credenciais de direitos (nome de usuário + senha)
MrYoshiji

2
pares necessidade everyplace e conjunto travessão para md5
Artem.Borysov

13
Veja também esta resposta - a conexão pode falhar, localhostmas é bem-sucedida 127.0.0.1.
precisa saber é o seguinte

9
No meu caso, eu precisava adicionar host: localhosto database.ymlarquivo.
Mihail Velikov

Respostas:


1028

O problema ainda é o seu pg_hba.confarquivo ( /etc/postgresql/9.1/main/pg_hba.conf*).

Está linha:

local   all             postgres                                peer

Deveria estar:

local   all             postgres                                md5

* Se você não conseguir encontrar esse arquivo, a execução locate pg_hba.confdeverá mostrar onde está o arquivo.

Após alterar este arquivo, não se esqueça de reiniciar o servidor PostgreSQL. Se você estiver no Linux, seria sudo service postgresql restart.

Estas são breves descrições de ambas as opções, de acordo com os documentos oficiais do PostgreSQL sobre métodos de autenticação .

Autenticação de mesmo nível

O método de autenticação por pares funciona obtendo o nome de usuário do sistema operacional do cliente a partir do kernel e usando-o como o nome de usuário permitido do banco de dados (com mapeamento opcional de nome de usuário). Este método é suportado apenas em conexões locais.

Autenticação de senha

Os métodos de autenticação baseada em senha são md5 e password. Esses métodos operam de maneira semelhante, exceto pela maneira como a senha é enviada pela conexão, ou seja, com hash MD5 e texto não criptografado, respectivamente.

Se você está preocupado com ataques de "farejamento" de senhas, o md5 é o preferido. Senha simples sempre deve ser evitada, se possível. No entanto, o md5 não pode ser usado com o recurso db_user_namespace. Se a conexão estiver protegida por criptografia SSL, a senha poderá ser usada com segurança (embora a autenticação do certificado SSL possa ser uma escolha melhor se estiver dependendo do uso do SSL).

Exemplo de local para pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Você vai precisar recarregar seu serviço PostgreSQL depois de alterar esta/etc/init.d/postgresql reload
funkotron

78
colocar isso aqui desde que eu sempre esqueço onde este arquivo é/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron Pelo menos na minha instalação do ElementaryOS (Ubuntu), sudo service postgreql restarttambém funciona.
Marnen Laibow-Koser

13
Para responder à minha própria pergunta: autenticação 'peer' significa que o postgres solicita ao sistema operacional seu nome de login e o usa para autenticação; portanto, o usuário no SO e no postgres deve ser o mesmo. 'md5' usa autenticação de senha criptografada.
Dennis

9
Eu entendo a mudança. Mas por que esse não é o comportamento padrão? Existe alguma desvantagem usando o md5?
Victor Marconi

363

Depois de instalar o Postgresql, executei as etapas abaixo.

  1. abra o arquivo pg_hba.confpara o Ubuntu /etc/postgresql/9.x/maine altere esta linha:

    local todos os postgres pares

    para

    local todos os postgres confiam
  2. Reinicie o servidor

    $ sudo service postgresql restart
  3. Entre no psql e defina sua senha

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Por fim, mude pg_hba.confde

    local todos os postgres confiam

    para

    local todos os postgres md5

Após reiniciar o servidor postgresql, você pode acessá-lo com sua própria senha

Detalhes dos métodos de autenticação:

trust - qualquer pessoa que possa se conectar ao servidor está autorizada a acessar o banco de dados

peer - use o nome de usuário do sistema operacional do cliente como nome de usuário do banco de dados para acessá-lo.

md5 - autenticação baseada em senha

para mais informações, consulte aqui


18
alterar o método para "confiar" funcionou para mim. +1 para explicação dos detalhes do método de autenticação.
22414 La-comadreja

4
No OS X homebrew, o padrão é trust, enquanto no Ubuntu, de alguma forma, o padrão é definido como "peer", o que levou a discrepâncias entre minha configuração e a do meu colega. Nós mudamos o dele para MD5, o que não ajudou, então "confiança" é a resposta real aqui (estamos apenas fazendo testes de desenvolvimento). Deve receber mais votos.
XJI

2
você também pode definir everyplace md5 desde o início
Artem.Borysov

2
Desta forma, está funcionando para mim, usando o método md5 primeiro não era.
Sianipard

precisa usar as mesmas senhas? sudo passwd postgres
Peter Krauss

211

Se você se conectar através do host local (127.0.0.1), não deverá enfrentar esse problema específico. Eu não mexeria muito com o pg_hba.conf, mas em vez disso eu ajustaria sua string de conexão:

psql -U someuser -h 127.0.0.1 database

onde someuser é seu usuário com o qual você está se conectando e database é o banco de dados ao qual o usuário tem permissão para se conectar.

Aqui está o que eu faço no Debian para configurar o 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

Aproveitar!


16
Acho que essa é a melhor solução, pois resolve o problema local sem mexer sem mexer na configuração global, como as outras respostas recomendam.
jeteon

1
Eu tive que mudar host: 127.0.0.1de falta para localhost no config / database.yml - é na mesma máquina, então eu não entendo por que
Anthony

Anthony, você está dizendo que sofreu uma falha na conexão até ajustar o host local para 127.0.0.1 no seu database.yml? Sugiro verificar seu arquivo / etc / hosts, se for esse o caso. Caso contrário, pode haver alguma outra estranheza relacionada à resolução do host local.
precisa saber é o seguinte

1
Isso é muito mais elegante quando comparado ao mexer com o método de autenticação local por pares.
Mdh

1
Esta é de longe a melhor solução. IMO
Salil Junior

45

Isso tem funcionado para mim !!

sudo -u postgres psql

isso deve funcionar bem, desde que seu usuário conectado atual esteja no arquivo sudoers.
Abubacker Siddik

16

Se você tiver um problema, precisará localizá-lo pg_hba.conf. O comando é:

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

e depois altere o arquivo de configuração:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

A próxima etapa é: Reiniciando sua instância do db:

service postgresql-9.3 restart

Se você tiver algum problema, precisará definir a senha novamente:

ALTER USER db_user with password 'db_password';


16
  1. Vá para este arquivo /etc/postgresql/9.x/main/ e abra o arquivo pg_hba.conf

No meu caso:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Substitua o par por md5

Portanto, isso será alterado para:

Login administrativo do banco de dados pelo soquete de domínio Unix local, todos os pares do 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

Este:

Login administrativo do banco de dados pelo soquete de domínio Unix local all 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. Em seguida, reinicie o servidor pg:

    $> sudo service postgresql restart

Abaixo está uma lista de MÉTODOS usados ​​para conectar-se ao 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 você não criou seu usuário do postgres ainda. Crie isso e agora você pode acessar o servidor postgres usando as credenciais do usuário.

DICA: Se não funcionar após a reinicialização do postgres, feche o terminal e abra novamente.


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

Isso resolveu meu problema


3
Eu não acho que seria tão simples, mas isso funcionou para mim no debian 9
Hayden Thring

Isso está funcionando no Ubuntu 19.10
Vithal Reddy

Obrigado, está funcionando no Ubuntu 19.10 e psql 12.3
Happy Singh

10

Eu tive o mesmo problema.

A solução da depa está absolutamente correta.

Apenas certifique-se de ter um usuário configurado para usar o PostgreSQL.

Verifique o arquivo:

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

A permissão deste arquivo deve ser dada ao usuário com o qual você registrou seu psql.

Mais longe. Se você é bom até agora ..

Atualize de acordo com as instruções do @ depa.

ie

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

e depois faça as alterações.


Estou enfrentando o mesmo problema. Mas que permissões eu preciso precisar não sei. pode me ajudar. Estou recebendo a saída para o comando 'ls' é #-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
1616

8

Se você deseja manter a configuração padrão, mas deseja autenticação md5 com conexão de soquete para uma conexão específica de usuário / banco de dados, adicione uma linha "local" ANTES da linha "local tudo / tudo":

# 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

O "ANTES" nesta resposta merece mais elaboração em outras respostas. Acontece registros Examina psql no arquivo pg_hba.conf sequencialmente tal como indicado nos docs: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# ADDRESS TYPE DATABASE USUÁRIO método local nome de usuário dbname md5 # <- esta linha não em ordem
Kiry Meas

7

Eu estava movendo o diretório de dados em um servidor clonado e tendo problemas para fazer login como postgres. Redefinir a senha do postgres como esta funcionou para mim.

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

As edições acima funcionaram para mim, depois que eu descobri que precisava reiniciar o servidor postgres depois de fazê-las. Para o ubuntu:

sudo /etc/init.d/postgresql restart

6

Alterar o par METHOD para confiar no pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | line 85) resolve o problema. A adição de md5 solicita uma senha; portanto, se houver um requisito para evitar o uso de senhas, use confiança em vez de md5 .


6

Use host=localhostem conexão.

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

5

o comando abaixo funciona para mim:

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

Você precisa apenas definir METODO para confiar.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

E recarregue o servidor postgres.

# service postgresql-9.5 reload

Alterações no pg_hba.conf não exigem o servidor RESTART postgres. apenas RELOAD.


3

Muitas das outras respostas referem-se às configurações nos vários arquivos de configuração, e as que pertencem a pg_hba.confelas se aplicam e são 100% corretas. No entanto, verifique se você está modificando os arquivos de configuração corretos .

Como outros usuários mencionaram, os locais do arquivo de configuração podem ser substituídos por várias configurações dentro do arquivo de configuração principal, além de fornecer um caminho para o arquivo de configuração principal na linha de comando com a -Dopção

Você pode usar o seguinte comando durante uma sessão do psql para mostrar onde seus arquivos de configuração estão sendo lidos (supondo que você possa iniciar o psql). Esta é apenas uma etapa de solução de problemas que pode ajudar algumas pessoas:

select * from pg_settings where setting~'pgsql';  

Você também deve se certificar de que o diretório inicial do usuário do postgres esteja onde você espera. Digo isso porque é muito fácil ignorar isso, porque o prompt será exibido ' ~' em vez do caminho real do diretório inicial, tornando-o não tão óbvio. Muitas instalações padronizam o diretório inicial do usuário do postgres /var/lib/pgsql.

Se não estiver definido como deveria, pare o serviço postgresql e use o seguinte comando enquanto estiver conectado como root. Verifique também se o usuário do postgres não está conectado a outra sessão:

usermod -d /path/pgsql postgres

Por fim, verifique se sua variável PGDATA está definida corretamente, digitando echo $PGDATA, o que deve gerar algo semelhante a:

/path/pgsql/data

Se não estiver definido ou mostrar algo diferente do que você espera, examine os arquivos de inicialização ou RC, como .profile ou .bash.rc - isso variará bastante, dependendo do sistema operacional e do shell. Depois de determinar o script de inicialização correto para sua máquina, você pode inserir o seguinte:

export PGDATA=/path/pgsql/data

Para o meu sistema, coloquei isso /etc/profile.d/profile.local.shpara que fosse acessível a todos os usuários.

Agora você deve conseguir iniciar o banco de dados normalmente e todas as suas configurações de caminho psql devem estar corretas!


3

O pg_config é para informações de compliação, para ajudar extensões e programas clientes a serem compilados e vinculados ao PostgreSQL. Ele não sabe nada sobre as instâncias ativas do PostgreSQL na máquina, apenas os binários.

O pg_hba.conf pode aparecer em muitos outros lugares, dependendo de como o Pg foi instalado. O local padrão é pg_hba.conf dentro do diretório de dados do banco de dados (que pode estar em / home, / var / lib / pgsql, / var / lib / postgresql / [versão] /, / opt / postgres / etc etc) mas usuários e empacotadores podem colocá-lo onde quiserem. Infelizmente.

As únicas maneiras válidas de encontrar o pg_hba.conf é perguntar a uma instância do PostgreSQL em execução onde está o pg_hba.conf, ou perguntar ao sysadmin onde está. Você não pode nem perguntar onde está o datadir e analisar o postgresql.conf porque um script init pode passar um parâmetro como -c hba_file = / some / other / path ao iniciar o Pg.

O que você quer fazer é perguntar ao PostgreSQL:

SHOW hba_file;

Este comando deve ser executado em uma sessão de superusuário, portanto, para scripts de shell, você pode escrever algo como:

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

e defina as variáveis ​​de ambiente PGUSER, PGDATABASE, etc. para garantir que a conexão esteja correta.

Sim, isso é um problema de galinha e ovo, pois se o usuário não conseguir se conectar (digamos, depois de estragar a edição do pg_hba.conf), você não poderá encontrar o pg_hba.conf para corrigi-lo.

Outra opção é examinar a saída do comando ps e ver se o argumento do diretório de dados postmaster -D está visível lá, por exemplo

ps aux  | grep 'postgres *-D'

desde que o pg_hba.conf esteja dentro do diretório de dados (a menos que você esteja no Debian / Ubuntu ou em algum derivado e use seus pacotes).

Se você está direcionando especificamente sistemas Ubuntu com o PostgreSQL instalado a partir de pacotes Debian / Ubuntu, fica um pouco mais fácil. Você não precisa lidar com a página compilada manualmente a partir da fonte para a qual alguém iniciou um datadir em seu diretório pessoal ou com uma instalação do EnterpriseDB em / opt, etc. Você pode perguntar ao pg_wrapper, o multi-servidor Debian / Ubuntu gerenciador de versões, onde o PostgreSQL está usando o comando pg_lsclusters de pg_wrapper.

Se você não conseguir se conectar (o Pg não está em execução ou precisar editar o pg_hba.conf para se conectar), será necessário procurar no sistema os arquivos pg_hba.conf. No Mac e Linux, algo como o sudo find / -type f -name pg_hba.conf fará. Em seguida, verifique o arquivo PG_VERSION no mesmo diretório para garantir que seja a versão correta do PostgreSQL, se você tiver mais de um. (Se pg_hba.conf estiver em / etc /, ignore isso, é o nome do diretório pai). Se você tiver mais de um diretório de dados para a mesma versão do PostgreSQL, precisará analisar o tamanho do banco de dados, verifique a linha de comando dos postgres em execução do ps para ver se é o diretório de dados - o argumento D corresponde a onde você está editando, etc. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Meu problema foi que eu não digitei nenhum servidor. Eu pensei que é um padrão por causa do espaço reservado, mas quando eu digitei localhost ele funcionou.


2

Se você estiver tentando localizar esse arquivo no Cloud 9, poderá fazer

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

Pressione Ipara editar / inserir, pressione ESC3 vezes e digite :wqirá salvar o arquivo e sair


2

Se você está enfrentando esse problema com rails e sabe que já criou esse nome de usuário com senha, juntamente com os direitos corretos, basta seguir o final do seu arquivo database.yml.

host: localhost

arquivo geral será semelhante abaixo

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

Você não precisa tocar em seu pg_hba.confarquivo. Feliz codificação


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.