Como limitar as portas de tuning reversas do SSH?

9

Temos um servidor público que aceita conexões SSH de vários clientes por trás de firewalls.

Cada um desses clientes cria um túnel SSH reverso usando o comando ssh -R de seus servidores da Web na porta 80 para o nosso 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 porta para cada usuário.

Por exemplo, o cliente A encapsularia seu servidor da Web na porta 80 para nossa 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 é ligar cada usuário com uma porta e não permitir que eles façam o tunelamento para outras portas.

Se estivéssemos usando o recurso de encapsulamento de encaminhamento do SSH com ssh -L , poderíamos permitir que porta fosse encapsulada usando a configuração permitopen=host:port . No entanto, não há equivalente para o túnel SSH reverso.

Existe uma maneira de restringir as portas de tunelamento reverso por usuário?

    
por Utku Zihnioglu 29.06.2012 / 21:24

2 respostas

6

Como você colocou não permitir em 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:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

Infelizmente, como você pode ver, não há muitas condições que parecem impedir o encaminhamento de portas para além das padrão.

Eu estava prestes a recomendar a mesma sugestão para usar mod_owner em iptables , mas Jeff me superou.

Sua solução mais limpa seria apenas modificar esse arquivo (por exemplo, você pode usar pw->pw_uid para obter o uid do usuário conectando-se e mapeá-lo para a porta correta) e recompilar seu servidor SSH, mas isso dependeria como você está confortável com isso.

    
por 29.06.2012 / 23:59
3

Minha sugestão é usar o SELinux para isso. Você terá que configurar os perfis de usuário que permitem que as portas sejam abertas. O sshd processa e descarta os privilégios do usuário antes de abrir uma porta para encaminhamento, portanto, qualquer coisa aplicada aos processos do usuário será imposta em sshd . Lembre-se de que você precisará restringir a todos os processos do usuário, já que uma vez poderia usar netcat para encaminhar outra porta. Vou tentar resolver a sintaxe adequada para você mais tarde (ou qualquer outro usuário pode editá-la para mim).

Como alternativa, você pode tentar usar iptables .

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

Isso não impedirá que eles abram a porta e negem outro usuário, no entanto.

    
por 29.06.2012 / 23:56