如何限制反向SSH调整端口?


9

我们有一个公共服务器,它接受来自防火墙后面的多个客户端的SSH连接。

这些客户端中的每一个都使用ssh -R从Web服务器在端口80到我们的公共服务器的命令来创建反向SSH隧道。

反向SSH隧道的目标端口(客户端)为80,源端口(公共服务器端)取决于用户。我们正在计划维护每个用户的端口地址图。

例如,客户端A会将其Web服务器从端口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)。
安德鲁·史密斯

Answers:


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_owner范围内iptables,但杰夫击败我给它。

您最干净的解决方案就是修改该文件(例如,您可以pw->pw_uid用来获取连接的用户的uid,并将其映射到正确的端口)并重新编译SSH服务器,但这取决于您对此是否满意。 。


真的很好 实际上,我可以从-L选项(隧道化)复制相同的语法并使它工作。谢谢。
Utku Zihnioglu 2012年

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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.