INFRA: Como usar tunnel’s (ssh) para acessar serviços privados – sem dor de cabeça
Introdução
Tunnels ssh são usados como solução em diversos lugares, por diversas outras tecnologias. O dbeaver por exemplo, possibilita o usuário acessar um banco de dados privado através de tunnels.
O SSH (Secure Shell) é um mecanismo seguro de credencial e acesso remoto que utiliza criptografia forte para autenticar usuários e proteger a comunicação entre sistemas. Ou seja, uma vez que temos acesso a um servidor por meio deste protocolo, também teremos acesso a várias outras informações ali dentro.
Problema Exemplo
Agora, sendo um pouco mais específico, o exemplo que veremos neste artigo é o acesso a um banco de dados privado através de tunnels.
Imagine que você está desenvolvendo uma funcionalidade, uma querie, uma automação etc. Você a conclui usando seu ambiente local, porém, ao realizar a ‘entrega’ (deploy) o resultado é um pouco diferente/inesperado do que você havia obtido.
Nesse momento, seria de extrema utilidade replicar, se possível, de forma segura e prática, o ambiente a qual você realizou o deploy.
Solução
# ssh -L <porta_local>:<host>:<porta_host> usuario@servidor
➜ system ssh -L 5433:localhost:5432 [email protected]
[email protected]'s password:
No exemplo acima, vemos uma conexão um pouco parecida com uma conexão comum a um servidor via ssh por terminal.
Depois de digitarmos a senha, nesse exemplo, ele estabelecerá uma conexão frontground e a sessão deste terminal será dedicada ao tunnel. (é possível criar em background também).
O que estamos fazendo é redirecionar o serviço na porta 5432 no host remoto para a porta 5433 em nosso host local. Essa porta, é a porta padrão do postgres, então, agora, temos acesso ao postgres (que até então é um serviço privado) do servidor remoto em nossa máquina local.
Então agora, podemos acessar livremente o serviço:
# laravel/.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5433
DB_DATABASE=seu_banco
DB_USERNAME=seu_usuario
DB_PASSWORD=sua_senha
Observações:
- Use
127.0.0.1(nãolocalhost). Em alguns ambientes,localhostpode tentar socket/IPv6 e causar erro. - O túnel precisa ficar rodando enquanto sua API ou serviço estiver usando o banco.
- Se o túnel cair, o Laravel ou a aplicação que estiver usando vai começar a dar erro de conexão (timeout / connection refused).
- Lembre-se sempre de limpar os
caches/configsdo seu serviço antes e após estabelecer e encerrar a conexão. - Caso esteja usando algo como
Docker, você precisará criar o tunnel no mesmo ambiente em que seus demais serviços estão.