2 pontos por baeba 3 시간 전 | Ainda não há comentários. | Compartilhar no WhatsApp

Visão geral resumida

  • Túneis SSH são uma técnica para acessar com segurança serviços que não podem ser acessados diretamente de fora, ou para expor temporariamente serviços internos ao exterior.
  • O encaminhamento de portas no SSH se divide principalmente em encaminhamento local, encaminhamento remoto, encaminhamento local dinâmico e encaminhamento remoto dinâmico.
  • -L faz o cliente SSH local abrir uma porta, e -R faz o servidor SSH remoto abrir uma porta.
  • Com um Bastion Host, é possível se conectar não só ao próprio servidor SSH, mas também a outros serviços de rede privada que esse servidor consegue acessar.
  • O encaminhamento dinâmico não fixa um destino específico; ele cria um proxy SOCKS para permitir acesso a vários hosts e portas.
  • Para expor o encaminhamento remoto à rede externa, é preciso revisar a configuração GatewayPorts do servidor SSH.

Introdução

Objetivo dos túneis SSH

  • O SSH, além de executar comandos remotos, também oferece a função de túnel para transmitir tráfego de rede de forma criptografada.

  • Sem VPN separada nem programa de proxy dedicado, é possível acessar redes privadas e expor serviços usando apenas o comando padrão do SSH.

  • Casos de uso típicos incluem:

    • acessar serviços internos de uma VPC por meio de um servidor público
    • abrir no navegador do PC do usuário uma porta local de um servidor de desenvolvimento remoto
    • expor temporariamente ao exterior um serviço residencial ou de rede privada
    • conectar a porta de depuração do navegador local a um agente de desenvolvimento remoto
  • Ao entender túneis SSH, é preciso distinguir duas coisas:

    • qual máquina abre uma nova porta e fica aguardando conexões
    • de qual máquina, na prática, o tráfego que passou pelo túnel acessa o destino

Desenvolvimento

O encaminhamento local conecta um serviço remoto ao ambiente local

  • O encaminhamento de porta local conecta um servidor remoto, ou um serviço acessível a partir dele, a uma porta local no PC do usuário.
  • A estrutura básica do comando é a seguinte.
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr  
  • O cliente SSH fica aguardando conexões em local_port no PC do usuário.

  • O tráfego que entra nessa porta é enviado por meio do túnel SSH para remote_addr:remote_port.

  • O acesso ao destino final ocorre da perspectiva da rede onde está o servidor SSH.

  • Casos de uso comuns incluem:

    • conexão com MySQL, PostgreSQL e Redis remotos
    • acesso a aplicações web abertas apenas dentro de uma rede privada
    • acesso a portas de contêineres não expostas na interface externa do servidor

Bastion Host intermedeia o acesso à rede privada

  • remote_addr e sshd_addr, que é o alvo da conexão SSH, não precisam ser a mesma máquina.

  • Se o servidor SSH conseguir acessar outros serviços internos, ele pode ser usado como ponto de intermediação.

  • Esse tipo de servidor intermediário é chamado de Bastion Host ou Jump Host.

  • A estrutura de conexão mais comum é a seguinte:

    • o PC do usuário se conecta por SSH a um Bastion Host público
    • o Bastion Host encaminha o tráfego para serviços internos da VPC aos quais ele tem acesso
  • Isso permite acessar bancos de dados, clusters de busca e APIs internas que não estão expostos publicamente.

O encaminhamento remoto expõe um serviço local no lado remoto

  • O encaminhamento de porta remoto conecta um serviço do PC do usuário ou da rede interna a uma porta em um servidor SSH externo.
  • A estrutura básica do comando é a seguinte.
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr  
  • O servidor SSH remoto abre remote_port e fica aguardando conexões.

  • O tráfego que entra nessa porta é encaminhado pelo túnel SSH para local_addr:local_port no lado do cliente SSH.

  • Casos de uso comuns incluem:

    • expor um servidor de desenvolvimento em execução no notebook para demos externas
    • disponibilizar um serviço de homelab para acesso pela internet
    • oferecer a porta de depuração do navegador local a um ambiente remoto de desenvolvimento

A exposição externa exige configuração de GatewayPorts

  • Na configuração padrão, a porta de encaminhamento remoto pode ficar vinculada apenas ao localhost do servidor SSH.
  • Nesse caso, o serviço pode ser acessado dentro do servidor remoto, mas não de fora.
  • Para permitir acesso via IP público do servidor remoto, é preciso revisar a seguinte configuração em sshd_config.
GatewayPorts yes  
  • Como essa configuração pode expor a porta em interfaces externas, ela deve ser usada junto com firewall e controle de acesso.
  • Expor um serviço de desenvolvimento diretamente à internet pública pode aumentar o risco de acesso não autenticado ou de ataques.

