Eu abri um túnel SSH para conectar a um servidor remoto da seguinte forma:
$ ssh -f -N -L 5433:127.0.0.1:5432 username@servername
Este túnel foi precisamente aberto da seguinte forma (como mostrado por ps aux | grep ssh
):
ssh -f -N -L 5433:127.0.0.1:5432 username@servername
Eu tenho um ~/.pg_service.conf
com:
[my-pg-service]
host=127.0.0.1
port=5433
dbname=mydatabase
user=pguser
# just append the .pgpass file here:
[my-pg-service-2]
host=127.0.0.1
port=5433
dbname=mydatabase
user=pguser
passfile=~/.pgpass
Ao executar:
$ psql service=my-pg-service
ele atualmente (e surpreendentemente) se conecta sem pedir a senha do banco de dados! (pode ser armazenado em uma espécie de cache porque eu já o usei antes desse comando?)
Mas ao usá psql service=my-pg-service-2
-lo, na verdade, pede a senha do banco de dados.
Eu esperava que se comportasse de maneira oposta!
meu arquivo ~/.pgpass
( chmod 0600
) se parece com:
#hostname:port:database:username:password
# Remote pg database on server servername when using an SSH tunnel (5433)
127.0.0.1:5433:mydatabase:pguser:8+k3&4d2ihs1=&gp!*y)62xoh+^^z$&*ino!66jj()(yw@o36
Observe que este comando também está solicitando a senha do banco de dados:
$ psql -d postgres://pguser@localhost:5433/mydatabase
Mas este não é:
$ psql -d postgres://[email protected]:5433/mydatabase
(só mudei localhost
para 127.0.0.1
).
E isso ocorre precisamente porque não existe essa linha começando localhost
no .pgpass
arquivo:
localhost:5433:mydatabase:pguser:8+k3&4d2ihs1=&gp!*y)62xoh+^^z$&*ino!66jj()(yw@o36
Se eu adicionar essa linha, psql
conecta sem pedir senha nos dois casos anteriores, mas ainda tenho o problema com o serviço pg, por exemplo, ao especificar passfile=~/.pgpass
pede senha, e quando não, não.
Alguém pode explicar esse comportamento e o que eu fiz de errado?
Isso pode estar vinculado à configuração do lado do servidor que é muito ampla?
Apenas no caso, o banco de dados é encaixado no servidor remoto. Ele usa a imagem oficial do docker postgis ( 13:3.2
) que apresenta essas características padrão:
$ docker run \
--rm \
--name postgis \
-e POSTGRES_DB=postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=changeme \
-d postgis/postgis:13-3.2
$ docker exec -it postgis bash -c "tail -n 21 /var/lib/postgresql/data/pg_hba.conf"
# CAUTION: Configuring the system for local "trust" authentication
# allows any local user to connect as any PostgreSQL user, including
# the database superuser. If you do not trust all your local users,
# use another authentication method.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
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
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all md5
SO: Ubuntu 21.10
PG: 14
Doc:
https://www.postgresql.org/docs/14/libpq-pgservice.html
https://www.postgresql.org/docs/14/libpq-connect.html#LIBPQ-PARAMKEYWORDS
https://www. postgresql.org/docs/14/libpq-pgpass.html
Isso é fácil de explicar.
Se você não especificar
passfile
, a senha será obtida.pgpass
em seu diretório pessoal, portanto, não será solicitada uma senha.Se você especificar
passfile=~/.pgpass
, o PostgreSQL não poderá encontrar o arquivo, porque ele não entende o til (que é um recurso do shell e você não está usando um shell), então ele solicita a senha.O arquivo de serviço não entende o til para representar seu diretório inicial. Ele o toma como um caractere literal no nome do arquivo. Portanto, esse arquivo não existe, você essencialmente desconfigurou esse arquivo. (sem aviso, por algum motivo).