역방향 SSH 튜닝 포트를 제한하는 방법은 무엇입니까? 이러한 각 클라이언트 ssh -R는

방화벽 뒤에있는 여러 클라이언트의 SSH 연결을 허용하는 공용 서버가 있습니다.

이러한 각 클라이언트 ssh -R는 포트 80의 웹 서버에서 공용 서버로 명령을 사용하여 역방향 SSH 터널을 만듭니다 .

역방향 SSH 터널의 대상 포트 (클라이언트 측)는 80이고 소스 포트 (공용 서버 측)는 사용자에 따라 다릅니다. 각 사용자에 대한 포트 주소 맵을 유지 보수 할 계획입니다.

예를 들어, 클라이언트 A는 포트 80에서 웹 서버를 포트 8000으로 터널링합니다. 클라이언트 B는 80 내지 8001; 클라이언트 C는 80에서 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

기본적으로 우리가하려고하는 일은 각 사용자를 포트로 바인딩 하고 다른 포트로 터널링 하지 못하게 하는 것입니다.

와 함께 SSH의 정방향 터널링 기능을 ssh -L사용하는 경우 permitopen=host:port구성 을 사용하여 터널링 할 포트를 허용 할 수 있습니다. 그러나 역방향 SSH 터널에 해당하는 것은 없습니다.

사용자 당 역방향 터널링 포트를 제한하는 방법이 있습니까?



답변

굵게 표시 하지 않기 때문에 SSH 클라이언트 측에서 포트 바인딩을 막는 일종의 런타임 거부를 원한다고 가정합니다. 그래서 나는 당신을 위해 소스 코드를 파헤 쳤다.

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);
}

불행히도, 보시다시피 표준 포워드와는 별도로 포트 포워딩을 막는 조건은 많지 않습니다.

mod_owneriptables에서 사용하는 것과 동일한 제안을 제안 하려고했지만 Jeff가 저를 때렸습니다.

가장 깨끗한 솔루션은이 파일을 수정하는 것입니다 (예를 들어, pw->pw_uid사용자 연결의 uid를 가져 와서 올바른 포트에 매핑하는 데 사용할 수 있음) SSH 서버를 다시 컴파일 할 수 있지만 이것이 얼마나 편안한 지에 달려 있습니다. .


답변

내 제안은 이것을 위해 SELinux를 사용하는 것입니다. 포트를 열 수 있도록 사용자 프로필을 구성해야합니다. sshd아무것도 적용하므로 사용자의 프로세스로 전달하는 포트를 열기 전에 사용자의 권한에 공정 포크와 방울에 적용됩니다 sshd. 한 번에 netcat다른 포트를 전달 하는 데 사용할 수 있으므로 모든 사용자 프로세스로 제한해야합니다 . 나중에 적절한 구문을 정렬하려고 시도합니다 (또는 다른 사용자가 편집 할 수 있음).

또는을 사용해보십시오 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

그러나 포트를 열고 다른 사용자를 거부하는 것을 막을 수는 없습니다.


답변