역방향 SSH 튜닝 포트를 제한하는 방법은 무엇입니까?


9

방화벽 뒤에있는 여러 클라이언트의 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 터널에 해당하는 것은 없습니다.

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


1
SELinux 또는 IPTABLES와 같은 시스템 차원의 정책에 의해서만 가능합니다.
Andrew Smith

답변:


6

굵게 표시 하지 않기 때문에 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 서버를 다시 컴파일 할 수 있지만 이것이 얼마나 편안한 지에 달려 있습니다. .


정말 좋습니다. 실제로 -L 옵션 (터널링)에서 동일한 구문을 복사하여 작동시킬 수 있습니다. 감사합니다.
Utku Zihnioglu

3

내 제안은 이것을 위해 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

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


큰 답변 주셔서 감사합니다. SELinux / 사용자 프로파일 구성을 시도합니다. 내 질문에 대한 해결책처럼 들립니다.
Utku Zihnioglu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.