Tunelamento SSH para evitar a exposição de um console administrativo

Tunelamento SSH para evitar a exposição de um console administrativo

Estou executando o Lucee Server, um mecanismo de servidor de fusão a frio que no meu caso roda no Tomcat, no Apache.

Estou procurando fortalecê-lo de várias maneiras e me deparo com uma pergunta sobre a abordagem de tunelamento SSH descrita aqui:https://docs.lucee.org/guides/deploying-lucee-server-apps/lockdown-guide.html#restricted-access-plus-ssh-tunnelling

O problema é que não acho que a descrição de como fazer esse tunelamento ssh seja precisa ou completa. Passei muito tempo examinando a documentação do SSH e também algumas outras questões do Stack Exchange (https://superuser.com/q/588591/504387,https://superuser.com/q/237977/504387), mas ainda não consegue fazer o tunelamento SSH funcionar conforme descrito nesse guia ou de qualquer outra forma.


Configuração atual, tenho lucee rodando em server.example.com escutando na porta 8888. O Apache rodando no mesmo servidor está escutando na porta 443 e está configurado para fazer proxy de todas as solicitações para 127.0.0.1 na porta 8888 (ou seja, encaminhá-las para lucee) . Mas está configurado para negar solicitações para /lucee conforme descrito na documentação acima.

Isso significa que o console de administração Lucee só pode ser acessado diretamente na porta 8888, não através da porta 443. As regras de firewall (iptables) são definidas para permitir o tráfego de entrada na porta 8888 apenas da rede interna da empresa, para que possamos acessar o console lucee, mas o mundo exterior não pode.

Essepoderiatudo bem, mas eu estava tentando ver se conseguia fazer a abordagem de tunelamento funcionar conforme descrito. Se o tunelamento pudesse funcionar, poderíamos abandonar a regra de permissão do iptables e apenas bloquear a porta 8888 completamente (exceto no loopback), ou apenas reconfigurar o lucee para ligar SOMENTE a 127.0.0.1.


O SSH está em uma porta não padrão em server.example.com, vamos fingir que é 3300.

O que eu quero fazer é executar um comando SSH no meu laptop que irá:

  1. Use minha configuração e chave ssh existente para me conectar a server.example.com (onde o sshd está escutando na porta 3300),
  2. Vincule a qualquer porta no host local do meu laptop, digamos 60001,
  3. DA extremidade remota em server.example.com, conecte-se, por sua vez, a 127.0.0.1:8888 para que o tráfego possa ser passado para lucee.

O resultado final deve ser que eu possa acessarhttp://127.0.0.1:60001/lucee/admin/server.cfmno meu laptop e será recebido pelo lucee rodando em server.example.com e ouvindo a porta 8888 vinculada a 127.0.0.1 nesse servidor.

Como posso fazer isso?

Responder1

Você deve vincular o Lucee Server apenas, localhostpois ele não fornece TLS na porta 8888. Então você tem duas opções para acessar os caminhos administrativos com segurança.

Túnel SSH

Dessh(1):

-L [ bind_address:]port:host:hostport

Especifica que o porthost local (cliente) fornecido deve ser encaminhado para a hostporta fornecida no lado remoto.

Preenchido com os parâmetros da sua pergunta:

ssh -L 60001:127.0.0.1:8888 [email protected] -p 3300

Proxy Apache com controle de acesso adequado

Como o proxy na porta 443é criptografado com TLS, você não precisa necessariamente de proxy SSH, mas pode permitir conexões com os caminhos administrativos das redes da empresa na configuração do Apache.

A documentação está um pouco desatualizada, pois o exemplo usa a sintaxe do Apache 2.2:

<Location /lucee>
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Location>

Mas a documentação do Apache 2.4controle de acessodiz:

As diretivas , e, fornecidas por Allow, Denyestão obsoletas e desaparecerão em uma versão futura. Você deve evitar usá-los e evitar tutoriais desatualizados que recomendem seu uso.Ordermod_access_compat

Digamos que você gostaria de limitar o acesso para /luceepermitir apenas LAN 192.168.22.0/24e IP público 198.51.100.22:

<Location /lucee>
    <RequireAny>
        Require ip 192.168.22.0/24
        Require ip 198.51.100.22
    </RequireAny>
</Location>

informação relacionada