A máquina local pode se tornar um Jump Host da rede privada

  • O destino do encaminhamento remoto não se limita à própria máquina onde o cliente SSH está em execução.

  • Se o PC do usuário conseguir acessar outro servidor da rede doméstica, a porta desse servidor interno também poderá ser exposta por meio do servidor SSH remoto.

  • Nesse caso, o PC do usuário se torna um equipamento intermediário que conecta as duas redes abaixo:

    • a rede doméstica ou rede privada de desenvolvimento
    • o servidor público de gateway SSH
  • Com isso, é possível acessar de fora serviços de um servidor doméstico ou de um servidor interno de desenvolvimento que não estejam conectados diretamente à internet.

O encaminhamento local dinâmico cria um proxy SOCKS local

  • O encaminhamento local comum fixa uma porta local a um único destino.
  • O encaminhamento local dinâmico cria um proxy SOCKS no cliente SSH.
  • A estrutura básica do comando é a seguinte.
ssh -D [local_addr:]local_port [user@]sshd_addr  
  • Um proxy SOCKS é executado na porta especificada do PC do usuário.

  • Aplicações com suporte a SOCKS podem informar, a cada conexão, endereços e portas de destino diferentes.

  • A conexão com o destino real ocorre da perspectiva da rede do servidor SSH remoto.

  • A diferença em relação ao encaminhamento local fixo é que uma única conexão SSH pode acessar vários serviços da rede privada remota.

  • Casos de uso comuns incluem:

    • chamadas a várias APIs internas por meio de um Bastion Host
    • navegação em aplicações web dentro de uma rede privada
    • acesso a vários endpoints de VPC por meio de uma única instância EC2

O encaminhamento remoto dinâmico cria um proxy SOCKS remoto

  • Ao omitir o destino fixo na opção -R, é possível criar um proxy SOCKS no servidor SSH remoto.
  • A estrutura básica do comando é a seguinte.
ssh -R [bind_address:]port [user@]gateway_addr  
  • O servidor de gateway remoto aguarda conexões SOCKS na porta especificada.
  • As requisições que entram no proxy são encaminhadas pelo túnel SSH para o lado do cliente.
  • O destino final é acessado da perspectiva da rede onde está o cliente SSH.
  • Com isso, o servidor remoto pode acessar toda a rede doméstica ou privada que o PC do usuário consegue alcançar.
  • O encaminhamento remoto dinâmico exige OpenSSH 7.6 ou superior no cliente.
  • Para expor o proxy SOCKS remoto em interfaces externas, também é necessário configurar GatewayPorts, assim como no encaminhamento remoto comum.

Opções de execução em segundo plano mantêm apenas o túnel ativo

  • Para manter apenas o encaminhamento de portas, sem executar um comando após a conexão SSH, use a opção -N.
  • Para enviar o túnel para segundo plano, é possível usar a opção -f junto.
  • Exemplos por tipo:
ssh -f -N -L ...  
ssh -f -N -R ...  
ssh -f -N -D ...  
  • Em automações ou ambientes de longa duração, também é preciso definir separadamente como o túnel será encerrado, reconectado e monitorado em caso de falha.

Os comandos se distinguem pelo lado em que a porta é aberta

  • ssh -L faz o cliente SSH local abrir uma nova porta.
  • ssh -R faz o servidor SSH remoto abrir uma nova porta.
  • ssh -D cria um proxy SOCKS no cliente SSH local.
  • ssh -R sem destino cria um proxy SOCKS no servidor SSH remoto.
  • A regra básica para memorizar os comandos é a seguinte.
-L = local:remote  
-R = remote:local  
  • O endereço e a porta à esquerda dos dois-pontos são o novo ponto de escuta que será aberto.
  • local pode significar o próprio cliente SSH ou uma máquina interna acessível por ele.
  • remote pode significar o próprio servidor SSH ou outra máquina interna acessível por ele.

Conclusão

O túnel SSH deve ser escolhido conforme a direção do acesso

  • Para usar um serviço remoto no seu PC, use o encaminhamento local -L.

  • Para expor seu PC ou um serviço interno no lado do servidor remoto, use o encaminhamento remoto -R.

  • Para acessar dinamicamente vários destinos na rede remota, use o encaminhamento local dinâmico -D.

  • Para permitir que todo o lado de rede do cliente seja acessado dinamicamente a partir de um gateway remoto, use o encaminhamento remoto dinâmico -R sem destino.

  • Ao projetar um túnel SSH, os seguintes pontos devem ser verificados primeiro:

    • onde a nova porta precisa ser aberta
    • qual máquina consegue acessar o destino final
    • configurações de GatewayPorts, firewall e permissões de acesso SSH
    • riscos de segurança que podem surgir ao expor algo externamente
  • O principal critério é em qual lado o serviço deve ficar visível e qual máquina realmente consegue alcançar o destino.

Ainda não há comentários.

Ainda não há comentários.