18.11. Conexiones TCP/IP seguras con túneles SSH #

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.

Tip

Existen varias otras aplicaciones que pueden proporcionar túneles seguros utilizando a un procedimiento similar en concepto al que se acaba de describir.