Recentemente, um cliente me perguntou se o FireDAC pode ser usado para se conectar a um banco de dados por meio de um túnel SSH. A resposta curta é sim, claro. Mas vamos entender melhor o que é um túnel SSH e como esse objetivo pode ser facilmente alcançado ao usar Delphi e FireDAC.
Table of Contents
Túneis SSH
Secure Shell (ssh) é uma ferramenta padrão incluída na maioria dos sistemas operacionais de “rede”, ou seja, Linux, UNIX, MacOS e agora também no Windows (falando nativamente). Se você já usou PuTTY em algum momento de sua vida para se conectar a uma interface de linha de comando remota, em geral um sistema Linux, SSH foi o protocolo usado para isso.
Portanto, a principal coisa aqui para usar FireDAC por meio de uma interface segura SSH é entender que FireDAC (ou qualquer outra estrutura de acesso a banco de dados) não tem nada a ver com isso. O que você precisa é estabelecer um túnel SSH permanente e, em seguida, configurar sua conexão de banco de dados corretamente.
Veremos duas maneiras de estabelecer um túnel SSH: uma usando uma ferramenta externa (PuTTY) e a segunda codificada diretamente em seu aplicativo.
Servidores SSH
O objetivo deste artigo não é ensinar como criar um servidor SSH, mas tive que criar um para testar minha solução, então aqui está o que estou usando. Basicamente, tenho uma VM Linux executando um banco de dados PostgreSQL (este é o banco de dados que o cliente gostaria de conectar, mas a solução é independente do banco de dados), e sobre ele instalei e iniciei um servidor SSH seguindo este tutorial:
https://docs.oracle.com/cd/E37670_01/E41138/html/ch25s03.html
Isso é para Oracle Linux (isso é o que estou executando devido a outra prova de conceito que tive que fazer na semana passada), mas você encontrará tutoriais semelhantes para o seu tipo preferido de Linux.
Testando a conexão
Antes de tentar a conexão do FireDAC, é uma boa ideia provar a conexão usando apenas ferramentas de linha de comando que são parte integrante dos sistemas operacionais, para que você tenha uma ideia se as coisas estão funcionando ou não.
Assim, tendo o servidor SSH e a instância do banco de dados (PostgreSQL no meu caso) abertos e em execução no Linux, podemos tentar uma primeira conexão do Windows usando qualquer terminal cliente SSH. O Windows 10 tem um cliente nativo desde a “Atualização de outubro” de 1809, mas vou ficar com o PuTTY, pois é um utilitário dominante para administradores de sistema.
Estas são minhas configurações de Putty. Na página Sessão, você precisa especificar o IP do servidor e a porta SSH (22 é o padrão):
E na página de configuração SSH / Túneis, você especifica como o túnel será criado:
O que esta configuração está dizendo? Basicamente, para criar um túnel SSH, você deve especificar a porta de origem (qualquer número de porta disponível / não usado que você tenha em seu sistema) e o IP / porta de destino (neste caso o endereço IP do servidor Linux e a porta onde está a instância do PostgreSQL escuta – o 5432 é a porta PostgreSQL padrão). Claro, o endereço IP de origem será sempre “localhost”, o que significa que sua conexão de banco de dados apontará para localhost / 63333 e o túnel fará a mágica, enviando os comandos para o servidor e recebendo de volta os resultados.
Finalmente, abrindo a conexão PuTTY e fornecendo um usuário Linux válido e uma senha (é recomendado criar um usuário específico apenas para o uso SSH), você verá algo semelhante a isto abaixo. Feio, eu sei. Você pode testar alguns comandos do Linux nele, como “ls -l”:
Tempo de codificação!
Com o infra devidamente configurado e testado, vamos configurar uma conexão de banco de dados FireDAC e testá-la. Como você pode ver abaixo, esta é uma conexão FireDAC padrão usando o driver PostgreSQL, a única coisa não trivial é o servidor / porta apontando para o túnel criado via PuTTY:
Agora, normalmente você desejará tornar isso “transparente” para o seu usuário final, o que significa não ter que configurar o PuTTY ou qualquer outra terceira ferramenta. Para conseguir isso, você precisa considerar uma implementação de cliente SSH para Delphi que basicamente criará esse túnel para você, mas de dentro do seu aplicativo. Existem muitos componentes de terceiros disponíveis para isso, mas também algumas implementações de código aberto maravilhosas que você pode encontrar fazendo uma pesquisa no GitHub.
Minha escolha foi a biblioteca Ssh-Pascal. É muito completo e foi construído pelo pai do PyScript (um dos melhores Python IDE de código aberto – totalmente feito em Delphi) – então merece um crédito extra😉
https://github.com/pyscripter/Ssh-Pascal
A implementação é baseada na libssh2 , uma implementação SSH bem conhecida que está presente em muitas linguagens e frameworks. No que diz respeito à instalação, basta adicionar os fontes da biblioteca ao seu projeto e utilizá-la, sem componentes ou dependências externas. Para implantar, o libssh2.dll deve ser disponibilizado junto com o seu executável.
Seu Próprio Túnel SSH
Abaixo, temos o que construí para esta prova de conceito. Por favor, considere que isso é apenas para testar o conceito e não uma implementação completa, o que significa que há muitas melhorias que podem ser feitas.
Alguns detalhes:
- A configuração de conexão do PostgreSQL é exatamente a mesma apresentada anteriormente
- Os botões Abrir / Fechar banco de dados são responsáveis por, bem, abrir e fechar a conexão do banco de dados
- O código do túnel Abrir / Fechar pode ser encontrado abaixo (observe que todos os parâmetros são codificados permanentemente, pois este é apenas um exemplo, por favor, não tome isso como um exemplo de uma boa prática de codificação por qualquer meio)
[crayon-672a3a6db2380105293626/]
[crayon-672a3a6db2392825370756/]
E, finalmente, temos o aplicativo em execução mostrando alguns dados do PostgreSQL. Novamente, isso pode ser feito para qualquer banco de dados – até que alguém me envie uma mensagem dizendo que algo não está funcionando😉
O código-fonte completo pode ser encontrado aqui no meu GitHub , junto com alguns outros projetos de demonstração.
Fique à vontade para deixar seus comentários, questões, casos de uso, etc., será muito apreciado!