Introdução
Uma vantagem significativa de usar o arquivo pgpass é a conveniência que ele oferece ao automatizar ou simplificar conexões frequentes ao PostgreSQL, possibilitando a ligação com um banco de dados sem a necessidade de digitar a senha manualmente todas as vezes. Também é uma forma conveniente de autenticar aplicações, que usam a libpq para se conectarem no PostgreSQL, sem precisar armazenar as senhas dentro da aplicação. A documentação sobre esse recurso pode ser encontrada no site oficial do PostgreSQL, nesta página.
Roteiro:
- O que é o pgpass?
- Configuração e exemplo
O que é o pgpass?
O arquivo pgpass é um arquivo de texto simples que contém uma ou mais linhas, cada uma representando uma entrada de autenticação para o PostgreSQL.
No arquivo pgpass, deve conter as seguintes informações:
- Endereço do servidor PostgreSQL (host)
- Número da porta de conexão
- Usuário do banco
- Senha
Nas três primeiras colunas (endereço, porta e usuário), você pode utilizar um * como coringa para simbolizar que aquela linha se aplica para qualquer valor daquele campo.
Sem a utilização de espaços, essas informações devem ser separadas apenas por “:”, conforme exemplo abaixo:
hostname:port:database:username:password
Esse arquivo também está relacionado com a variável de ambiente PGPASSFILE, que especifica o caminho para o arquivo pgpass. Quando o arquivo “pgpassfile” existir no local padrão, ou no local apontado pela variável de ambiente $PGPASSFILE, o PostgreSQL utilizará esse arquivo como fonte de informações de autenticação, em vez de solicitar explicitamente as credenciais de acesso.
Configuração e exemplo
Para configurarmos o pgpass, primeiramente será necessário ter em mãos as informações citadas anteriormente para inserirmos no arquivo, como o endereço do servidor PostgreSQL que se deseja acessar, o número da porta para conexão, o usuário que será utilizado e sua senha. Além disso, como citado, tanto para configuração em Linux quanto para Windows, é recomendável que seja criado o arquivo no diretório do usuário, para maior segurança, através do controle de permissões e da exclusividade de acesso do usuário em questão.
Também é importante ter em mente que essa é uma alternativa às variáveis de ambiente, sendo considerada mais segura (as variáveis podem ser acessadas por qualquer processo em execução no sistema, o arquivo não) e que não deve ser utilizada em conjunto com elas, pois a chance de dar conflito no acesso ao psql é grande.
Linux / Unix
Os passos são bem simples: criar o arquivo com o nome .pgpass e inserir nele as informações citadas anteriormente.
O arquivo deve ficar no diretório pessoal do usuário (mais conhecido como “diretório home”). Você pode verificar qual é o diretório home olhando o arquivo /etc/passwd, verificando o conteúdo da variável de ambiente $HOME ou simplesmente criando o arquivo com o atalho ~/. Você deve sempre começar o nome do arquivo ‘pgpass‘ com um ponto, isso faz com que ele fique oculto em sistemas Linux/Unix, aumentando um pouco (mas não muito) a segurança do arquivo. Para criar/editar o arquivo, optamos aqui por utilizar o editor de texto nano, que já vai criar e abrir o arquivo para edição de uma só vez:
nano ~/.pgpass
Com o arquivo aberto, vamos inserir as informações conforme o exemplo anterior. A seguir, é possível conferir como o nosso exemplo ficou (com uso de “localhost” por ser um banco local, para teste. Para acesso remoto, seria necessário fornecer o IP do servidor):
localhost:5432:novo_banco:usuario_ex:senha
Após criado, o arquivo precisa ter as seguintes permissões 600, o que significa que apenas o proprietário tem permissão de leitura e escrita, e nenhum outro usuário tem alguma permissão, aumentando, assim, o nível de segurança. Para que isso seja garantido, podemos rodar o seguinte comando:
$ chmod 600 ~/.pgpass
$ ls -lha ~/.pgpass
-rw-------. 1 postgres postgres 43 Apr 5 10:46 .pgpass
Agora, para usarmos o arquivo para acessar o psql sem a necessidade de fornecer senha, podemos fazer da seguinte forma:
$ psql -h localhost -p 5432 -d novo_banco -U usuario_ex
psql (16.2 (Debian 16.2-1.pgdg120+2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
novo_banco=>
É possível observar o login automático sem a solicitação de senha do usuário em questão.
Também é permitido ter diversos usuários e senhas no .pgpass, sendo necessário apenas adicionar uma entrada em cada linha. Desse modo, quando tentar se conectar ao PostgreSQL, o utilitário psql irá verificar todas as entradas no arquivo até encontrar uma que corresponda às informações de conexão fornecidas (parâmetro -h para informar o endereço, -p da porta, -d do banco e -U do usuário). Com vários usuários, o arquivo .pgpass ficaria conforme exemplo abaixo:
localhost:5432:banco1:usuario1:senha1
192.0.2.1:5432:banco2:usuario2:senha2
172.16.0.1:5432:banco3:usuario3:senha3
Windows 11
Em sistemas Windows, podemos começar abrindo o Bloco de Notas e criando esse arquivo, que deve ser salvo na pasta de dados de aplicações do usuário, sendo essa uma pasta oculta, que tem como uma forma de acesso o seguinte atalho: “Windows + R” > digite “%APPDATA%” > clique no botão Enter. A diferença aqui é o nome do arquivo. De acordo com a documentação oficial, ele deve ser chamado de pgpass.conf, no caminho C:\Users\<usuario>\AppData\Roaming\postgresql (se não houver a pasta “postgresql” ao abrir AppData via atalho, basta criá-la).
Criamos nosso arquivo e ele ficou assim:
Para restringir as permissões desse arquivo, devemos acessar o Explorador de Arquivos e clicar com o botão direito no pgpass.conf para, depois, selecionar “Propriedades” e a aba “Segurança”. Lá é possível editar as permissões para outros usuários e também para grupos.
Agora, já podemos fazer o acesso ao psql usando a senha do nosso arquivo, da mesma forma demonstrada para Debian:
> psql -h localhost -p 5432 -d banco_ex -U usuario_ex
psql (16.2)
Digite "help" para obter ajuda.
Conclusão
O pgpass.conf é uma maneira relativamente segura de proteger suas senhas. Claro, se qualquer pessoa tiver acesso local à máquina, acesso com usuário privilegiado (como root no Linux/Unix ou Administrator no Windows) ou acesso ao usuário em questão, ela também vai conseguir de alguma forma visualizar esse arquivo e descobrir quais são as suas senhas. Você pode utilizar a variável de ambiente $PGPASSFILE e colocar o arquivo num local diferente do padrão para dificultar um pouco mais a vida de uma pessoa mal-intencionada, mas isso não vai impedi-la de qualquer modo.
O pgpass.conf será uma opção segura se, e apenas se, o controle de acesso ao ambiente onde ele está localizado for seguro também. Recomendamos fortemente que isso aconteça, particularmente se você for armazenar senhas de ambientes de produção ou de ambientes de homologação com dados de produção. Se isso não for possível, é melhor pensar em ferramentas externas para proteger as senhas de acesso ao PostgreSQL.