Temos um servidor público que aceita conexões SSH de vários clientes atrás de firewalls.
Cada um desses clientes cria um túnel SSH reverso usando o ssh -R
comando de seus servidores da web na porta 80 para o servidor público.
A porta de destino (no lado do cliente) do túnel SSH reverso é 80 e a porta de origem (no lado do servidor público) depende do usuário. Estamos planejando manter um mapa de endereços de portas para cada usuário.
Por exemplo, o cliente A encapsularia seu servidor da web na porta 80 para a porta 8000; cliente B de 80 a 8001; cliente C de 80 a 8002.
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
Basicamente, o que estamos tentando fazer é vincular cada usuário a uma porta e não permitir que eles façam túnel para outras portas.
Se estivéssemos usando o recurso de encapsulamento direto do SSH ssh -L
, poderíamos permitir que porta fosse encapsulada usando a permitopen=host:port
configuração. No entanto, não há equivalente para o túnel SSH reverso.
Existe uma maneira de restringir as portas de encapsulamento reverso por usuário?
fonte
Respostas:
Como você não permitiu negrito, suponho que você queira algum tipo de rejeição em tempo de execução no lado do cliente SSH que impeça a ligação da porta. Então, eu tive uma escavação do código fonte para você:
serverloop.c:
Infelizmente, como você pode ver, não existem muitas condições que impedem o encaminhamento de portas além das padrão.
Eu estava prestes a recomendar a mesma sugestão para uso
mod_owner
internoiptables
, mas Jeff me superou.Sua solução mais limpa seria apenas modificar esse arquivo (por exemplo, você pode usar
pw->pw_uid
para conectar o usuário e mapeá-lo para a porta correta) e recompilar seu servidor SSH, mas isso dependeria de como você se sinta confortável com isso. .fonte
Minha sugestão é usar o SELinux para isso. Você precisará configurar perfis de usuário que permitam que portas sejam abertas. O
sshd
processo bifurca e cai para os privilégios do usuário antes de abrir uma porta para encaminhar, para que qualquer coisa aplicada aos processos do usuário seja aplicadasshd
. Lembre-se de que você precisará restringir a todos os processos do usuário, pois uma vez pode ser usadonetcat
para encaminhar outra porta. Tentarei resolver a sintaxe adequada para você mais tarde (ou qualquer outro usuário poderá editá-la para mim).Como alternativa, você pode tentar usar
iptables
.Isso não os impedirá de abrir a porta e negar outro usuário, no entanto.
fonte