![criptografiasimetricasshhostinger | Embarcadero RAD Studio Delphi C++Builder Blogs criptografia simetrica ssh hostinger](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2021/04/criptografia-simetrica-ssh-hostinger-7448485.jpg?resize=900%2C392&ssl=1)
Un cliente me preguntó recientemente si se puede utilizar FireDAC para conectarse a una base de datos a través de un túnel SSH. La respuesta corta es sí, por supuesto. Pero comprendamos mejor qué es un túnel SSH y cómo se puede lograr fácilmente este objetivo al usar Delphi y FireDAC.
Table of Contents
Túneles SSH
Secure Shell (ssh) es una herramienta estándar incluida en la mayoría de los sistemas operativos de “red”, es decir, Linux, UNIX, MacOS, y ahora también en Windows (hablando de forma nativa). Si ha utilizado PuTTY en algún momento de su vida para conectarse a una interfaz de línea de comandos remota, en general un sistema Linux, SSH fue el protocolo utilizado para eso.
Entonces, la clave aquí para usar FireDAC a través de una interfaz segura SSH es comprender que FireDAC (o cualquier otro marco de acceso a la base de datos) no tiene nada que ver con eso. Lo que necesita es establecer un túnel SSH permanente y luego configurar correctamente la conexión de su base de datos.
Veremos dos formas de establecer un túnel SSH: una usando una herramienta externa (PuTTY) y la segunda codificada directamente en su aplicación.
Servidores SSH
El objetivo de este artículo no es enseñar cómo crear un servidor SSH, pero tuve que crear uno para probar mi solución, así que esto es lo que estoy usando. Básicamente, tengo una máquina virtual Linux que ejecuta una base de datos PostgreSQL (esta es la base de datos a la que el cliente le gustaría conectarse, pero la solución es independiente de la base de datos), y sobre ella instalé e inicié un servidor SSH siguiendo este tutorial:
https://docs.oracle.com/cd/E37670_01/E41138/html/ch25s03.html
Esto es para Oracle Linux (esto es lo que estoy ejecutando debido a otra prueba de concepto que tuve que hacer la semana pasada) pero encontrará tutoriales similares para su versión Linux preferida.
Probando la conexión
Antes de probar la conexión desde FireDAC, es una buena idea probar la conexión usando solo herramientas de línea de comandos que son parte integral de los sistemas operativos, para que tenga una idea de si las cosas están funcionando o no.
Entonces, teniendo tanto el servidor SSH como la instancia de la base de datos (PostgreSQL en mi caso) abiertos y ejecutándose en Linux, podemos intentar una primera conexión desde Windows usando cualquier terminal de cliente SSH. Windows 10 tiene un cliente nativo desde la “Actualización de octubre” de 1809, pero me quedaré con PuTTY ya que esta es una utilidad dominante para los administradores de sistemas.
Estas son mis configuraciones de Putty. En la página Sesión, debe especificar la IP del servidor y el puerto SSH (22 es el predeterminado):
Y en la página de configuración de SSH / Túneles, especifica cómo se creará el túnel:
¿Qué dice esta configuración? Básicamente, para crear un túnel SSH, debe especificar el puerto de origen (cualquier número de puerto disponible / no utilizado que tenga en su sistema) y el puerto / IP de destino (en este caso, la dirección IP del servidor Linux y el puerto donde se encuentra la instancia de PostgreSQL). escucha: el 5432 es el puerto PostgreSQL predeterminado). Por supuesto, la dirección IP de origen será siempre “localhost”, lo que significa que la conexión de su base de datos apuntará a localhost / 63333 y el túnel hará la magia, enviando los comandos al servidor y recibiendo los resultados.
Finalmente, al abrir la conexión PuTTY y proporcionar un usuario y una contraseña de Linux válidos (se recomienda crear un usuario específico solo para el uso de SSH), verá algo similar a esto a continuación. Feo, lo sé. Puede probar algunos comandos de Linux en él, como “ls -l”:
¡Tiempo de codificación!
Con la infraestructura configurada y probada correctamente, configuremos una conexión de base de datos FireDAC y probémosla. Como puede ver a continuación, esta es una conexión FireDAC estándar que usa el controlador PostgreSQL, lo único que no es trivial es el servidor / puerto que apunta al túnel creado a través de PuTTY:
Ahora, normalmente querrá hacer esto “transparente” para su usuario final, lo que significa que no tendrá que configurar PuTTY o cualquier otra tercera herramienta. Para lograr esto, debe considerar una implementación de cliente SSH para Delphi que básicamente creará este túnel para usted pero desde dentro de su aplicación. Hay muchos componentes de terceros disponibles para esto, pero también algunas maravillosas implementaciones de código abierto que puedes encontrar haciendo una búsqueda en GitHub.
Mi elección fue la biblioteca Ssh-Pascal. Es muy completo y fue construido por el padre de PyScript (uno de los mejores IDE de Python de código abierto, completamente hecho en Delphi), por lo que merece un crédito adicional😉
https://github.com/pyscripter/Ssh-Pascal
La implementación se basa en libssh2 , una implementación SSH bien conocida que está presente en muchos lenguajes y marcos. Con respecto a la instalación, es solo cuestión de agregar las fuentes de la biblioteca en su proyecto y usarlas, sin componentes ni dependencias externas. Para implementarlo, libssh2.dll debe estar disponible junto con su ejecutable.
Tu propio túnel SSH
A continuación, tenemos lo que he construido para esta prueba de concepto. Por favor, considere que esto es solo para probar el concepto y no una implementación completa, lo que significa que hay muchas mejoras que se pueden hacer.
Algunos detalles:
- La configuración de la conexión de PostgreSQL es exactamente la misma que la presentada anteriormente
- Los botones Abrir / Cerrar base de datos son responsables de, bueno, abrir y cerrar la conexión a la base de datos.
- El código de túnel de apertura / cierre se puede encontrar a continuación (tenga en cuenta que todos los parámetros están codificados de forma rígida, ya que esto es solo un ejemplo, no lo tome como un ejemplo de una buena práctica de codificación de ninguna manera)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TMainForm.butOpenTunnelClick(Sender: TObject); Var Host: string; UserName: string; Password: string; begin Host := '192.168.56.106'; UserName := 'oracle'; Password := 'oracle'; Session := CreateSession(Host, 22); Session.Connect; if not Session.UserAuthPass(UserName, Password) then begin ShowMessage('Authorization Failure'); Exit; end; SshTunnel := CreateSshTunnel(Session); Thread := TThread.CreateAnonymousThread( procedure begin SshTunnel.ForwardLocalPort(63333, '192.168.56.106', 5432); end); Thread.FreeOnTerminate := True; Thread.Start; end; |
1 2 3 4 5 6 7 8 9 10 |
procedure TMainForm.butCloseTunnelClick(Sender: TObject); begin Thread.Terminate; SshTunnel.Cancel; if not Thread.Finished then begin Thread.WaitFor; Thread.Free; end; end; |
Y finalmente tenemos la aplicación ejecutándose mostrando algunos datos de PostgreSQL. Nuevamente, esto se puede hacer para cualquier base de datos, hasta que alguien me envíe un mensaje diciendo que algo no está funcionando😉
El código fuente completo se puede encontrar aquí en mi GitHub , junto con algunos otros proyectos de demostración.
¡No dude en dejar su comentario, problemas, casos de uso, etc., será muy apreciado!
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition