Es posible utilizar SSH para cifrar la conexión de red entre los clientes y un servidor PostgreSQL. Si se hace correctamente, esto proporciona una conexión de red adecuadamente segura, incluso para clientes que no son compatibles con SSL.
Primero asegúrate de que un servidor SSH se está
ejecutando correctamente en la misma máquina que el servidor
PostgreSQL y de que puedes iniciar sesión utilizando
ssh como algún usuario; luego puedes establecer un
túnel seguro al servidor remoto. Un túnel seguro escucha en un
puerto local y reenvía todo el tráfico a un puerto en la máquina remota.
El tráfico enviado al puerto remoto puede llegar a su dirección
localhost, o a una dirección de escucha (bind) diferente
si se desea; no aparece como proveniente de tu
máquina local. Este comando crea un túnel seguro desde la máquina del
cliente a la máquina remota foo.com:
ssh -L 63333:localhost:5432 [email protected]
El primer número en el argumento -L, 63333, es el
número de puerto local del túnel; puede ser cualquier puerto sin usar. (IANA
reserva los puertos 49152 a 65535 para uso privado). El nombre o la dirección
IP después de esto es la dirección de escucha remota a la que te estás conectando,
es decir, localhost, que es el valor por defecto. El segundo
número, 5432, es el extremo remoto del túnel, por ejemplo, el número de puerto
que está utilizando tu servidor de bases de datos. Para conectarte al servidor de
bases de datos utilizando este túnel, te conectas al puerto 63333 en la máquina
local:
psql -h localhost -p 63333 postgres
Para el servidor de bases de datos parecerá entonces que eres el
usuario joe en el host foo.com
conectándote a la dirección de escucha localhost, y este
utilizará cualquier procedimiento de autenticación que haya sido configurado para las
conexiones de ese usuario a esa dirección de escucha. Ten en cuenta que el servidor no
pensará que la conexión está cifrada con SSL, ya que de hecho no está
cifrada entre el servidor SSH y el servidor
PostgreSQL. Esto no debería plantear ningún
riesgo de seguridad adicional porque se encuentran en la misma máquina.
Para que la configuración del túnel tenga éxito, debes tener permitido conectarte a través de
ssh como [email protected], tal
como si hubieras intentado utilizar ssh para crear una
sesión de terminal.
También podrías haber configurado el reenvío de puertos como
ssh -L 63333:foo.com:5432 [email protected]
pero entonces el servidor de bases de datos verá la conexión como entrante
en su dirección de escucha foo.com, la cual no está abierta por
la configuración por defecto listen_addresses =
'localhost'. Esto generalmente no es lo que deseas.
Si tienes que hacer un “salto” (hop) al servidor de bases de datos a través de algún host de inicio de sesión, una configuración posible podría verse así:
ssh -L 63333:db.foo.com:5432 [email protected]
Ten en cuenta que de esta manera la conexión
desde shell.foo.com
hacia db.foo.com no estará cifrada por el túnel
SSH.
SSH ofrece bastantes posibilidades de configuración cuando la red
está restringida de diversas maneras. Consulta la documentación de SSH
para obtener más detalles.
Existen varias otras aplicaciones que pueden proporcionar túneles seguros utilizando a un procedimiento similar en concepto al que se acaba de describir.