Entendo que, após a instalação, o PostgreSQL não possui senha para seu usuário root do banco de dados (postgres):
postgres=# select usename, passwd is null from pg_shadow;
usename | ?column?
----------+----------
postgres | t
(1 row)
... e é aconselhável configurá-lo com:
alter role postgres password '<<very-secret>>';
(e, em seguida, atualize o pg_hba.conf
arquivo de acordo)
Minha pergunta é: qual é o SQL a ser usado para voltar à situação anterior quando nenhuma senha era necessária para user postgres
.
Em geral, como posso remover o requisito de senha para qualquer função? Não estou perguntando como alterar a senha, mas como remover o requisito de senha ( passwd
coluna nula na tabela pg_shadow
).
Se uma senha é necessária ou não, não tem nada a ver
pg_shadow
e se uma senha está realmente definida para o usuário. Sim, eu sei, isso é estranho.pg_hba.conf
controla o método de autenticação. Se você quiser solicitar uma senha, usemd5
autenticação. Se você deseja permitir o login sem senha para ninguém, usetrust
. Se você quiser exigir o mesmo nome de usuário no sistema operacional que no PostgreSQL, usepeer
(UNIX, apenas para conexões locais) ousspi
(Windows).Se houver uma senha definida, mas
pg_hba.conf
não disser ao PostgreSQL para solicitá-la, a senha será ignorada.Se
pg_hba.conf
disser ao PostgreSQL para pedir uma senha, mas não houver nenhuma definida, todas as tentativas de login falharão, independentemente da senha fornecida.O usuário postgres por padrão não tem senha. Para remover uma senha de usuário (neste caso para o usuário/função postgres):
Também precisamos definir a autenticação para ver
trust
os detalhespg_hba.conf
A partir de 22/11/2020, usando o PostgreSQL 13 no Ubuntu 18, tropecei nas respostas dadas por @lalligood (e @thouliha - enquanto isso excluído), bloqueando o usuário postgres sem senha.
O seguinte assume que o login é feito usando o programa psql (wrapper-) no computador em que o servidor PostgreSQL está sendo executado.
Depois de ler a documentação do PostgreSQL 13.0, capítulo 20 (Autenticação do cliente), eu me perguntei por que mudar as linhas ...127.0.0.1/32.... e ...::1/128... para autenticação confiável. Os documentos dizem claro: a primeira linha em pg_hba.conf que se encaixa é tomada e todas as outras linhas são ignoradas. Portanto, deve ser suficiente usar apenas a primeira linha (padrão)
Esta linha está relacionada a uma conexão de socket (unix-) (do psql) para o servidor PostgreSQL. O "problema" não mencionado é que o programa psql usa por padrão uma conexão TCP (mesmo) para localhost.
Para provar isso, basta comentar as linhas ...127.0.0.1/32.... e ...::1/128... em pg_hba.conf e fazer o servidor PostgreSQL reler as linhas modificadas.
Como fazer, dos documentos:
Você também pode "brutalmente" problema
se um db-restart não importa.
Então, ao tentar se conectar usando o programa psql, aparecerá uma mensagem de erro indicando que o psql tentou se conectar via TCP.
Uma vez usando o psql para conectar via unix-socket a primeira linha em pg_hba.conf funciona e o (super-) usuário postgres pode definir sua senha para null ou qualquer string e ainda conectar sem ser solicitada a senha.
Para conectar via soquete:
ou
e mais adiante na sessão do console basta usar
Vejo:
especialmente para as opções "-h" e "-p".
Citação do meu console, a senha não foi necessária nem solicitada (sys lang é alemão):
Termo aditivo:
@a_horse_with_no_name postou um comentário citando man psql:
Obrigado pela dica, está correta, mas é seguida diretamente pela relativização
Isso deve resultar na necessidade de especificar host ou socket-dir (argumento -h) ao executar o db-server em outra porta que não seja a porta padrão 5432.
Devo confessar que trapaceei em "Citação do meu console" acima, pois "nome do host" não é o nome do host real do meu computador e 5432 não é a porta em que meu PostgreSQL 13 está servindo. Fiz isso por razões de privacidade e simplicidade. Na verdade, eu tenho um PostgreSQL 9.6 rodando na porta 5432 e a versão 13 rodando em outra porta simultaneamente.
Para um teste eu desabilitei as linhas ...127.0.0.1/32.... e ...::1/128... no pg_hba.conf de ambos, 9.6 e 13 para que somente conexões de socket sejam possíveis.
Enfim, seguindo o comentário de @a_horse_with_no_name um simples
deve se conectar via socket ao meu servidor PostgreSQL 9.6. Mas não! Nem quando eu emito
O mesmo resultado se a versão 13 do servidor estiver desabilitada para que apenas um único servidor db (9.6) na porta padrão 5432 esteja em execução.
Nem quando eu tento
com a versão do servidor 13 em execução.
In all that cases psql tries to connect not via socket, but via TCP. Have i overseen something? At least my solution, specifying the socket dir, should work anyway.
On Ubuntu 18.04, providing unix-sockets, it seems that the -h argument and its parameter, specifying port or socket-dir is needed.
By the way, neither the PGHOST nor the PGPORT environment variables were set, but undefined.
If anyone knows better, please comment.
If you do not tell PSQL what user name nor database to use when connecting it uses the system
$USER
to identify the user logging in and attaches to the database with that name. It needs both user and the database to make the connection properly. This is out of section 1.4 of the PostgreSQL documentation.AFAIK if there is no database with that name to connect to it will fail (and it did when I tested it that way). If a database exists with a name that matches
$USER
then it will connect to that database with "psql" and no database specified (again I tested to be sure).